我想把我的頭繞在我在野外遇到的一個常見的發電機成語上。我已經注意到了它(並且使用了它)很長一段時間,但從未困擾過它。爲什麼下面的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的我的答案並不是直接的。這僅僅是「因爲這是語法的工作方式」或者是我缺少的東西?
'(char in vowels)'不是生成器表達式。 'seq'中的表達式是一個生成器表達式。 「x in foo」正在檢查遏制。 –
我得到'x在foo'檢查遏制。我總是認爲'()'表示一個生成器,因爲這是我使用這種模式的唯一上下文,儘管你說的是合理的。所以我猜想,你可以在函數調用中定義沒有圓括號的生成器表達式,但是,例如,我知道這在具有多個參數的函數調用中不起作用。所以,更詳細的答案會很有用。 – MCor
你也可以'返回任何(字符串中的元音字符中的字符)',你不需要一個if/else –