282

私はシリーズを生成するジェネレーターを持っています、例えば:

def triangle_nums():
    '''Generates a series of triangle numbers'''
    tn = 0
    counter = 1
    while True:
        tn += counter
        yield tn
        counter += + 1

Python 2では、次の呼び出しを行うことができます。

g = triangle_nums()  # get the generator
g.next()             # get the next value

ただし、Python 3では、同じ2行のコードを実行すると、次のエラーが発生します。

AttributeError: 'generator' object has no attribute 'next'

ただし、ループイテレータ構文はPython3で機能します

for n in triangle_nums():
    if not exit_cond:
       do_something()...

Python3の動作のこの違いを説明するものはまだ見つかりませんでした。

4

3 に答える 3

463

g.next()に名前が変更されましたg.__next__()。この理由は一貫性です。のような特別なメソッドは__init__()すべて__del__()二重アンダースコア(または現在の言葉では「ダンダー」)を持ち、.next()そのルールの数少ない例外の1つでした。これはPython3.0で修正されました。[*]

ただし、を呼び出す代わりにg.__next__()、を使用してnext(g)ください。

[*]この修正を取得した他の特別な属性があります。func_name、現在__name__などです

于 2009-07-02T10:15:53.480 に答える
155

試す:

next(g)

これに関しては、2と3の構文の違いを示すこのきちんとした表を確認してください。

于 2009-07-02T09:31:19.030 に答える
12

コードをPython2およびPython3で実行する必要がある場合は、次のように2to36ライブラリを使用します

import six

six.next(g)  # on PY2K: 'g.next()' and onPY3K: 'next(g)'
于 2015-09-17T17:09:59.217 に答える