Лутц М. - Изучаем Python (1077325), страница 66
Текст из файла (страница 66)
Имена не имеют типа, тип — это характеристика объектов По большей части это лишь краткий обзор, но вы должны помнить, что крайне важно сохранить четкое понимание различий между именами и объектами в языке Ру1Ьоп. Как говорилось в главе 6 «Интерлюдия о динамической типизации», объекты имеют тип (например, целое число, список) и могут быть изменяемыми или нет. С другой стороны, имена (они же переменные) всегда являются всего лишь ссылками на объекты — они не имеют информации об изменяемости или о типе отдельно от типа объекта, на который они ссылаются в данный момент времени. Это вполне нормально, когда в разные моменты времени одно и то же имя связывается с объектами разных типов: »> х = О № Иия к саяаыааатся с целочисленная обьектои »> х = "Н«11о" № Теперь оно представляет строку »> х = (1, 2, 3) № А теперь - список В последующих примерах вы увидите, что такая универсальная природа имен может рассматриваться как существенное преимущество при программировании на языке Ру(йоп.' В четвертой части книги вы Если вам приходилось пользоваться языком С++, возможно, ввс заинтересует, что в отличие от С++ в языке Рус!>оп отсутствует объявление салат.
Некоторые объекты могут быть неизменяемыми, но имена всегда допускают выполнение операции присваивания. Кроме того, в языке Русйоп имеются средства сокрытия имен в классах и модулях, во овн также ве являются аналогами объявлений в азыке С+э. Инструкции выражений узнаете, что имена находятся внутри области видимости, которая определяет, где эти имена могут использоваться — место, где выполня- ется присваивание, определяет, где это имя будет видимо. Инструкции выражений В языке Ру(Ьоп выражения также могут использоваться в качестве инструкций (т.
е. в отдельной строке). Однако, поскольку результат вычисления таких выражений не сохраняется, использовать такую возможность имеет смысл только в том случае, если выражение выполняет какие-то полезные действия в виде побочного эффекта. В качестве инструкций выражения используются обычно в двух ситуациях: Длл вызова функций и метподов Некоторые функции и методы выполняют огромный объем работы, не возвращая никакого значения. В других языках программирования такие функции иногда называют процедурами. Поскольку они не возвращают значений, которые могло бы потребоваться сохранить, вы можете вызывать эти функции в инструкциях выражений.
Длл вывода значений в интерактивной оболоске В ходе интерактивного сеанса интерпретатор автоматически выводит результаты вводимых выражений. С технической точки зрения они также являются инструкциями выражений и играют роль сокращенной версии инструкции рг(пт. В табл. 11.4 перечислены некоторые наиболее часто используемые в языке Ру$Ьоп формы инструкций выражений. При вызове функций и методов им передаются ноль или более объектов в виде аргументов (в действительности — выражений, результатом вычисления которых являются объекты) в круглых скобках, следующих за именем функции или метода. Таблица 11.4. Наиболее часто используемые в языке Рут)топ инструкции выражений Операция Интерпретация Вызов функции Вызов метода враз(е99в, Ьае) врзе.ьзв(е99в) Вывод значения переменной в интерактивной оболочкеинтерпретатора враз Составное выражение Проверка на принадлежность диапазону врез < (1ав асс Ьав != еррв враз < Еае < е99в Последняя строка в таблице представляет специальную форму: язык РуьЬоп позволяет объединять операции сравнения, чтобы выполнить серию сравнений в таких операциях, как проверка на принадлежность Э06 Глава 11.
Присваивание, выражения и рпп1 диапазону значений. Например, выражение (А < В < С) проверяет, принадлежит ли В диапазону значений от А до С вЂ” оно эквивалентно логическому выражению (А < В апд В < С), но оно проще воспринимается визуально (и его проще вводить). Составные выражения обычно не записываются в виде самостоятельных инструкций, но с точки зрения синтаксиса являются вполне допустимыми и могут быть даже полезными при работе в интерактивной оболочке, когда вы не уверены в результате выражения. Несмотря на то, что выражения могут играть роль инструкций в языке РуФЬоп, сами инструкции не могут использоваться в качестве выражений.
Например, язык РуФЬоп не допускает встраивание инструкции присваивания (=) в выражения. Сделано это специально для того, чтобы помочь избежать ошибок — вы могли бы случайно изменить переменную, введя вместо оператора проверки равенства == оператор присваивания =. В главе 13 будет показано, как отсутствие такой возможности может быть компенсировано в языке РуФЬоп, когда мы будем обсуждать цикл щл1)е. Инструкции выражений и непосредственное изменение объектов Инструкции выражений являются причиной распространенной ошиб- ки при программировании на языке РуФЬоп.
Инструкции выражений часто используются для вызова методов списка, которые непосредст- венно изменяют сам список: »>(=[1, г] »> Ы вррепв(3) »> [1, 2, 3] в Метод вррепс изиеняет сви список Однако начинающие программисты нередко записывают такие опера- ции в виде инструкций присваивания, пытаясь связать имя С со спи- ском: »> ь = Ы аррвпз(4) в Но иетод вррепс возвращает значение попе, в не 1 »> рг1пс ( в Позтоиу ив теряеи весь список! Мове Такая операция дает неверный результат — такие методы списка, как арепС, вог1 и геуегве, всегда выполняют непосредственное изменение объекта, но они не возвращают список, который был изменен с их по- мощью.
В действительности они возвращают объект Моле. Если результат такой операции присвоить той же переменной, вы потеряете список (скорее всего, он будет уничтожен в ходе процесса сборки мусора!). Поэтому не делайте этого. Мы еще раз вернемся к этому явлению в разделе «Распространенные ошибки программирования» в конце этой части книги, потому что подобные ситуации могут складываться в кон- инструкция рппт тексте выполнения некоторых операторов цикла, с которыми мы по- знакомимся в последующих главах. Инструкция рпп1 Инструкция ргтпт производит вывод на экран — это просто удобный для программистов интерфейс к стандартному потоку вывода.
С технической точки зрения эта инструкция преобразует объекты в текстовое представление и посылает результат на устройство стандартного вывода. Поток стандартного вывода в языке Рус)топ — это то же самое, что этсоп1 в языке С; обычно он отображается на окно, в котором была запущена программа на языке РуФЬоп (если стандартный вывод не был перенаправлен в файл или в канал средствами системной командной оболочки). В главе 9 мы рассматривали некоторые методы для работы с файлами, которые выводят текст.
Инструкция рг(пт чем-то похожа на них, но она имеет более специализированное назначение: инструкция рг)пт записывает объекты в поток зтбоит (с соблюдением некоторого форматирования по умолчанию), в то время как методы файлов записывают строки в произвольные файлы.
Так как поток стандартного вывода в языке РуьЬоп доступен в виде объекта зтбоит встроенного модуля зуз (т. е., эуэ. этбоит), вполне возможно имитировать поведение инструкции рг1пт с помощью методов записи в файл, хотя использование р г1п т выглядит проще. Таблица 11.5. Перечень форм инструкции рг1пт Интерпретация Операция Вывод объектов в эуэ. этзоот; добавляет пробел между объектами и символ конца строки рг1пт прав, Пав То же самое, только на этот раз символ конца строки не добавляется ргтш прав, пав, Текст передается методу вут11е,нгме, а не эуэ. эшош. чгме ргют» вуг>1е, прав, пав Мы уже видели инструкцию рг1пт в действии.
По умолчанию она до- бавляет пробел между элементами, отделенными запятыми, и символ конца строки в конце текущей строки вывода: »>х= 'а' »>у= Ь >» рг1пт х, у а Ь Такое форматирование — всего лишь значение по умолчанию, которое можно использовать или нет. Чтобы подавить вывод символа конца строки (чтобы позднее можно было продолжить вывод текста в текущую зов строку), инструкцию рг)п1 следует завершать символом запятой, как показано во второй строке табл. 11.5.