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


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

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

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

5 59

5 ответов:

все, что сказал Йохен + Свен, плюс:

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

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

следующее от http://www.python.org/dev/peps/pep-3105/

оператор print уже давно появился в списках сомнительных языковых функций, которые должны быть удалены в Python 3000, таких как презентация Guido "Python Regrets" [1]. Таким образом, цель этого PEP не нова, хотя она может стать очень спорной среди разработчиков Python.

следующие аргументы для функции print () извлекаются из сообщения python-3000 с помощью Guido сам [2]:

  • печать-это единственная функциональность уровня приложения, которая имеет инструкцию, посвященную ей. В мире Python синтаксис обычно используется в качестве последнего средства, когда что-то не может быть сделано без помощи компилятора. Печать не имеет права на такое исключение.
  • в какой-то момент в разработке приложений довольно часто возникает необходимость заменить вывод печати чем-то более сложным, например, регистрировать вызовы или вызовы в некоторые другие операции ввода-вывода библиотека. С помощью функции print () это простая замена строки, Сегодня это беспорядок, добавляющий все эти скобки и, возможно, преобразующий синтаксис стиля потока.
  • наличие специального синтаксиса для печати создает гораздо больший барьер для эволюции, например, гипотетическая новая функция printf() не слишком далека, когда она будет сосуществовать с функцией print ().
  • нет простого способа преобразовать операторы печати в другой вызов, если вам нужен другой разделитель, а не пробелы, или вообще нет. Кроме того, нет простого способа удобно печатать объекты с каким-либо другим разделителем, кроме пробела.
  • если print () является функцией, было бы гораздо проще заменить его в одном модуле (просто def print(*args):...) или даже во всей программе (например, путем ввода другой функции в __builtin__.print). Как бы то ни было, это можно сделать, написав класс с помощью метода write() и назначив его sys.stdout -- это не плохо, но определенно намного больше концептуального скачок, и он работает на другом уровне, чем печать.

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