1
>>> gen = iter(['a','b','c','d'])
>>> for i, line in enumerate(gen):
...     print str(i) + ', ' + line
...     if (i == 1):
...         print 'saw 1'
...         print 'next: ' + gen.next()
...
0, a
1, b
saw 1
next: c
2, d

ご覧のとおり、私は理解として見たいと思います3, d(私が保持したい不変式、もしそうなら: 他にどのような理由があるのでしょうenumerateか?) はi、 のインデックスに対応しますline。はそれnext()をダンプします。

悲しいことに、この試みは失敗しi、for ループがそうあるべきだと考えるものに設定されます。

>>> gen = iter(['a','b','c','d'])
>>> for i, line in enumerate(gen):
...     print str(i) + ', ' + line
...     if (i == 1):
...         print 'saw 1'
...         print 'next: ' + gen.next()
...         i = i + 1
...
0, a
1, b
saw 1
next: c
2, d

答えは何ですか?インデックスenumerateを手動で追跡するのをやめますか? この種の制御フローに対応できる高レベルのプログラミングがあることを期待していました。

私はファイルを解析していて、次の行が存在する場合はその内容を読み取る必要がある場合があります (したがってnext()ジェネレーターを呼び出します) が、結果としてループ制御フローを処理する必要があります。

私はすでにそれを行う方法を知っているので、最初にジェネレーターを読んで完全に評価することによってこれを行う回答は受け入れられません (ただし、そのような回答を自由に投稿してください。賛成します)。

4

2 に答える 2

5

enumerateイテレータは最後まで使用できます。

>>> gen = enumerate(['a','b','c','d'])
>>> for i, line in gen:
...     print str(i) + ', ' + line
...     if (i == 1):
...         print 'saw 1'
...         print 'next: ' + gen.next()[1]
...
0, a
1, b
saw 1
next: c
3, d

印刷時にタプルの 2 番目の要素にアクセスするためのインデックスに注意してくださいnext。この方法で明示的な呼び出しを捨てることもできますiteriter動作が変更された場合に明示的な呼び出しが必要な場合はenumerate、それを外側に配置する必要があります(全体のポイントは、イテレータを扱っていることを確認することであるため)。

>>> gen = iter(enumerate(['a','b','c','d']))
于 2013-06-05T04:45:53.637 に答える
0

次のようなことを試してください:

gen = iter(['a','b','c','d'])
i = 0
for line in gen:
    print str(i) + ', ' + line
    i += 1
    if (i == 1):
        print 'saw 1'
        print 'next: ' + gen.next()
        i += 1

イテレータをリストに変換できる場合、ジェネレータの場所と対応するインデックスを追跡する必要がなく、インデックスを 0 から len-1 まで反復処理してインデックスをインクリメントするだけでよいため、ロジックをより単純にすることができます。へ (不一致のバグにつながる可能性があります)。

于 2013-06-05T04:43:44.363 に答える