多くの単語を含む文字列を与えられた場合、単語の順序を逆にしたいと思います。入力がThanks for all the fish
の場合、出力はfish the all for Thanks
になります。Pythonでのyieldの問題|ヘルパー関数の使用
私はジェネレータを使用してこれを解決しようとしています。新しいリストの作成を避けるためです。 私は、次の解決策を考え出した:
from itertools import islice
def foo(s, begin, end):
for elem in islice(s, begin, end):
yield elem
def baz(s):
i = len(s)
j = len(s)
while True:
i -= 1
if i == -1:
foo(s, i+1, j)
break
if s[i] == ' ':
foo(s, i+1, j)
yield ' '
j = i
s = "Thanks for all the fish"
g = baz(s)
for x in g: print(x, end='')
しかし、このコードの出力は" "
(スペースのみの文字列)です。一方
私は直接の代わりにそれらをもたらすの要素をprint
た場合、それが動作します:
from itertools import islice
def foo(s, begin, end):
for elem in islice(s, begin, end):
print(elem, end='')
def baz(s):
i = len(s)
j = len(s)
while True:
i -= 1
if i == -1:
foo(s, i+1, j)
break
if s[i] == ' ':
foo(s, i+1, j)
print(' ', end='')
j = i
s = "Thanks for all the fish"
g = baz(s)
これは動作し、出力fish the all for Thanks
として持っています。しかし、私はそれを印刷することはできません、私は正しい発電機を持ってほしいです。
from itertools import islice
def baz(s):
i = len(s)
j = len(s)
while True:
i -= 1
if i == -1:
for elem in islice(s, i+1, j):
yield elem
break
if s[i] == ' ':
for elem in islice(s, i+1, j):
yield elem
yield ' '
j = i
s = "Thanks for all the fish"
g = baz(s)
for x in g: print(x, end='')
これの出力はfish the all for Thanks
次のとおりです。
は最後に、私はfoo
への呼び出しを避けるならば、それはまた、働くことを発見しました。 このバージョンは私に欲しいもの(正確なジェネレータ)を提供しますが、その機能の中にコードを繰り返しています。
yield exchangeのスレッド交換スレッドを赤字にしていますが、間違っている可能性があります。 私が理解したことは、次のyield文が見つかるか、関数が終了するまでジェネレータが実行されるということです。 この問題は、これが正確に動作する方法ではないと私に思い出させますが、それ以外は私は無知です。
最初のコードスニペットのようにヘルパー関数を使用してこれを解決するにはどうすればよいですか?
実際には、 'foo'は何もしません。あなたはislice(s、i + 1、j)からちょうど 'yieldできます。 – trentcl
両方のおかげです。 @trentcl 'foo'は' no-op'とは何を意味しますか? –
@FranciscoFigari 'foo'関数は必要ありません。このコメントに基づいて、私は 'foo'なしで' islice'を直接使用した2番目の例を追加しました。 – MSeifert