Bei der Verwendung in einer Funktion sind keine viereckigen Klammern erforderlich

7

Ich habe eine Pull-Anfrage mit folgendem Code eingereicht:

%Vor%

Einer der Rezensenten schlug stattdessen Folgendes vor:

%Vor%

(der Unterschied ist nur, dass die eckigen Klammern fehlen).

Ich war überrascht, dass die zweite Form identisch zu sein scheint. Aber als ich versuchte, es in anderen Kontexten zu verwenden, in denen der erste funktioniert, schlägt es fehl:

%Vor%

Sind die beiden Formen identisch? Gibt es einen wichtigen Grund, warum die eckigen Klammern in der Funktion nicht notwendig sind? Oder ist das nur etwas, was ich wissen muss?

    
Matt Fenwick 12.06.2012, 14:14
quelle

4 Antworten

15

Dies ist ein Generatorausdruck. Um es im Standalone-Fall zu verwenden, verwenden Sie geschweifte Klammern:

%Vor%

und y werden zu einem Generator. Sie können über Generatoren iterieren, so dass es dort funktioniert, wo ein iterables erwartet wird, z. B. die Funktion sum .

Anwendungsbeispiele und Fallstricke:

%Vor%

Seien Sie vorsichtig, wenn Sie Generatoren in der Nähe halten, Sie können sie nur einmal durchlaufen. Wenn Sie also versuchen, sum erneut zu verwenden, geschieht dies folgendermaßen:

%Vor%

Wenn Sie also einen Generator übergeben, wo tatsächlich eine Liste oder ein Set oder etwas Ähnliches erwartet wird, müssen Sie vorsichtig sein. Wenn die Funktion oder Klasse das Argument speichert und mehrmals versucht, darüber zu iterieren, treten Probleme auf. Betrachten Sie dies zum Beispiel:

%Vor%

es wird fehlschlagen, wenn Sie es einen Generator übergeben:

%Vor%

Sie können leicht eine Liste von den Werten erhalten, die ein Generator erzeugt:

%Vor%

Damit können Sie das vorherige Beispiel beheben:

%Vor%

Beachten Sie jedoch, dass Sie beim Erstellen einer Liste aus einem Generator jeden Wert speichern müssen. Dies kann viel mehr Speicher in Situationen, in denen Sie viele Elemente haben, verwenden.

Warum sollte in Ihrer Situation ein Generator verwendet werden?

Der deutlich geringere Speicherverbrauch ist der Grund, warum sum(generator expression) besser ist als sum(list) : Die Generatorversion muss nur einen einzelnen Wert speichern, während die Listenvariante N Werte speichern muss. Daher sollten Sie immer einen Generator verwenden, bei dem Sie keine Nebenwirkungen befürchten.

    
mensi 12.06.2012, 14:17
quelle
3

Sie sind nicht identisch.

Das erste Formular,

%Vor%

ist ein Listenverständnis. Der andere ist ein Generator Ausdruck und so geschrieben:

%Vor%

Es gibt einen Generator zurück, keine Liste.

Wenn der Generatorausdruck das einzige Argument in einem Funktionsaufruf ist, können seine Klammern übersprungen werden.

Siehe PEP 289

    
Simon 12.06.2012 14:20
quelle
2

Der erste ist die Listenkomprehension Wo der zweite Generatorausdruck ist

%Vor%

Verwenden Sie Klammer für Generatoren:

%Vor%     
shiva 12.06.2012 14:19
quelle
0

Lesen Sie diese PEP: 289

  

Zum Beispiel wird der folgende Summierungscode eine vollständige Liste von Quadraten im Speicher erstellen, über diese Werte iterieren und, wenn die Referenz nicht mehr benötigt wird, die Liste löschen:

%Vor%      

Der Speicher wird beibehalten, indem stattdessen ein Generatorausdruck verwendet wird:

%Vor%      

Wenn die Datenmengen größer werden, tendieren Generatorausdrücke dazu, besser zu arbeiten, da sie den Cache-Speicher nicht erschöpfen und es Python erlauben, Objekte zwischen Iterationen erneut zu verwenden.

Verwenden Sie brace product einen Generator:

%Vor%     
shihongzhi 12.06.2012 14:38
quelle