Wie in HOWTO zur funktionalen Programmierung angegeben, müssen Klammern verwendet werden, um eine Liste von Tupeln mithilfe des Listenverständnisses zu erstellen. Dies wird insbesondere im Dokument im folgenden Zitat ausgedrückt.
Um zu vermeiden, dass die Grammatik von Python mehrdeutig wird, muss der Ausdruck , wenn er ein Tupel erstellt, von Klammern umgeben sein.
Also als Beispiele:
[x, y for x in seq1 for y in seq2] # This is a syntex error
[(x, y) for x in seq1 for y in seq2] # This is a correct expression of list of tuples using list comprehension
Welche Mehrdeutigkeit wird vermieden, indem die Verwendung von Klammern beim Ausdrücken einer Liste von Tupeln mithilfe des Listenverständnisses erzwungen wird?
python
python-3.x
Isaac To
quelle
quelle
Antworten:
Nach vielem Ausgraben der Mailingliste habe ich eine ziemlich eindeutige Aussage gefunden, dass der Parser damit einverstanden war. Die Klammern wurden obligatorisch gemacht, um die Bedeutung klarer zu machen. Hier ist ein Zitat von Guido aus dem Jahr 2000 auf der Python-Dev-Mailingliste:
Siehe auch die nächste Antwort im Thread, in dem Greg Ewing läuft
auf einer frühen Version des Listenverständnis-Patches, und es funktioniert gut.
quelle
Aus den Dokumenten :
Innerhalb einer Liste sind Verständnis-Tupel in einer Liste verschachtelt. Sie müssen also in Klammern stehen. Wenn sie jedoch nicht verschachtelt sind
the_tuples = 'a','b','c'
, sind sie beispielsweise nicht erforderlich, da sie dann automatisch als Tupel erkannt werden.quelle
Python enthält mehrere syntaktische Elemente mit optionalen Klammern. In diesem Fall sind dies:
tuple
wörtlichx, y
y for x in seq1 for y in seq2
In eindeutigen Fällen können diese ohne zusätzliche Klammern verwendet werden:
b = x, y
sum(y for x in seq1 for y in seq2)
Die Verwendung beider im selben Ausdruck ist jedoch nicht eindeutig. Klammern sind erforderlich, um die Bedeutung zu verdeutlichen:
[(x, y) for x in seq1 for y in seq2]
[x, (y for x in seq1 for y in seq2)]
Gemäß der Python3-Grammatik werden Listenanzeigen
[...]
so definiert, dass sie entweder eine Ausdrucksliste (a, b, *c, d
) oder ein Verständnis (a for a in b
) enthalten.quelle