2016-03-25 12 views
3

In Python 2 Iteratoren .next() bieten, eine aufrufbare Methode:Python 2: someIterator.next() vs. next (someIterator): Python 3

it = iter(xrange(10)) 
it.next() 
> 0 
it.next() 
> 1 
... 

In Python 3 hat man die eingebaute Funktion zu verwenden, next():

it = iter(range(10)) 
next(it) 
> 0 
next(it) 
> 1 
... 

Ist das nur "syntaktischer Zucker"? Wie macht es mehr offensichtlich, next() durch Verschieben in die integrierten Funktionen zu verwenden? Oder versteckt sich hinter dieser Veränderung ein fortschrittliches Konzept?

+2

'next (..)' funktioniert sowohl für Python 2 (2.6+) als auch für Python 3. Benutzen Sie 'next (..)' falls möglich. Übrigens, in Python 3 können Sie auch 'it .__ next __()' verwenden. – falsetru

Antwort

2

Sie direkt fragen nach PEP 3114

betrachten Sie den folgenden Code:

class test: 
    def __iter__(self): 
     return self 
    def next(self): 
     return "next" 
    def __next__(self): 
     return "__next__" 

x = test() 
for i,thing in enumerate(x): 
    print(thing) 
    if i>4: 
     break 

in Python 2 next gedruckt wird, aber in Python 3 __next__ gedruckt ist, da das Verfahren implizit aufgerufen wird es macht Weg sinnvoller zu anderen impliziten Methoden wie __add__ oder , die in the PEP beschrieben ist.

Wenn Sie es wird next über die Verwendung explizit dann ist im Grunde „syntaktischer Zucker“ planen, so dass next und iter Arbeit im Grunde die gleiche Art und Weise:

it = iter(x) 
a = next(it) 

konsistenter ist dann:

it = iter(x) 
a = it.next() 

auch Objekte wie ein Zufallszahlengenerator kann eine .next (nächste Zahl) Methode definieren, ohne notwendigerweise ein Iterator zu sein, der Zweideutigkeit/Verwirrung hinterlassen haben könnte.