Der grundlegende Unterschied besteht darin, dass der erste ein Generatorausdruck ist und der zweite ein Listenverständnis. Erstere liefert nur Elemente, wie sie benötigt werden, während Letzteres immer die gesamte Liste erzeugt, wenn das Verständnis ausgeführt wird.
Weitere Informationen finden Sie unter Generatorausdrücke vs. Listenverständnis
In Python gibt es kein "Tuple-Verständnis", was Sie von der ersten Syntax erwarten.
Wenn Sie tour1
in ein Tupel-Tupel umwandeln möchten, könnten Sie Folgendes verwenden:
Weil die Syntax (x for x in l)
ein sogenannter "generator expression" ist: siehe Ссылка
Es ist Generator, aber Sie können es einfach in Tupel ändern:
%Vor%Hinzufügen ... Eigentlich benötigt der Generatorausdruck überhaupt keine Klammern. Sie brauchen sie nur, wenn der Generator-Ausdruck falsche Syntax erzeugt - hier wegen der Zuweisung. Wenn Sie den Generator an eine Funktion (oder Ähnliches) übergeben, benötigen Sie keine Klammern. Versuchen Sie Folgendes:
%Vor% Erzeugt genau das gleiche Ergebnis wie Ihr tour2
. Auf diese Weise können Sie den [
wie bei einem syntaktischen Zucker für list(
betrachten und der ]
ist der syntaktische Zucker, der mit )
verknüpft ist. Es wird jedoch vom Compiler unterschiedlich kompiliert. Sie können versuchen, disassembly (Sie müssen eine Funktion übergeben):
Sie können also sehen, dass es anders ist (d. h. sieht wie ein syntaktischer Zucker aus, ist es aber nicht). Leider weiß Python nicht, wie man einen Generator zerlegt:
%Vor%Aktualisierung:
Man könnte versucht sein - wenn man sich den obigen disassemblierten Code anschaut -, dass fn1
schneller ist (mit dem kürzeren Code). Es ist jedoch bei allen Funktionsaufrufen in allen Sprachen der Fall, dass der Funktionsaufruf kürzer als der aufgefaltete Code ist. Es sagt nichts über die Interna des aufgerufenen Codes aus. Einige Punkte von The Zen of Python:
Es gibt das timeit
Standardmodul zum Messen der Ausführungszeit. Lassen Sie uns versuchen, es für die beiden Fälle zu verwenden:
und jetzt mit den eckigen Klammern:
%Vor% Dies zeigt deutlich, dass die Liste der Listen über [ ]
schneller ist. Der Grund ist, dass es weniger Funktionsaufrufe gibt. Der Python-Compiler kann einfacheren Code erzeugen.