Нет, это не было «соблазнительно» использовать его как функцию. :) Тем не менее, было невозможно использовать его как функцию, поэтому вы не можете сделать [напечатать x для x в alist], например.

hon 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?

 user16639031 мая 2011 г., 06:20
В Python 2.xprint на самом деле специальное утверждение, а не функция. Это также, почему это не может быть использовано как:lambda x: print x Обратите внимание, что(expr) не создает кортеж (это приводит кexpr), но, делает.
 GWW31 мая 2011 г., 06:21
Я предполагаю, что поддержка print как функции и print как утверждения заключается в том, чтобы поддерживать обратную совместимость со старыми версиями python, одновременно поощряя людей использовать новый синтаксис для перехода на python 3.
 Jeff Mercado31 мая 2011 г., 06:23
p.s., Чтобы включить функцию печати в 2.7 (и не иметь поведения оператора печати), вам нужно выполнить импорт в будущем:from __future__ import print_function

Ответы на вопрос(4)

Решение Вопроса

print на самом деле это специальное утверждение, а не функция *.

Это также, почему это не может быть использовано как:lambda x: print x

Обратите внимание, что(expr) не создает кортеж (это приводит кexpr), но, делает. Это может привести к путанице междуprint (x) а такжеprint (x, y) в Python 2.7

(1)   # 1 -- no tuple Mister!
(1,)  # (1,)
(1,2) # (1, 2)
1,2   # 1 2 -- no tuple and no parenthesis :) [See below for print caveat.]

Тем не менее, так какprint этоспециальный синтаксис / грамматическая конструкция в Python 2.x, без скобок, он обрабатывает,по-особенному - ине создать кортеж Это особое отношение кprint оператор позволяет ему действовать по-другому, если есть трейлинг, или нет.

Удачного кодирования.

*Этотprint поведение в Python 2 можно изменить на поведение в Python 3:

from __future__ import print_function
 Hubro31 мая 2011 г., 06:33
Спасибо за(expr) != tuple объяснение :-)
 user16639031 мая 2011 г., 20:51
@martineau Отметил и обновил для ясности. Код показывает, чтовыражение результаты в. Пункт под пояснения в контекстеprint утверждение, как оно меняет правила из-за специальной грамматики производства. Использование разрывов скобок, содержащихся,с изprint a1 , a2 , ... aX ,? грамматика, потому что скобки являются частьюa1 выражение.
 martineau31 мая 2011 г., 10:49
A print 1,2 результаты в1 2не(1,2) как показано - это тоже не кортеж.

тимостью.

Общая форма дляprint утверждение во всех версиях Python до версии 3:

print expr1, expr2, ... exprn

(Каждое выражение в свою очередь оценивается, преобразуется в строку и отображается с пробелом между ними.)

Но помните, что скобки вокруг выражения - это то же самое выражение.

Таким образом, вы также можете написать это как:

print (expr1), (expr2), ... (expr3)

Это не имеет ничего общего с вызовом функции.

 vinnief30 нояб. 2017 г., 13:33
Это не оprint (expr1), (expr2), ... (expr3)вот почемуprint (expr1, expr2, ... , expr3) законно в python 2.x, но не должно соответствовать стандартам 2.x.
 MarredCheese24 февр. 2017 г., 05:14
Вау, почему это так опровергнуто? Это верно.
 Martijn Pieters♦27 апр. 2017 г., 14:13
Это совершенно правильный ответ, я не уверен, почему за него так много проголосовали.

когда дело доходит до UTF-8.

>> greek = dict( dog="σκύλος", cat="γάτα" )
>> print greek['dog'], greek['cat']
σκύλος γάτα
>> print (greek['dog'], greek['cat'])
('\xcf\x83\xce\xba\xcf\x8d\xce\xbb\xce\xbf\xcf\x82', '\xce\xb3\xce\xac\xcf\x84\xce\xb1')

Последний вывод - кортеж с шестнадцатеричными байтовыми значениями.

 Martijn Pieters♦27 апр. 2017 г., 14:12
Все Контейнеры Python (list, dict, tuple, set) включают их содержимое в видеrepr() вывод при преобразовании в строку (они не реализуют__str__, только__repr__). То, что вы видите, не является особенным для UTF-8;repr() строки дает вам допустимые строковые литералы Python, которые являются ASCII-безопасными.
 Karlo Smid18 авг. 2012 г., 11:22
@Codemonkey, ты прав насчетмагнезии, Вы не правы в отношении ASCII. ASCII - кодировка по умолчанию для Python. Но у меня есть в начале сценария Python#encoding=utf-8, Linux EnvLANG=en_US.UTF-8, Такмагнезии кодирует не используя ASCII по умолчанию, а кодировку utf-8.
 Hubro26 янв. 2015 г., 14:27
@KarloSmid: я хотел сказать, чтоrepr вероятно предпринимает шаги, чтобы текстМожно быть представленным ASCII (посредством экранирования не-ASCII символов), не обязательно, чтобы строкаявляется закодировано как ASCII. Я до сих пор не знаю, если это совершенно точно, хотя.
 tzot03 окт. 2014 г., 01:35
Репр кодируетstr с особымstring_escape кодирование. Строка уже была в кодировке Юникод как UTF-8.
 Hubro15 авг. 2012 г., 22:54
Я предполагаю, что это потому, что print печатает UTF-8 правильно, но когда он получает кортеж, как ваш последний отпечаток, он запускаетсяrepr на этом, в этот момент он, вероятно, кодирует все строки в dict в ASCII.

который печатал все строки, если они были получены в качестве аргументов. Такprint "foo","bar" просто означало «напечатать« foo », затем« bar »». Проблема в том, что было заманчиво действовать так, как будто print была функцией, и грамматика Python неоднозначна, поскольку(a,b) это кортеж, содержащийa а такжеb ноfoo(a,b) это вызов функции двух аргументов.

Таким образом, они сделали несовместимое изменение для 3, чтобы сделать программы менее двусмысленными и более регулярными.

(На самом деле, я думаю, что 2.7 ведет себя так же, как 2.6, но я не уверен.)

 Lennart Regebro31 мая 2011 г., 07:54
Нет, это не было «соблазнительно» использовать его как функцию. :) Тем не менее, было невозможно использовать его как функцию, поэтому вы не можете сделать [напечатать x для x в alist], например.

Ваш ответ на вопрос