В Python 2.7 следующее будет делать то же самое
print("Hello, World!") # Prints "Hello, World!"
print "Hello, World!" # Prints "Hello, World!"
Однако следующее не будет
print("Hello,", "World!") # Prints the tuple: ("Hello,", "World!")
print "Hello,", "World!" # Prints the words "Hello, World!"
В Python 3.x круглые скобки print
являются обязательными, что, по сути, делает их функцией, но в 2.7 оба будут работать с разными результатами. Что еще мне нужно знать о print
Python 2.7?
print
это на самом деле специальный оператор, а не функция. Вот почему его нельзя использовать как:lambda x: print x
Обратите внимание, что(expr)
кортеж не создается (результат получаетсяexpr
), но создается,
.from __future__ import print_function
Ответы:
В Python 2.x
print
это фактически специальный оператор, а не функция *.Вот почему его нельзя использовать как:
lambda x: print x
Обратите внимание, что
(expr)
кортеж не создается (результат получаетсяexpr
), но создается,
. Это, вероятно, приводит к путанице междуprint (x)
иprint (x, y)
в Python 2.7.Однако, поскольку
print
это специальный синтаксический оператор / грамматическая конструкция в Python 2.x, то без круглых скобок он обрабатывает,
's особым образом - и не создает кортеж. Эта особая обработкаprint
оператора позволяет ему действовать по-разному, независимо от того, есть ли завершающий элемент,
или нет.Удачного кодирования.
* Это
print
поведение в Python 2 можно изменить на поведение Python 3:источник
(expr) != tuple
объяснение :-)Все очень просто и не имеет ничего общего с прямой или обратной совместимостью.
Общая форма
print
оператора во всех версиях Python до версии 3:(Каждое выражение по очереди вычисляется, преобразуется в строку и отображается с пробелом между ними.)
Но помните, что заключение выражения в круглые скобки остается тем же выражением.
Вы также можете написать это как:
Это не имеет ничего общего с вызовом функции.
источник
print (expr1), (expr2), ... (expr3)
, а о том, почемуprint (expr1, expr2, ... , expr3)
это законно в python 2.x, в то время как это не должно соответствовать стандартам 2.x.Здесь у нас есть интересный побочный эффект, когда дело доходит до UTF-8.
Последний вывод - кортеж с шестнадцатеричными байтовыми значениями.
источник
repr
на нем, и в этот момент он, вероятно, кодирует все строки в dict в ASCII.#encoding=utf-8
linux envLANG=en_US.UTF-8
. Таким образом, repr кодирует не используя кодировку ASCII по умолчанию, а кодировку utf-8.str
специальнойstring_escape
кодировкой. Строка уже была закодирована в Юникоде как UTF-8.repr
вероятно, предпринимаются шаги, чтобы гарантировать, что текст может быть представлен ASCII (посредством экранирования не-ASCII-символов), не обязательно, чтобы строка была закодирована как ASCII. Я до сих пор не знаю, верно ли это.repr()
выход при преобразовании в строку (они не выполняют__str__
, только__repr__
). То, что вы видите, не является особенным для UTF-8; therepr()
строки дает вам допустимые строковые литералы Python, которые безопасны для ASCII.В основном в Python до Python 3 print был специальным оператором, который печатал все строки, если они были получены в качестве аргументов. Это
print "foo","bar"
просто означало «напечатать 'foo', за которым следует 'bar» ». Проблема заключалась в том, что было заманчиво действовать так, как если бы print была функцией, и грамматика Python неоднозначна, поскольку(a,b)
это кортеж, содержащийa
и,b
ноfoo(a,b)
являющийся вызовом функции двух аргументов.Поэтому они внесли несовместимое изменение для 3, чтобы сделать программы менее неоднозначными и более регулярными.
(На самом деле, я думаю, что 2.7 ведет себя так же, как 2.6, но я не уверен.)
источник