В чем преимущество новой функции печати в Python 3.x над оператором печати Python 2?

Я слышал несколько раз, что функция print (3.x) лучше, чем выражение (2.x). Но почему?

Я был поклонником этого утверждения в основном потому, что он позволил мне набрать еще два символа (т.е. круглые скобки).

Мне было бы интересно увидеть некоторые ситуации, когда оператор печати просто не сокращает его, а функция превосходит.

Ответ 1

Все, от Йохена, до ответа Свена, плюс:

Вы можете использовать print() в тех местах, где вы не можете использовать print, например:

[print(x) for x in range(10)]

Ответ 2

обоснование

Печатное выражение давно появилось в списках сомнительных языковых возможностей, которые должны быть удалены в 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

- PEP 3105 - сделать печать функции

Ответ 3

Одним из преимуществ 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)

Ответ 4

Я подумал над этим вопросом и понятия не имел о плюсах версии python 3. Но когда мне нужно было печатать столбцы pandas.DataFrame (без Index([...])), я обнаружил, что

print *df.columns

генерирует исключение, а

print(*df.columns)

отлично работает! И если вы хотите иметь одинаковые (настраиваемые) параметры печати в нескольких отзывах, вы можете сохранить их в словаре и передать как **print_options

Итак, как минимум *args, **kw_args трюки - хорошая причина для print как функции!

Ответ 5

Вы можете заменить встроенный 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)