2017-08-12 2 views
1

Kann mir bitte jemand erklären, was dieser Generatorcode macht?Wie funktioniert dieser Python-Generator?

>>> def f(): 
...  return next((i for i in [{'a':1, 'b':2}, {'c':3, 'd':4}])) 
... 
>>> t = f() 
>>> for item in t: 
...  print(item) 
... 
a 
b 
>>> t 
{'a': 1, 'b': 2} 
>>> 

Ist diese Funktion tatsächlich so konzipiert, dass nur ein einzelner Wert zurückgegeben wird?

Antwort

2

Kann jemand bitte erklären, was dieser Generatorcode tut?

(i for i in [{'a':1, 'b':2}, {'c':3, 'd':4}]) 

Dies ist die Syntax für einen Generator Verständnis. Versuchen Sie, über das so iteriert:

In [205]: for x in (i for i in [{'a':1, 'b':2}, {'c':3, 'd':4}]): 
...:  print(x) 
...:  
{'b': 2, 'a': 1} 
{'d': 4, 'c': 3} 

Die next() Funktion gibt das nächste Element aus dem Generator. Aus der Dokumentation von next:

next(iterator[, default])

Rufen Sie das nächste Element aus dem Iterator durch seine next() Methode aufrufen. Wenn der Standardwert angegeben ist, wird er zurückgegeben, wenn der Iterator erschöpft ist, andernfalls wird StopIteration ausgelöst.

In diesem Fall, was zurückgegeben wird, ist

{'a':1, 'b':2} 

Dies ist ein Wörterbuch ist. Wenn Sie dabei eine for-Schleife verwenden, iterieren Sie über die Schlüssel, so dass Sie a und b der Reihe nach ausgeben (wenn Sie auf Python3.6 sind), weil die Reihenfolge der Schlüssel garantiert ist. Bei älteren Python-Versionen drucken Sie die Schlüssel in beliebiger Reihenfolge.

Ist diese Funktion tatsächlich so konzipiert, dass nur ein einzelner Wert zurückgegeben wird?

Ja ist es. Als Übung versuchen return-yield from, wie dies zu ändern:

def f(): 
    yield from (i for i in [{'a':1, 'b':2}, {'c':3, 'd':4}])) 
+0

Dank. Überraschenderweise gibt die Ausbeute den ersten Eintrag im Wörterbuch zurück. – user3267989

+0

Es mag erwähnenswert sein, dass die Reihenfolge, in der die Schlüssel aus dem Wörterbuch iteriert werden, nicht garantiert ist. In Python-Versionen vor 3.6 ist es wahrscheinlich zufällig. In 3.6 selbst werden die Schlüssel in der Reihenfolge zurückgegeben, in der sie dem Wörterbuch hinzugefügt wurden, aber dies wird als Implementierungsdetail betrachtet, nicht als etwas, auf das Sie sich verlassen sollten. Das könnte sich in Version 3.7 oder einer späteren Version ändern (es wird wahrscheinlich passieren, aber es wurde noch nicht entschieden). – Blckknght

+0

>>> def f(): ... Ausbeute nächste ((i für i in [{'a': 1, 'b': 2}, {'c': 3, 'd': 4}])) ... >>> t = f() >>> für Artikel in t: ... Druck (Artikel) ... {'a': 1, 'b': 2} >>> – user3267989