Ответ 1
Все, от Йохена, до ответа Свена, плюс:
Вы можете использовать print()
в тех местах, где вы не можете использовать print
, например:
[print(x) for x in range(10)]
Я слышал несколько раз, что функция print (3.x) лучше, чем выражение (2.x). Но почему?
Я был поклонником этого утверждения в основном потому, что он позволил мне набрать еще два символа (т.е. круглые скобки).
Мне было бы интересно увидеть некоторые ситуации, когда оператор печати просто не сокращает его, а функция превосходит.
Все, от Йохена, до ответа Свена, плюс:
Вы можете использовать print()
в тех местах, где вы не можете использовать print
, например:
[print(x) for x in range(10)]
обоснование
Печатное выражение давно появилось в списках сомнительных языковых возможностей, которые должны быть удалены в Python 3000, таких как презентация Guido "Python Regrets" [1]. Таким образом, цель этого PEP не нова, хотя она может стать предметом споров среди разработчиков Python.
Следующие аргументы для функции print() взяты из сообщения python-3000 самим Гвидо [2]:
- print - единственная функциональность уровня приложения, для которой есть выделенное утверждение. В мире Python синтаксис обычно используется в качестве крайней меры, когда что-то не может быть сделано без помощи компилятора. Печать не подходит для такого исключения.
- В какой-то момент в разработке приложений очень часто возникает необходимость заменить вывод на печать чем-то более сложным, например, записывать вызовы или вызовы в какую-то другую библиотеку ввода-вывода. С функцией print() это простая замена строки, сегодня это беспорядок, добавляющий все эти скобки и, возможно, конвертирующий >> синтаксис стиля потока.
- Наличие специального синтаксиса для печати создает гораздо больший барьер для эволюции, например, гипотетическая новая функция printf() не слишком далеко выбирается, когда она сосуществует с функцией print().
- Нет простого способа преобразовать операторы print в другой вызов, если нужен другой разделитель, без пробелов или вообще без них. Кроме того, нет простого способа для удобной печати объектов с каким-либо другим разделителем, кроме пробела.
- Если print() - это функция, было бы намного проще заменить ее в одном модуле (просто
def print(*args):...
) или даже во всей программе (например, поместив другую функцию в__builtin__.print
). На самом деле, это можно сделать, написав класс с помощью метода write() и присвоив его sys.stdout - это неплохо, но, безусловно, гораздо больший концептуальный скачок, и он работает на другом уровне, чем print
Одним из преимуществ print
как функции является согласованность. Нет никаких оснований для этого утверждения. Сравните эти две строки
2.x: print >> my_file, x
3.x: print(x, file=my_file)
Новая версия больше похожа на Python, не так ли?
Другим преимуществом версии функции является гибкость. Например, если вы хотите поймать все вызовы print
для целей отладки, теперь вы можете просто переопределить print
:
def print(*args, **kwargs):
# whatever
__builtins__.print(*args, **kwargs)
Я подумал над этим вопросом и понятия не имел о плюсах версии python 3. Но когда мне нужно было печатать столбцы pandas.DataFrame
(без Index([...])
), я обнаружил, что
print *df.columns
генерирует исключение, а
print(*df.columns)
отлично работает! И если вы хотите иметь одинаковые (настраиваемые) параметры печати в нескольких отзывах, вы можете сохранить их в словаре и передать как **print_options
Итак, как минимум *args
, **kw_args
трюки - хорошая причина для print
как функции!
Вы можете заменить встроенный print
на пользовательский:
import os
import sys
def print(s):
sys.stderr.write('Will now print ' + str(s) + '.' + os.linesep)
sys.stdout.write(str(s) + os.linesep)
print(['A', 'list'])
# Output:
# stderr: Will now print ['A', 'list'].
# stdout: ['A', 'list']
Вы можете использовать print
внутри лямбда или вызова функции и т.д.:
example_timeout_function(call=lambda: print('Hello world'), timeout=5)
do_things(print_function=print)