Was ist der Unterschied zwischen "()" und "[]" beim Generieren in Python?

7

Es gibt eine Liste: nodes = [20, 21, 22, 23, 24, 25].

Ich habe zwei Möglichkeiten benutzt, um neue zweidimensionale Objekte zu erzeugen:

%Vor%

Der Typ von tour1 ist ein Generator, während tour2 eine Liste ist:

%Vor%

Ich möchte wissen, warum tour1 kein Tupel ist? Danke.

    
zfz 21.11.2012, 10:49
quelle

5 Antworten

10

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:

%Vor%     
NPE 21.11.2012, 10:53
quelle
10

Die Syntax für ein Tupel ist nicht Klammern () , es ist das Komma , . Sie können ein Tupel ohne Klammern erstellen:

%Vor%

Wenn Sie ein Tupel aus einem Verständnis erstellen möchten, verwenden Sie einfach den tuple -Konstruktor:

%Vor%     
ecatmur 21.11.2012 10:51
quelle
5

Weil die Syntax (x for x in l) ein sogenannter "generator expression" ist: siehe Ссылка

    
Jonathan Ballet 21.11.2012 10:53
quelle
2

Es ist Generator, aber Sie können es einfach in Tupel ändern:

%Vor%     
applicative_functor 21.11.2012 10:52
quelle
2

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):

%Vor%

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:

%Vor%

Es gibt das timeit Standardmodul zum Messen der Ausführungszeit. Lassen Sie uns versuchen, es für die beiden Fälle zu verwenden:

%Vor%

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.

    
pepr 21.11.2012 11:36
quelle

Tags und Links