generator.next()表示は、Python 3.0でますか?
-
21-08-2019 - |
質問
Iは、例えば、シリーズを生成する発電機を有します
def triangleNums():
'''generate series of triangle numbers'''
tn = 0
counter = 1
while(True):
tn = tn + counter
yield tn
counter = counter + 1
のpython 2.6で私は、次の呼び出しを行うことができています
g = triangleNums() # get the generator
g.next() # get next val
しかし3.0に私は次のエラーを取得していたコードの同じ2本のラインを実行している場合:
AttributeError: 'generator' object has no attribute 'next'
しかし、ループイテレータの構文は3.0で動作します。
for n in triangleNums():
if not exitCond:
doSomething...
私は3.0のためにこの動作の違いを説明し、まだ何かを見つけることができていませんでした。
解決
正しい、g.next()
はg.__next__()
に名前が変更されました。この理由の整合性である:__init__()
と__del__
のような特別な方法は全て、二重のアンダースコア(または現在の方言で「dunder」)を持っている、と.next()
はそのルールにいくつかの例外の一つでした。これは、Python 3.0で修正されました。 [*]
しかし、その代わりパオロが言うように、g.__next__()
を呼び出す、next(g)
を使用します。
[*]この修正を得ている他の特別な属性があります。 func_name
、今など、__name__
されます。
他のヒント
あなたのコードは次のように2to3は 6つののライブラリを使用し、Python2とのpython3の下で実行する必要がある場合:
import six
six.next(g) # on PY2K: 'g.next()' and onPY3K: 'next(g)'
所属していません StackOverflow