2009-07-02 10 views
149

Ich habe einen Generator, der eine Reihe, zum Beispiel erzeugt:Ist generator.next() in Python 3.0 sichtbar?

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 mir die folgenden Anrufe vor:

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

jedoch in 3.0, wenn ich die gleichen zwei Zeilen ausführen ich bin den folgenden Fehler bekommen Code:

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

aber, funktioniert die Schleife Iterator Syntax Arbeit in 3.0

Ich konnte noch nichts finden, das diesen Unterschied im Verhalten für 3.0 erklärt.

Antwort

232

Korrekt, g.next() wurde in g.__next__() umbenannt. Der Grund dafür ist Konsistenz. Spezielle Methoden wie __init__() und __del__ haben alle doppelte Unterstriche (oder "Dunder", wie es jetzt beliebt ist, sie aufzurufen), und .next() ist eine der wenigen Ausnahmen von dieser Regel. Python 3.0 behebt das. [*]

Aber anstelle von g.__next__(), wie Paolo sagt, verwenden Sie next(g).

[*] Es gibt mehr spezielle Attribute, die dieses Update erhalten haben, wie Funktionsattribute. Nicht mehr func_name, es ist jetzt __name__ usw.

+0

eine Idee, warum Python 2 die Dunder Convention für diese Methoden in erster Linie vermieden? –

+0

Das ist wahrscheinlich nur ein Versehen. –

80

Versuchen:

next(g) 

Check out this neat table, die die Unterschiede in der Syntax zwischen 2 und 3, wenn es dazu kommt.

+1

@MaikuMori ich den Link festgelegt (für Peer Revision wartet) (Die Website http://diveintopython3.org scheint nicht verfügbar zu sein. Mirror-Website http://diveintopython3.ep.io ist noch am Leben) – gecco

+1

Die Verknüpfung wurde erneut behoben. http://python3porting.com/differences.html ist kompletter, übrigens. –

+0

Der Link ist immer noch gebrochen ... – Klik

7

Wenn Ihr Code muss unter Python2 und Python3 laufen, die 2to3 six Bibliothek wie folgt verwenden:

import six 

six.next(g) # on PY2K: 'g.next()' and onPY3K: 'next(g)' 
+7

Es ist nicht viel notwendig, es sei denn, Sie müssen Python-Versionen vor 2.6 unterstützen. Python 2.6 und 2.7 haben die "next" eingebaute Funktion. –