2016-01-31 67 views
2

我想把我的頭繞在我在野外遇到的一個常見的發電機成語上。我已經注意到了它(並且使用了它)很長一段時間,但從未困擾過它。爲什麼下面的Python生成器表達式有效?

def contains_vowels(string): 
    vowels = set('aeiou') 

    if any((char in vowels) for char in string): 
     return True 

    return False 

爲什麼預期any((char in vowels) for char in string)工作:使用玩具功能的成語的例子嗎?我知道(char in vowels)是一個生成器表達式,但例如(char in vowels) for char in string不是函數調用之外的有效生成器。

換句話說,考慮到上面的代碼是有效的,爲什麼下面的代碼工作:

for b in (char in vowels) for char in string: 
     print b 

(顯然,使得整個表達式生成器確實按預期方式工作:

for b in (char in vowels for char in string): 
     print b 

我得到,這是一個有點傻問題b的我的答案並不是直接的。這僅僅是「因爲這是語法的工作方式」或者是我缺少的東西?

+0

'(char in vowels)'不是生成器表達式。 'seq'中的表達式是一個生成器表達式。 「x in foo」正在檢查遏制。 –

+0

我得到'x在foo'檢查遏制。我總是認爲'()'表示一個生成器,因爲這是我使用這種模式的唯一上下文,儘管你說的是合理的。所以我猜想,你可以在函數調用中定義沒有圓括號的生成器表達式,但是,例如,我知道這在具有多個參數的函數調用中不起作用。所以,更詳細的答案會很有用。 – MCor

+0

你也可以'返回任何(字符串中的元音字符中的字符)',你不需要一個if/else –

回答

3

我 拿到(char in vowels)是發電機的表情,

其實,事實並非如此。在這種情況下括號是完全多餘的,因爲只有一個運算符in。當你有更多的操作符時,括號用於設置操作順序。 (1+2)*3 == 9

(char in vowels) for char in string不是 函數調用外部的有效生成。

實際上是這樣。在函數調用中,當生成器是唯一參數時,可以跳過額外的括號。所以下面兩行實際上是相同的。

any(char in vowels for char in string) 
any((char in vowels for char in string)) 

在函數調用之外,生成器必須有括號。

(char in vowels for char in string) 
+0

因此,單參數函數調用中的生成器表達式只是一個特例。我想我一直都知道這個問題的答案,但是覺得隱含的生成器語法與我期望的不一致。 – MCor

+1

是的,這是一個特例。 –

+2

如果沒有[使用python進行函數式編程](https://docs.python.org/3/howto/functional.html),那麼在文檔中可能有點難以找到 - 搜索*函數的圓括號通話也算*。 – JGreenwell

相關問題