シンプルなジェネレータ関数:私のPythonジェネレータ関数は本当に怠惰ですか?私が作った
def myfunc(text):
for i in text[::-1]:
yield(i)
for i in myfunc("anytext"):
print(i)
はジェネレータ関数の内部text[::-1]
が最初に評価されるだろうか、それが(ジェネレータ機能から期待される)遅延評価されるのですか?
シンプルなジェネレータ関数:私のPythonジェネレータ関数は本当に怠惰ですか?私が作った
def myfunc(text):
for i in text[::-1]:
yield(i)
for i in myfunc("anytext"):
print(i)
はジェネレータ関数の内部text[::-1]
が最初に評価されるだろうか、それが(ジェネレータ機能から期待される)遅延評価されるのですか?
テキストは反復処理される前に元に戻されます。他の方法ではありません。 for
ループは反復するために逆のテキストが必要です。
本当に怠け者にするには、インデックスを使用する必要があります。
def myfunc(text):
for i in range(len(text) - 1, -1, -1):
yield text[i]
のPython 2では、range
の代わりにxrange
を使用しています。
もちろん、組み込み関数reversed()
を基本的に再実装しました。
"それ以外の方法はできません; forループは反復するためには逆のテキストが必要です。"不幸な言葉遣い?あなたはまだforループを使用しています。 – viraptor
@viraptor 'text [:: - 1]'を評価する必要があります。そして結果から作成されたイテレータです。そうすれば、 "逆のテキスト"を生成する必要があります。ループを開始することができます( 'str .__ getitem__'がイテレータを返した場合はもちろん怠け者になります) – donkopotamus
文字列ではなくイテレータを返すことができます。方法;それは明らかにそうではありません。 – deceze
これは、文字列のスライスを行うときと全く同じに評価されます。 'str [...]'は新しい文字列を返し、それをループします。 – deceze