2

我不是很熟悉Python語法,並想知道如果任何人都可以將變數match正在對這個函數的for表達式中發現一個字符串向我解釋:這個任務中的逗號是什麼?

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 

回答

5

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

有兩點需要注意:

  1. 逗號,容易讀代碼的時候錯過。另一種方法是使用左側的列表語法:

    [match] = (proj for proj in projects if proj["name"].strip() == project_name) 
    

    ...它具有相同的效果。

  2. 當右手邊是一個發電機表達(或一些其它種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) 
    

    ...哪個更短並且更具有可讀性。