Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 91
Текст из файла (страница 91)
Инструкция print тесно связанас понятием файлов и потоков в языке Python.Методы объектов файловВ главе 9 мы рассматривали некоторые методы для работы с файлами, которые выводят текст (например, file.write(str)). Инструкция print чем-то похожа на них, но она имеет более специализированное назначение: инструкция print по умолчанию записывает объекты в поток stdout (с соблюдениемнекоторого форматирования), в то время как методы файлов записываютстроки в произвольные файлы. В отличие от методов файлов, инструкцияprint не требует преобразовывать объекты в строковое представление.Поток стандартного выводаПоток стандартного вывода в языке Python (известный под именем stdout) –это просто объект, куда программы выводят текст.
Наряду с потоками стандартного ввода и стандартного вывода сообщений об ошибках, поток стандартного вывода является одним из трех потоков, которые создаются в момент запуска сценария. Поток стандартного вывода обычно отображаетсяна окно терминала, где была запущена программа на языке Python, еслиявно не было выполнено перенаправление вывода в файл или в конвейер системной командной оболочки.Так как поток стандартного вывода в языке Python доступен в виде объектаstdout из встроенного модуля sys (то есть sys.stdout), вполне возможно имитировать поведение инструкции print с помощью методов записи в файл, хотя использование print выглядит проще.Операция вывода является одной из тех, в которых различия между Python 3.0и 2.6 оказались наиболее заметными.
Фактически различия в реализации этойоперации являются одной из основных причин, обусловливающих невозможность выполнения программ, написанных для версии 2.X, под управлениемверсии 3.X без внесения изменений в программный код. В частности, от версииинтерпретатора зависит способ оформления операции print:•• В Python 3.X инструкция print превратилась во встроенную функцию, которая принимает именованные аргументы, определяющие специальные режимы вывода.Операция print363•• В Python 2.X print – это инструкция, имеющая свой характерный синтаксис.Так как в этой книге рассматриваются обе версии интерпретатора, 3.0 и 2.6,мы рассмотрим особенности реализации print в каждой из них по отдельности.Если вам повезло настолько, что вы работаете с программами, написаннымидля какой-то одной версии ��������������������������������������������������Python��������������������������������������������, вы можете прочитать только тот раздел, который подходит для вашего случая.
Однако ваша ситуация может измениться,поэтому для вас не будет лишним познакомиться с обеими версиями.Функция print в Python 3.0Строго говоря, print не является разновидностью инструкции в версии 3.0,это просто одна из инструкций выражений, с которыми мы познакомилисьв предыдущем разделе.Обычно вызов встроенной функции print оформляется в виде отдельной строки,потому что она не возвращает никакого значения (точнее, она возвращает объект None), о сохранении которого стоило бы позаботиться.
Так как в версии 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, – этовсего лишь подручное средство.