私はこのような書き込みものに苦しんでいます:ジェネレータを受け入れられないのはなぜですか?
ジェネレータが吸うlist(reversed(list(el.iterancestors()))) + [1,2,3]
、私はリストにそれらを消費することを余儀なくしていますので。
これを簡略化する方法はありますか?私はreversed()
はイテレータを受け入れるべきだと私は間違っていると思いますか?
私はこのような書き込みものに苦しんでいます:ジェネレータを受け入れられないのはなぜですか?
ジェネレータが吸うlist(reversed(list(el.iterancestors()))) + [1,2,3]
、私はリストにそれらを消費することを余儀なくしていますので。
これを簡略化する方法はありますか?私はreversed()
はイテレータを受け入れるべきだと私は間違っていると思いますか?
ジェネレータには最後のアイテムがあることが保証されていないため、元に戻すことはできません。次の結果はどうなるでしょうか? reversed()
のポイントはメモリ効率的であることを
from itertools import permutations
reversed(permutations('abcdefghijklmnopqrstuvwxyz', 10)) # 19,275,223,968,000 tuples
注:
from itertools import cycle
reversed(cycle('abc'))
誤ってすべてのあなたの記憶を食べることの危険性もあります。シーケンスの場合、インデックス(リスト、文字列、タプル、範囲)を持つオブジェクトのように、reversed()
は内部インデックスを使用するイテレータを生成します。内部インデックスはlen(inputobject) - 1
で始まり、反復処理を行うときには0
に進みます。そのように入力シーケンスのコピーを作成する必要はありませんが、そのトリックはすでに長さがあり、ランダムアクセスをサポートしているものに対してのみ機能します。
あなたのケースのために私はとにかくreversed()
使用しないと思います。あなたは、出力ではなく、発電機などのリストをしたいので、代わりにリストを逆にスライスを使用します。新しいリストオブジェクトを構築しているよう
list(el.iterancestors())[::-1] + [1, 2, 3]
メモリ効率が、ここでは問題ではありません。