2

私は、野生で遭遇する一般的なジェネレータイディオムに頭を悩ませようとしています。私は長い間それに気づいていました(そしてそれを使用していました)が、それを疑問に思ったことは一度もありませんでした. 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

)

ちょっとばかげた質問だと思いますが、答えはすぐにはわかりません。「構文がそのように機能するため」の単なるケースですか、それとも何か不足していますか?

4

1 に答える 1