W Pythonie 2.7 oba poniższe zrobią to samo
print("Hello, World!") # Prints "Hello, World!"
print "Hello, World!" # Prints "Hello, World!"
Jednak poniższe nie będą
print("Hello,", "World!") # Prints the tuple: ("Hello,", "World!")
print "Hello,", "World!" # Prints the words "Hello, World!"
W nawiasach Python 3.x on print
jest obowiązkowy, co zasadniczo czyni go funkcją, ale w wersji 2.7 obie będą działać z różnymi wynikami. O czym jeszcze powinienem wiedzieć print
w Pythonie 2.7?
python
printing
python-3.x
python-2.7
Hubro
źródło
źródło
print
jest właściwie instrukcją specjalną, a nie funkcją. Dlatego też nie można go używać w taki sposób, jak:lambda x: print x
Uwaga,(expr)
która nie tworzy krotki (skutkujeexpr
), ale,
tak.from __future__ import print_function
Odpowiedzi:
W Pythonie 2.x
print
jest właściwie instrukcją specjalną, a nie funkcją *.Z tego powodu nie można go używać w następujący sposób:
lambda x: print x
Zauważ, że
(expr)
nie tworzy krotki (skutkujeexpr
), ale,
tak. Prawdopodobnie powoduje to zamieszanie międzyprint (x)
iwprint (x, y)
Pythonie 2.7Ponieważ jednak w Pythonie 2.x
print
jest to specjalna instrukcja składniowa / konstrukcja gramatyki , to bez nawiasów traktuje znaki,
w specjalny sposób - i nie tworzy krotki. To specjalne traktowanieprint
instrukcji umożliwia jej działanie w inny sposób, jeśli występuje na końcu,
lub nie.Miłego kodowania.
* To
print
zachowanie w Pythonie 2 można zmienić na zachowanie w Pythonie 3:źródło
(expr) != tuple
wyjaśnienie :-)To wszystko jest bardzo proste i nie ma nic wspólnego z kompatybilnością wsteczną lub wsteczną.
Ogólna forma
print
instrukcji we wszystkich wersjach Pythona przed wersją 3 to:(Każde wyrażenie jest po kolei oceniane, konwertowane na ciąg i wyświetlane ze spacją między nimi).
Pamiętaj jednak, że umieszczanie nawiasów wokół wyrażenia to wciąż to samo wyrażenie.
Możesz więc również napisać to jako:
Nie ma to nic wspólnego z wywołaniem funkcji.
źródło
print (expr1), (expr2), ... (expr3)
to, dlaczegoprint (expr1, expr2, ... , expr3)
jest legalny w Pythonie 2.x, a nie powinien być zgodny ze standardami 2.x.Tutaj mamy ciekawy efekt uboczny, jeśli chodzi o UTF-8.
Ostatni wydruk to krotka z szesnastkowymi wartościami bajtów.
źródło
repr
na niej, w którym to momencie prawdopodobnie koduje wszystkie ciągi w dykt do ASCII.#encoding=utf-8
, linux envLANG=en_US.UTF-8
. Więc repr koduje nie używając domyślnego ASCII, ale kodowania utf-8.str
ze specjalnymstring_escape
kodowaniem. Ciąg był już zakodowany w Unicode jako UTF-8.repr
prawdopodobnie podejmuje kroki w celu zapewnienia, że tekst może być reprezentowany przez ASCII (za pomocą znaków ucieczki znaków spoza ASCII), niekoniecznie że ciąg jest zakodowany jako ASCII. Nadal nie wiem, czy to jest całkowicie dokładne.repr()
dane wyjściowe po przekonwertowaniu na łańcuch (nie implementują__str__
, tylko__repr__
). To, co widzisz, nie jest wyjątkowe w UTF-8; therepr()
string daje poprawne literały łańcuchowe Pythona, które są bezpieczne dla ASCII.Zasadniczo w Pythonie przed Pythonem 3 print był specjalną instrukcją, która wyświetlała wszystkie ciągi znaków, jeśli otrzymano je jako argumenty. Czyli
print "foo","bar"
po prostu oznaczało „print 'foo', a następnie 'bar'”. Problem z tym było to było kuszące, aby działać tak, jakby były funkcją drukowania, a gramatyka Python jest niejednoznaczna na tym, ponieważ(a,b)
jest krotką zawierającąa
ab
jednakfoo(a,b)
to wywołanie funkcji dwóch argumentów.Dlatego wprowadzili niekompatybilną zmianę dla 3, aby programy były mniej niejednoznaczne i bardziej regularne.
(Właściwie myślę, że 2.7 zachowuje się tak jak 2.6 w tym, ale nie jestem pewien.)
źródło