Python basic level generator und list fragen [duplizieren]

Diese Frage hat hier schon eine Antwort:

  • Python 2 merkwürdige liste verständnisverhalten 2 antworten
my_nums =(i*i for i in [1,2,3,4,5]) for k in (my_nums): print(k) GG = list(my_nums) print(GG) 

Es druckt:

 1 4 9 16 25 [] Process finished with exit code 0 

Ich kann nicht verstehen, warum ist [] Wert leer (es sollte [1,4,9,16,25] ) sein? Auch macht die for-loop Generator-Werte zur Liste?

    6 Solutions collect form web for “Python basic level generator und list fragen [duplizieren]”

    Im Folgenden ist ein Generatorverständnis :

     my_nums =(i*i for i in [1,2,3,4,5]) for k in (my_nums): print(k) 

    Also erstmal, wenn du über sie schleppst und die Werte ausdrucke, druckt der Generator jeden Wert, den er erzeugen kann. Die for-Schleife arbeitet, indem sie my_nums.next() und den zu k erhaltenen Wert zuordnet, der dann gedruckt wird. Die Iteration der for-Schleife stoppt, wenn die StopIteration Ausnahme StopIteration wird.

    Und wenn du GG = list(my_nums) nach der for-Schleife benutzt, bekommst du eine leere Liste, da der Generator schon erschöpft ist und nichts mehr zu generieren hat.

    Wenn Sie die Werte des Generators in eine list speichern möchten, können Sie dies direkt wie folgt ausführen:

     my_nums =(i*i for i in [1,2,3,4,5]) GG = list(my_nums) # no for loop for printing it already 

    Obwohl, ich bin nicht sicher, dass Leistung weise Sie würden alle Vorteile, wenn Sie es tun, wie oben.

    Einfach, weil du den Generator gerade zum ersten Mal erschöpft hast!

     my_nums = (i*i for i in [1,2,3,4,5]) for k in my_nums: print(k) my_nums = (i*i for i in [1,2,3,4,5]) print(list(my_nums)) 

    Wenn du über den Generator itertest, leckst du ihn gleichzeitig. Also, nur for k in (my_nums): print(k) entfernen for k in (my_nums): print(k) und du wirst das erwartete Ergebnis haben.

    Das selbe hier:

     my_nums =(i*i for i in [1,2,3,4,5]) a = list(my_nums) b = list(my_nums) print(a) // [1,4,9,16,25] print(b) // [] 

    Das ist, weil du schon alle erzeugten Werte erschöpft hast, als du es getan hast

     for k in (my_nums): # you already made my_nums generate till the end here print(k) 

    Denken Sie an den Generator als Lesen aus einem Strom. Sie haben den Stream schon gelesen und so erhalten Sie eine leere Liste, wenn Sie versuchen, mehr von einem bereits erschöpften Generator zu lesen

    Generatoren sind Iteratoren, aber man kann sie nur einmal übertreiben. Es ist, weil sie nicht alle Werte im Speicher speichern, sie erzeugen die Werte auf der Fliege.

     my_nums =(i*i for i in [1,2,3,4,5]) for k in (my_nums): print(k) 

    Es druckt:

     1 4 9 16 25 

    Es ist genau das gleiche, außer du hast () anstelle von [] verwendet. ABER, du kannst nicht for k in my_nums ein zweites Mal ausführen, da Generatoren nur einmal benutzt werden können: sie berechnen 1, dann vergiss es und berechnen 4 und for k in my_nums Berechnen von 25, eins nach dem anderen.

    Wenn Sie versuchen, die Iteration erneut durchzuführen, erhalten Sie StopIteration .

    Dies wurde im Detail zu diesem Thema diskutiert.

    Ein Generatorausdruck wie folgt:

     my_nums = (item for item in [1, 2, 3, 4, 5, 6, 7]) 

    Ist Syntax Zucker für so etwas wie folgt:

     def generator(iterable): for item in iterable: yield item my_nums = generator([1, 2, 3, 4, 5, 6, 7]) 

    Die forloop selbst ist gleich etwas wie folgt:

     while True: try: item = next(my_nums) except StopIteration: break else: print(item) 

    Da gg = list(iterable) ist so etwas wie:

     gg = [] for item in my_nums: gg.append(item) 

    Das Problem ist, dass das erste Mal, wenn du über den Generatorausdruck schleppst, ist es erschöpft. Wenn du versuchst, es wieder zu StopIteration , wird es einfach die StopIteration erhöhen und die Schleife brechen.

    Beispielsweise:

     >>> my_nums = (i for i in [1, 2]) >>> list(my_nums) [1, 2] >>> list(my_nums) [] >>> next(my_nums) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>> 

    Sehen Sie, wie das zweite Mal, wenn Sie list(my_nums) aufrufen list(my_nums) es eine leere Liste zurückgibt? Das ist, weil der Generator erschöpft ist. Sie können sehen, wie es StopIteration erhöht, wenn Sie versuchen, das nächste Element von ihm zu holen.

    Python ist die beste Programmiersprache der Welt.