die Ausbeute in der Liste Verstehens-und generator-Ausdrücke

Folgendes Verhalten erscheint eher kontraintuitiv für mich (Python 3.4):

>>> [(yield i) for i in range(3)]
<generator object <listcomp> at 0x0245C148>
>>> list([(yield i) for i in range(3)])
[0, 1, 2]
>>> list((yield i) for i in range(3))
[0, None, 1, None, 2, None]

Die Zwischenwerte der letzten Zeile sind tatsächlich nicht immer None Sie sind, was wir send in den generator, vergleichbar (denke ich mal) an den folgenden generator:

def f():
   for i in range(3):
      yield (yield i)

Scheint es mir komisch, dass Sie diese drei Zeilen, alle am arbeiten. Die Referenz sagt, dass yield ist nur erlaubt in einer Funktion, definition (obwohl ich vielleicht liest es falsch und/oder kann es einfach nur kopiert worden sind, die von der älteren version). Die ersten beiden Zeilen erzeugen ein SyntaxError in Python 2.7, aber die Dritte Zeile nicht.

Auch, es scheint seltsam

  • dass eine list comprehension gibt einen generator und nicht eine Liste
  • und dass der generator expression umgewandelt, um eine Liste und die entsprechende list comprehension unterschiedliche Werte enthalten.

Könnte jemand mehr Informationen liefern?

InformationsquelleAutor zabolekar | 2015-08-21

Schreibe einen Kommentar