Python允許您指定多於一個的可變一次,這樣的:
a, b = 1, 2
這個工作原理是通過在右手側,以處理所述分配a, b
的左手側爲元組,並且分配每個元件在元組1, 2
的方式它。
由於元組可以有一個元素,以下也適用:
a, = 1,
多重分配的右手邊不必是一個元組。可迭代的都行,只要每邊元素的數量是一樣的:
a, b, c = "three little pigs".split()
如果要素的數量不匹配:
a, b, c = "oh", "no"
...你會得到一個ValueError
:
ValueError: not enough values to unpack (expected 3, got 2)
把上述所有的一起,那麼,你的函數:
def find_project(project_name):
projects = get_projects()
try:
match, = (proj for proj in projects if proj["name"].strip() == project_name)
return match
except ValueError:
return None
...迭代的generator expression
(proj for proj in projects if proj["name"].strip() == project_name)
...如果結果有一個元素,指定該元素match
。如果不是,則ValueError
被提出(並且被except
子句捕獲),不發生任何分配,並且返回None
。
有兩點需要注意:
逗號,
容易讀代碼的時候錯過。另一種方法是使用左側的列表語法:
[match] = (proj for proj in projects if proj["name"].strip() == project_name)
...它具有相同的效果。
當右手邊是一個發電機表達(或一些其它種iterator),則可以使用next()
具有默認值,而不是:
def find_project(project_name):
projects = get_projects()
it = (proj for proj in projects if proj["name"].strip() == project_name)
return next(it, None)
...哪個更短並且更具有可讀性。