2017-05-17 4 views
2

Wenn ich lese die Frage Python string.join(list) on object array rather than string array, finde ich den folgenden Satz:Verwendung str.join mit Generator Ausdruck in Python

', '.join(str(x) for x in list) 

Ich habe bereits wissen, über (str(x) for x in list) einen Generator Ausdruck ist, ich weiß Generator auch ein iterable ist . Der folgende Code verifiziert die Richtigkeit meiner Sichtweise.

>>> gen = (x for x in [1,2,3]) 
<generator object <genexpr> at 0x104349b40> 
>>> from collections import Iterable 
>>> isinstance(gen, Iterable) 
True 

Zur gleichen Zeit, str.join(iterable) eine Zeichenfolge zurück, die die Verkettung der Strings in der iterable ist. So funktioniert das Folgende gut, wie ich es wünsche.

>>> ",".join((str(x) for x in [1,2,3])) 
'123' 

hier dann die Frage kommt, warum der Code bei dir auch in Ordnung funktioniert, warum keine Klammern im Funktionsaufruf muß.

', '.join(str(x) for x in [1,2,3]) 

Immerhin str(x) for x in [1,2,3] selbst ist kein Generator.

>>> tmp = str(x) for x in [1,2,3] 
    File "<stdin>", line 1 
    tmp = str(x) for x in [1,2,3] 
       ^
SyntaxError: invalid syntax 

Antwort

5

Dieser angegeben wurde, als Generator Ausdrücke eingeführt wurden (PEP 289):

wenn ein Funktionsaufruf ein einzelnes Positions Argument hat, kann er ein Generator Ausdruck ohne zusätzliche Klammern, aber in allen anderen Fällen Sie müssen es in Klammern setzen.

In Ihrem Fall ist es ein einziges Positions Argument, so dass beiden Wege sind möglich:

', '.join(str(x) for x in [1,2,3]) 
', '.join((str(x) for x in [1,2,3])) 
2

Nach sorgfältiger Prüfung des Dokument Wort für Wort zu lesen, finde ich es Generator expressions erwähnt:

Die Bei Aufrufen mit nur einem Argument können Klammern weggelassen werden. Siehe Abschnitt Aufrufe für das Detail.

2

Es ist ein Generator Ausdruck oder so - aber ob umschließenden Klammern sind erforderlich hängt von dem Kontext, in dem der Generator Ausdruck erscheint. Argumentlisten sind eine Art Spezialfall: Wenn der Generatorausdruck das einzige Argument ist, sind umschließende Klammern nicht erforderlich (können aber trotzdem verwendet werden, wenn Sie möchten). Wenn ein Aufruf jedoch mehr als ein Argument enthält, sind umschließende Klammern erforderlich. Dies ist im Wesentlichen Punkt 2B in the PEP that introduced this feature.