М. Лутц - Изучаем Python (4-е издание)- 2011 (1126907), страница 90
Текст из файла (страница 90)
Как говорилось в главе 6, объекты имеют тип (например, целоечисло, список) и могут быть изменяемыми или нет. С другой стороны, имена(они же переменные) всегда являются всего лишь ссылками на объекты – онине имеют информации об изменяемости или о типе отдельно от типа объекта,на который они ссылаются в данный момент времени.Это вполне нормально, когда в разные моменты времени одно и то же имя связывается с объектами разных типов:>>> x = 0>>> x = “Hello”>>> x = [1, 2, 3]# Имя x связывается с целочисленным объектом# Теперь оно представляет строку# А теперь – списокВ последующих примерах вы увидите, что такая универсальная природа именможет рассматриваться как существенное преимущество при программировании на языке Python.1 В главе 17 вы узнаете, что имена находятся внутри области видимости, которая определяет, где эти имена могут использоваться, –место, где выполняется присваивание, определяет, где это имя будет видимо.Дополнительные предложения, касающиеся именования переменных, приводятся в предыдущем разделе «Соглашения поименованию», который, по сути, повторяет положения из полуофициального руководства по оформлению программного кодана языке Python, известного как PEP 8.
Это руководство доступно по адресу http://www.python.org/dev/peps/pep-0008. Его такжеможно отыскать в Сети, выполнив поиск по строке «PythonPEP 8». С технической точки зрения этот документ формализуетстандарты оформления исходных текстов, используемые в стандартной библиотеке языка Python.1Если вам приходилось пользоваться языком C++, возможно, вас заинтересует, чтов отличие от C++ в языке Python отсутствует объявление const. Некоторые объекты могут быть неизменяемыми, но имена всегда допускают выполнение операцииприсваивания.
Кроме того, в языке Python имеются средства сокрытия имен в классах и модулях, но они также не являются аналогами объявлений в языке C++ (есливам интересна тема сокрытия атрибутов, обращайтесь к обсуждению имен модулейвида _X в главе 24, имен классов вида __X в главе 30, а также к примерам декораторовклассов Private и Public в главе 38).360Глава 11. Присваивание, выражения и printНесмотря на важность стандартов, хочется сделать несколькообычных предупреждений.
Во-первых, документ PEP���������������������8 содержит множество тонкостей, встретиться с которыми вы, вероятно, еще не готовы. Честно говоря, этот документ более сложныйи субъективный, чем должен был бы быть, – некоторые из предложений не являются общепринятыми и не поддерживаютсяпрограммистами-практиками. Кроме того, некоторые из наиболее известных компаний, использующих язык Python, принялисобственные стандарты оформления программного кода.Тем не менее документ PEP 8 содержит действительно полезныесведения, и начинающим программистам совсем не лишним будет ознакомиться с ним – при условии, что рекомендации в нембудут восприниматься как рекомендации, а не как обязательноеруководство к действию.Инструкции выраженийВ языке Python выражения также могут использоваться в качестве инструкций (то есть в отдельной строке).
Однако, поскольку результат вычисления таких выражений не сохраняется, использовать такую возможность имеет смыслтолько в том случае, если выражение выполняет какие-то полезные действияв виде побочного эффекта. В качестве инструкций выражения используютсяобычно в двух ситуациях:Для вызова функций и методовНекоторые функции и методы выполняют огромный объем работы, не возвращая никакого значения. В других языках программирования такиефункции иногда называют процедурами. Поскольку они не возвращаютзначений, которые могло бы потребоваться сохранить, вы можете вызыватьэти функции в инструкциях выражений.Для вывода значений в интерактивной оболочкеВ ходе интерактивного сеанса интерпретатор автоматически выводит результаты вводимых выражений. С технической точки зрения они такжеявляются инструкциями выражений и играют роль сокращенной версииинструкции print.В табл. 11.4 перечислены некоторые наиболее часто используемые в языкеPython формы инструкций выражений.
При вызове функций и методов импередаются ноль или более объектов в виде аргументов (в действительности –выражений, результатом вычисления которых являются объекты) в круглыхскобках, следующих за именем функции или метода.Таблица 11.4. Наиболее часто используемые в языке Python инструкциивыраженийОперацияИнтерпретацияspam(eggs, ham)Вызов функцииspam.ham(eggs)Вызов метода361Инструкции выраженийОперацияИнтерпретацияspamВывод значения переменной в интерактивнойоболочке интерпретатораprint(a, b, c, sep=’’)Операция ввода в Python 3.0yield x ** 2Инструкция выражения yieldПоследние две строки в таблице представляют специальные случаи: как будет показано далее в этой главе, инструкция вывода в версии Python 3.0 былапреобразована в функцию, вызов которой обычно оформляется в виде отдельной строки, и операция yield в функциях-генераторах (рассматриваются в главе 20) также часто оформляется как инструкция.
В действительности оба случая являются всего лишь примерами инструкций выражений.Например, даже при том, что функция print вызывается в отдельной строке,как инструкция выражения, тем не менее она возвращает значение, как и любая другая функция (она возвращает значение None – оно возвращается всемифункциями, которые явно не возвращают какого-либо значимого значения):>>> x = print(‘spam’) # print – это выражение вызова функции в версии 3.0,spam>>> print(x)# но может использоваться, как инструкция выраженияNoneНесмотря на то, что выражения могут играть роль инструкций в языке Python,сами инструкции не могут использоваться в качестве выражений.
Например,язык Python не допускает встраивание инструкции присваивания (=) в выражения. Сделано это специально, чтобы помочь избежать ошибок, – вы моглибы случайно изменить переменную, введя вместо оператора проверки равенства == оператор присваивания =. В главе 13 будет показано, как отсутствие такой возможности может быть компенсировано в языке Python, когда мы будемобсуждать цикл while.Инструкции выраженийи непосредственное изменение объектовИнструкции выражений являются причиной распространенной ошибки припрограммировании на языке Python. Инструкции выражений часто используются для вызова методов списка, которые непосредственно изменяют самсписок:>>>>>>>>>[1,L = [1, 2]L.append(3)L2, 3]# Метод append изменяет сам списокОднако начинающие программисты нередко записывают такие операциив виде инструкций присваивания, пытаясь связать имя L со списком:>>> L = L.append(4)>>> print LNone# Но метод append возвращает значение None, а не L# Поэтому мы теряем весь список!Такая операция дает неверный результат – такие методы списка, как apend,sort и reverse, всегда выполняют непосредственное изменение объекта, но они362Глава 11.
Присваивание, выражения и printне возвращают список, который был изменен с их помощью. В действительности они возвращают объект None. Если результат такой операции присвоить тойже переменной, вы потеряете список (скорее всего, он будет уничтожен в ходепроцесса сборки мусора!).Поэтому не делайте этого. Мы еще раз вернемся к этому явлению в разделе«Распространенные ошибки программирования» в конце этой части книги,потому что подобные ситуации могут складываться в контексте выполнениянекоторых операторов цикла, с которыми мы познакомимся в последующихглавах.Операция printВ языке Python инструкция print – это просто удобный для программистов интерфейс к стандартному потоку вывода.С технической точки зрения эта инструкция преобразует объекты в текстовоепредставление и либо посылает результат в поток стандартного вывода, либопередает другому объекту, похожему на файл.
Инструкция 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), о сохранении которого стоило бы позаботиться.