In Python 2.7 machen beide die gleichen Schritte
print("Hello, World!") # Prints "Hello, World!"
print "Hello, World!" # Prints "Hello, World!"
Das Folgende wird jedoch nicht
print("Hello,", "World!") # Prints the tuple: ("Hello,", "World!")
print "Hello,", "World!" # Prints the words "Hello, World!"
In Python 3.x ist die Klammer on print
obligatorisch, was sie im Wesentlichen zu einer Funktion macht. In 2.7 funktionieren beide jedoch mit unterschiedlichen Ergebnissen. Was sollte ich sonst noch print
in Python 2.7 wissen ?
python
printing
python-3.x
python-2.7
Hubro
quelle
quelle
print
ist eigentlich eine spezielle Anweisung, keine Funktion. Dies ist auch der Grund, warum es nicht wie folgt verwendet werden kann:lambda x: print x
Beachten Sie, dass(expr)
kein Tupel erstellt wird (was dazu führtexpr
), aber dies,
tut.from __future__ import print_function
Antworten:
In Python 2.x
print
ist eigentlich eine spezielle Anweisung und keine Funktion *.Dies ist auch der Grund, warum es nicht verwendet werden kann wie:
lambda x: print x
Beachten Sie, dass
(expr)
kein Tupel erstellt wird (dies führt zuexpr
), aber dies,
tut. Dies führt wahrscheinlich zu einer Verwechslung zwischenprint (x)
undprint (x, y)
in Python 2.7Da es sich jedoch in Python 2.x
print
um ein spezielles Syntaxanweisungs- / Grammatikkonstrukt handelt , werden die ohne Klammer auf,
besondere Weise behandelt - und es wird kein Tupel erstellt. Diese spezielle Behandlung derprint
Aussage ermöglicht es ihr, anders zu handeln, ob es ein Trailing gibt,
oder nicht.Viel Spaß beim Codieren.
* Dieses
print
Verhalten in Python 2 kann in das von Python 3 geändert werden:quelle
(expr) != tuple
Erklärung :-)Es ist alles sehr einfach und hat nichts mit Vorwärts- oder Abwärtskompatibilität zu tun.
Die allgemeine Form für die
print
Anweisung in allen Python-Versionen vor Version 3 lautet:(Jeder Ausdruck wird ausgewertet, in eine Zeichenfolge konvertiert und mit einem Leerzeichen dazwischen angezeigt.)
Denken Sie jedoch daran, dass das Setzen von Klammern um einen Ausdruck immer noch der gleiche Ausdruck ist.
Sie können dies also auch schreiben als:
Dies hat nichts mit dem Aufruf einer Funktion zu tun.
quelle
print (expr1), (expr2), ... (expr3)
, warumprint (expr1, expr2, ... , expr3)
es in Python 2.x legal ist, während es nicht den 2.x-Standards entsprechen sollte.Hier haben wir interessante Nebenwirkungen, wenn es um UTF-8 geht.
Der letzte Druck ist ein Tupel mit hexadezimalen Bytewerten.
quelle
repr
darauf ausgeführt. Zu diesem Zeitpunkt codiert es wahrscheinlich alle Zeichenfolgen im Diktat in ASCII.#encoding=utf-8
Linux envLANG=en_US.UTF-8
. So repr Encodierungen mit Standard ASCII nicht, aber utf-8 - Codierung.str
mit der speziellenstring_escape
Codierung. Die Zeichenfolge war bereits als UTF-8 Unicode-codiert.repr
wahrscheinlich Schritte , um sicherzustellen , nimmt der Text kann durch ASCII dargestellt werden (mittels nicht-ASCII - Zeichen zu entkommen), nicht unbedingt , dass die Zeichenfolge wird als ASCII - codiert. Ich weiß immer noch nicht, ob das ganz richtig ist.repr()
Ausgang , wenn in einen String umgewandelt (nicht implementiert__str__
, nur__repr__
). Was Sie sehen, ist nichts Besonderes für UTF-8. Dasrepr()
eines Strings gibt Ihnen gültige Python-String-Literale, die ASCII-sicher sind.Grundsätzlich war print in Python vor Python 3 eine spezielle Anweisung, die alle Zeichenfolgen druckte, wenn sie als Argumente angegeben wurden. Also
print "foo","bar"
einfach "print 'foo' gefolgt von 'bar'". Das Problem dabei war, dass es verlockend war, so zu tun, als wäre print eine Funktion, und die Python-Grammatik ist diesbezüglich nicht eindeutig, da(a,b)
es sich um ein Tupel handelt, das eine Funktion von zwei Argumenten enthälta
undb
diesefoo(a,b)
aufruft.Daher haben sie die inkompatible Änderung für 3 vorgenommen, um Programme weniger mehrdeutig und regelmäßiger zu machen.
(Eigentlich denke ich, dass sich 2.7 wie 2.6 verhält, aber ich bin mir nicht sicher.)
quelle