私は、野生で遭遇する一般的なジェネレータイディオムに頭を悩ませようとしています。私は長い間それに気づいていました(そしてそれを使用していました)が、それを疑問に思ったことは一度もありませんでした. toy 関数を使用したイディオムの例:
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
)
ちょっとばかげた質問だと思いますが、答えはすぐにはわかりません。「構文がそのように機能するため」の単なるケースですか、それとも何か不足していますか?