1. ホーム
  2. パイソン

[解決済み】Python 3でgenerator.next()は表示されますか?

2022-04-16 02:38:05

質問

例えば、シリーズを生成するジェネレータがあるのですが。

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 でのこの動作の違いを説明するものはまだ見つけられませんでした。

解決方法は?

g.next() にリネームされました。 g.__next__() . この理由は一貫性です。 __init__()__del__() はすべてダブルアンダースコア(現在の用語では "dunder")で、そして .next() は、その数少ない例外の一つでした。これはPython 3.0で修正されました。[*]

しかし、その代わりに g.__next__() を使用します。 next(g) .

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