Dies ist eine schlechte Praxis. Erstens erzeugt Ihr Codefragment nicht die gewünschte Ausgabe. Sie würden stattdessen etwas wie erhalten: <generator object <genexpr> at 0x03D826F0>
.
Zweitens ist ein Listenverständnis zum Erstellen von Sequenzen und Generatoren ein zum Erstellen von Strömen von Objekten. Normalerweise haben sie keine Nebenwirkungen. Ihre Aktionsfunktion ist ein Paradebeispiel für einen Nebeneffekt - sie gibt ihre Eingabe aus und gibt nichts zurück. Vielmehr sollte ein Generator für jeden von ihm erzeugten Gegenstand eine Eingabe machen und eine Ausgabe berechnen. z.B.
doubled_odds = [x*2 for x in range(10) if x % 2 != 0]
durch einen Generator verwenden Sie den Zweck Ihres Code sind Verschleiern, die globalen Zustand zu mutieren ist (Druck etwas), und nicht um einen Strom von Objekten zu erstellen. Während die Verwendung einer for-Schleife den Code etwas länger macht (im Prinzip nur mehr Leerzeichen), können Sie sofort erkennen, dass der Zweck darin besteht, Funktionen auf eine Auswahl von Elementen anzuwenden (im Gegensatz zu einem neuen Stream/einer Liste von Elementen). . Denken Sie daran,
for i in items:
if i < 4:
action(i)
dass Generatoren noch Konstrukte werden Looping und dass die zugrunde liegende Bytecode ist mehr oder weniger das gleiche (wenn überhaupt etwas, Generatoren geringfügig weniger effizient sind), und Sie verlieren Klarheit. Generatoren und Listen-Comprehensions sind großartig, aber das ist nicht die richtige Situation für sie.
Nein ist es nicht, es ist tatsächlich schöner und schneller, denke ich, weil es zuerst keine Listen erstellt und Loops darüber, aber das eine Liste von None zurückgibt, weil Aktion nichts zurückgibt, und Sie würden '[]' für die Listenkomposition verwenden. –
Das ist eigentlich eine Generatoraussage, die Sie dort bekommen haben, kein Listenverständnis. Ich weiß nicht, ob das Ihre Frage wesentlich beeinflusst. – Tagc
@Tagc Ich weiß, es schafft einen Generator, war nicht sicher, ob Sie es ein Generator Verständnis nennen würde, aber ja die gleiche Idee für eine Liste Verständnis. Wäre einer aus irgendeinem Grund dem anderen vorzuziehen? – Siwel