2017-05-09 48 views
1

シンプルなジェネレータ関数:私のPythonジェネレータ関数は本当に怠惰ですか?私が作った

def myfunc(text): 
    for i in text[::-1]: 
     yield(i) 

for i in myfunc("anytext"): 
    print(i) 

はジェネレータ関数の内部text[::-1]が最初に評価されるだろうか、それが(ジェネレータ機能から期待される)遅延評価されるのですか?

+3

これは、文字列のスライスを行うときと全く同じに評価されます。 'str [...]'は新しい文字列を返し、それをループします。 – deceze

答えて

2

テキストは反復処理される前に元に戻されます。他の方法ではありません。 forループは反復するために逆のテキストが必要です。

本当に怠け者にするには、インデックスを使用する必要があります。

def myfunc(text): 
    for i in range(len(text) - 1, -1, -1): 
     yield text[i] 

のPython 2では、rangeの代わりにxrangeを使用しています。

もちろん、組み込み関数reversed()を基本的に再実装しました。

+0

"それ以外の方法はできません; forループは反復するためには逆のテキストが必要です。"不幸な言葉遣い?あなたはまだforループを使用しています。 – viraptor

+0

@viraptor 'text [:: - 1]'を評価する必要があります。そして結果から作成されたイテレータです。そうすれば、 "逆のテキスト"を生成する必要があります。ループを開始することができます( 'str .__ getitem__'がイテレータを返した場合はもちろん怠け者になります) – donkopotamus

+1

文字列ではなくイテレータを返すことができます。方法;それは明らかにそうではありません。 – deceze

関連する問題