М. Лутц - Изучаем Python (4-е издание)- 2011 (1126907), страница 91
Текст из файла (страница 91)
Так как в версии 3.0print – это обычная функция, для обращения к ней используется не какая-тоспециальная форма, а стандартный синтаксис вызова функций. Вследствиеэтого специальные режимы работы определяются с помощью именованных аргументов. Такая форма не только более универсальна, но и обеспечивает лучшую поддержку будущих расширений.Для сравнения, инструкция print в версии Python������������������������������������������������������������ 2.6 имеет специализированный синтаксис поддержки таких особенностей, как подавление вывода символа конца строки и перенаправление вывода в файл. Кроме того, инструкцияprint в версии 2.6 вообще не позволяет определить строки-разделители – в версии 2.6 вам намного чаще придется конструировать строки заранее, чем в версии 3.0.Формат вызоваСинтаксис вызова функции print в версии 3.0 имеет следующий вид:print([object, ...][, sep=’ ‘][, end=’\n’][, file=sys.stdout])Здесь элементы в квадратных скобках являются необязательными и могутбыть опущены, а значения, следующие за знаком =, определяют значения поумолчанию.
Проще говоря, эта встроенная функция выводит в файл streamодин или более объектов в текстовом представлении, разделенных строкой sep,и завершает вывод строкой end.Параметры sep, end и file, если они необходимы, должны передаваться нев виде позиционных, а в виде именованных аргументов, то есть с использованием специального синтаксиса «имя=значение». Именованные аргументыподробно рассматриваются в главе 18, но они достаточно просты в использовании. Именованные аргументы могут указываться в любом порядке в вызовефункции, но после объектов, предназначенных для вывода, и определяют параметры вывода:•• sep – строка, которая должна вставляться между объектами при выводе.По умолчанию состоит из одного пробела.
Чтобы подавить вывод строкиразделителя, в этом аргументе следует передать пустую строку.364Глава 11. Присваивание, выражения и print•• end – строка, добавляемая в конец выводимого текста. По умолчанию содержит символ конца строки \n. Если в этом аргументе передать пустую строку, следующий вызов функции print начнет вывод текста с позиции, где закончился вывод текущей строки.•• file – объект файла, стандартный поток или другой объект, похожий нафайл, куда будет выводиться текст. По умолчанию используется объектsys.stdout стандартного потока вывода. В этом аргументе можно передатьлюбой объект, поддерживающий метод файлов write(string); если передается настоящий объект файла, он должен уже быть открыт для записи.Текстовое представление любого объекта, который передается для вывода,функция print получает с помощью встроенной функции str. Как мы уже знаем, эта функция возвращает «удобочитаемое» строковое представление любого объекта.1 При вызове без аргументов функция print просто выведет символконца строки в поток стандартного вывода, что выглядит, как вывод пустойстроки.Функция print в действииПользоваться функцией print в версии 3.0 намного проще, чем можно былобы предположить, после знакомства с некоторыми ее особенностями.
Для����ил���люстрации выполним несколько коротких примеров. Ниже демонстрируетсяпорядок вывода объектов различных типов в поток стандартного вывода, используемый по умолчанию, со строкой-разделителем по умолчанию и с добавлением символа конца строки (эти значения параметров вывода были выбраны значениями по умолчанию, потому что они используются в подавляющембольшинстве случаев):C:\misc> c:\python30\python>>>>>> print()# Выведет пустую строку>>> x = ‘spam’>>> y = 99>>> z = [‘eggs’]>>>>>> print(x, y, z)# Выведет три объектаspam 99 [‘eggs’]В данном примере нет никакой необходимости преобразовывать объектыв строки, как этого требуют методы записи в файлы.
По умолчанию функцияprint выводит символ пробела между объектами. Чтобы подавить вывод пробела, достаточно просто передать пустую строку в именованном аргументе sepили указать иную строку-разделитель:1С технической точки зрения, при выводе объектов внутри используется не самафункция str, а некоторая эквивалентная реализация, хотя конечный результат получается тем же самым.
Имя str не только представляет функцию преобразованияв строку, но также является именем строкового типа данных и может использоваться для декодирования строк Юникода из строк байтов, принимая дополнительныйаргумент с названием кодировки, о чем подробно рассказывается в главе 36. Эта последняя роль является дополнительной особенностью, которую здесь можно спокойно игнорировать.365Операция print>>> print(x, y, z, sep=’’)spam99[‘eggs’]>>>>>> print(x, y, z, sep=’, ‘)spam, 99, [‘eggs’]# Строка-разделитель выводиться не будет# Нестандартная строка-разделительКроме того, в конце выводимой строки функция print добавляет символ концастроки.
Вывод�����������������������������������������������������������этого���������������������������������������������������������������������������������������������������������������символа�������������������������������������������������������������������������������������������������можно�����������������������������������������������������������������������������������подавить��������������������������������������������������������������������, передав�������������������������������������������������пустую����������������������������������строку��������������������в����������� ����именованном аргументе end. Точно так же в этом аргументе можно передать инойразделитель строк (включая символ \n, чтобы вручную обеспечить переводстроки):>>> print(x, y, z, end=’’)# Подавление вывода символа конца строкиspam 99 [‘eggs’]>>>>>>>>> print(x, y, z, end=’’); print(x, y, z) # Вывод двух строк в одной строкеspam 99 [‘eggs’]spam 99 [‘eggs’]>>> print(x, y, z, end=’...\n’) # Нестандартный разделитель строкspam 99 [‘eggs’]...>>>Допускается одновременное использование именованных аргументов, определяющих разделители между объектами в строке и между строками, – они могут указываться в любом порядке, но только после объектов, которые требуется вывести:>>> print(x, y, z, sep=’...’, end=’!\n’)spam...99...[‘eggs’]!>>> print(x, y, z, end=’!\n’, sep=’...’)spam...99...[‘eggs’]!# Несколько именованных аргументов# Порядок не имеет значенияНиже демонстрируется порядок использования именованного аргумента file –с его помощью можно перенаправить вывод текста в файл, открытый для записи, или в другой объект, совместимый с операцией вывода (в действительности – это разновидность перенаправления потоков, о чем будет рассказыватьсяниже в этом разделе):>>> print(x, y, z, sep=’...’, file=open(‘data.txt’, ‘w’)) # Вывод в файл>>> print(x, y, z)# Вывод в поток stdoutspam 99 [‘eggs’]>>> print(open(‘data.txt’).read()) # Вывод содержимого текстового файлаspam...99...[‘eggs’]Наконец, имейте в виду, что возможность определить строку-разделитель объектов в строке и разделитель строк, предоставляемая функцией print, – этовсего лишь подручное средство.
При необходимости получить более сложноеформатирование совсем не обязательно использовать эту возможность. Вместо этого можно сконструировать строку заранее или прибегнуть к помощиинструментов форматирования, с которыми мы встречались в главе 7, внутривызова функции print, и вывести сконструированную строку единственнымвызовом print:>>> text = ‘%s: %-.4f, %05d’ % (‘Result’, 3.14159, 42)>>> print(text)Result: 3.1416, 00042366Глава 11.
Присваивание, выражения и print>>> print(‘%s: %-.4f, %05d’ % (‘Result’, 3.14159, 42))Result: 3.1416, 00042Как мы увидим в следующем разделе, практически все, что было сказаноо функции print в Python 3.0, точно так же применимо и к инструкции printв версии 2.6, особенно если учесть, что функция задумывалась как дальнейшее развитие и улучшение поддержки операции вывода в 2.6.Инструкция print в Python 2.6Как уже упоминалось выше, операция вывода в Python 2.6 реализована в видеинструкции с уникальным и весьма специфическим синтаксисом, а не в видевстроенной функции. На практике же печать? организованная в 2.6, являетсявариацией на ту же тему – за исключением строк-разделителей (которые поддерживаются в версии 3.0 и не поддерживаются в версии 2.6), для всех остальных возможностей функции print в версии 3.0 имеют прямые аналоги в инструкции print в версии 2.6.Формы инструкцииВ табл. 11.5 перечислены формы инструкции print в ������������������������Python������������������ 2.6 и эквивалентные им вызовы функции print в Python 3.0.