generator.next() は Python 3 で表示されますか? 質問する

generator.next() は Python 3 で表示されますか? 質問する

たとえば、次のようなシリーズを生成するジェネレータがあります。

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'

しかし、ループイテレータ構文はPython 3では機能します

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

Python 3 でのこの動作の違いを説明するものはまだ見つけられていません。

ベストアンサー1

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

しかし、 を呼び出す代わりにg.__next__()next(g)

[*] この修正を受けた他の特別な属性があります。func_name、は現在__name__、、

おすすめ記事