Frage

Ich habe einen Generator, der eine Reihe erzeugt, zum Beispiel:

def triangleNums():
    '''generate series of triangle numbers'''
    tn = 0
    counter = 1
    while(True):
        tn = tn + counter
        yield tn
        counter = counter + 1

in Python 2.6 kann ich die folgenden Anrufe vor:

g = triangleNums() # get the generator
g.next()           # get next val

jedoch in 3.0, wenn ich die gleichen zwei Zeilen Code ausführen ich die folgende Fehlermeldung erhalten:

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

, aber die Schleife Iterator Syntax in 3.0 funktioniert

for n in triangleNums():
    if not exitCond:
       doSomething...

Ich habe nicht in der Lage, etwas zu finden noch, dass dieser Unterschied im Verhalten für 3.0 erklärt.

War es hilfreich?

Lösung

Richtig, g.next() wurde g.__next__() umbenannt. Der Grund hierfür ist die Konsistenz: Spezielle Methoden wie __init__() und __del__ alle doppelten Unterstrichen (oder „dunder“ in der aktuellen Mundart) und .next() war eine der wenigen Ausnahmen von dieser Regel. Dies wurde in Python 3.0 behoben. [*]

Doch statt g.__next__() zu nennen, wie Paolo sagt, Verwendung next(g).

[*] Es gibt andere spezielle Attribute, die dieses Update bekommen haben; func_name wird __name__ jetzt, etc.

Andere Tipps

Versuchen:

next(g)

Sehen Sie sich diese ordentlich Tabelle , dass die Unterschiede in der Syntax zwischen 2 und 3, wenn es dazu kommt.

Wenn Ihr Code muss unter Python2 und Python3 ausführen, verwenden Sie die 2to3 sechs Bibliothek wie diese :

import six

six.next(g)  # on PY2K: 'g.next()' and onPY3K: 'next(g)'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top