В чем преимущество новой функции print в Python 3.x над инструкцией печати Python 2?
Я слышал несколько раз, что печать является функция (3.x) лучше, чем это утверждение (2.икс.) Но почему?
Я был поклонником того, что это утверждение в основном потому, что оно позволило мне ввести два меньших символа (т. е. скобки).
Мне было бы интересно увидеть некоторые ситуации, когда оператор печати просто не сокращает его, а функция превосходит.
5 ответов:
все, что сказал Йохен + Свен, плюс:
можно использовать
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 -- это не плохо, но определенно намного больше концептуального скачок, и он работает на другом уровне, чем печать.
одно преимущество
2.x: print >> my_file, x 3.x: print(x, file=my_file)
новая версия выглядит гораздо больше, как Python, не так ли?
другое преимущество версии функции гибкость. Например, если вы хотите поймать все
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
трюки-хорошая причина для
вы можете заменить встроенный
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']
можно использовать
example_timeout_function(call=lambda: print('Hello world'), timeout=5) do_things(print_function=print)