2010-12-10 3 views
10

Почему print ключевое слово в python, а не функция?Почему печать не является функцией в python?

+2

см. Http://www.python.org/dev/peps/pep-3105/ – jfs

+0

интересный; никогда не считал это проблемой, но хорошим вопросом. –

+0

readln и writeln были встроенными в Turbo Pascal. Никогда не понимал, почему, и мне понравилось C лучше для их функций. – sashoalm

ответ

12

Потому что Гвидо решил, что совершил ошибку. :)

С тех пор было исправлено: попробуйте Python 3, который посвящает section of its release notes описанию изменения функции.

Весь фон, см. PEP 3105 и несколько ссылок, приведенных в его разделе «Ссылки»!

+0

Я еще не возился с Python 3. Ключевое слово печати все еще работает? – user538442

+2

Нет. Теперь это функция. В простом случае 'print 'foo" 'становится' print ("foo") ' –

+0

Исправлено как в« теперь функция »:) –

2

Теперь функция в Python 3.

+0

Кажется странным потребовалось 10+ лет, чтобы исправить его – user538442

+1

@user: Это не обязательно вопрос времени, как вопрос совместимости, как вперед, так и назад. –

+4

@ user538442: Обратная совместимость - это сука :( – delnan

1

print заявление в Python 2.x имеет специальный синтаксис, который не будет доступен для обычной функции. Например, вы можете использовать трейлинг-код , для подавления вывода окончательной новой строки, или вы можете использовать >> для перенаправления вывода в файл. Но все это не было достаточно убедительным даже для самого Guido van Rossum, чтобы сохранить его утверждение - он превратил print в функцию в Python 3.x.

+0

Uhhh, теперь это начинает иметь смысл. – user538442

+0

Итак, дополнительная функциональность теперь потеряна, например, как trailing, и >> – user538442

+5

Это все еще есть, но теперь вы используете 'end =' и 'file =' параметры ключевого слова вместо специального синтаксиса. – dan04

8

printбыл заявление в Python, потому что это было заявление в ABC, основной вдохновения для Python (хотя это называлось WRITE там). Это, в свою очередь, вероятно, имело утверждение вместо функции, поскольку это был учебный язык и как таковой вдохновлял основной. Python, с другой стороны, оказался не просто языком обучения (хотя для этого тоже хорошо).

Однако в настоящее время printявляется a. Да, в Python 2 вы также можете сделать

from __future__ import print_function 

и все вы настроены. Работает с Python 2.6.

1

Ответ, который рисует от того, что я ценю о print заявлении, но не обязательно из официальной истории Python ...

Python, в некоторой степени, язык сценариев . Теперь существует множество определений «язык сценариев», но тот, который я буду использовать здесь, - это язык, предназначенный для эффективного использования коротких или интерактивных программ. Такие языки, как правило, допускают однострочные программы без чрезмерного шаблона; упростить ввод клавиатуры (например, избегая чрезмерной пунктуации); и обеспечить встроенный синтаксис для общих задач (удобство при возможном расходе чистоты). В случае Python печать значения - очень обычная вещь, особенно в интерактивном режиме. Требование print быть функцией кажется излишне неудобным здесь. Существует значительно более низкий риск ошибки со специальным синтаксисом, который делает правильную вещь в 99% случаев.

+0

К этому аргументу 'input' также должен быть оператор. – steffen

0

брошу в моих мыслях об этом:

В Python 2.x print не заявление по ошибке, или потому, что печать на stdout такое основное, что нужно сделать. Все остальное настолько продумано или по крайней мере понятно, что ошибка этого порядка кажется странной. Если общение с stdout было бы таким основным, общение с stdin было бы столь же важно, но input() - это функция.

Если вы посмотрите на list of reserved keywords и list of statements, которые не являются выражениями, print четко выделяется, что является еще одним намеком на то, что должны быть очень конкретные причины.

Я думаю printбыло быть заявление, а не выражение, чтобы избежать нарушения безопасности в input(). Помните, что input() в Python2 оценивает все типы пользователей в stdin. Если пользователь набрал print a и a, будет храниться список всех паролей, которые были бы катастрофическими.

По-видимому, способность input() оценивать выражения считалась более важной, чем print, являющейся нормальной встроенной функцией.

Смежные вопросы