<dtml-var standard_html_header> <H1>Краткое введение в Питон</H1> <font size="-2">для людей, ушибленных перлом</font>. <P> Первое самое большое отличие, которое бросается в глаза - это синтаксическое выделение блоков. Традиционно, блоки в языках программирования группируются с помощью скобок (односимвольных скобок типа {} или скобок-ключевых слов типа begin/end). Автор Питона долгое время участвовал в проекте создания языка ABC, пригодного для обучения, и вынес из проекта идею синтаксического выделения блоков - отступом. В результате то, что в перле можно записать if (a eq b) { $x = 1; } в Питоне будет выглядеть <pre> if a == b: x = 1 </pre> с обязательным отступом во второй строке. В пределах блока отступ должен быть одинаков; размер табуляции жестко установлен равным 8 пробелам. <br> Оттуда же, из проекта ABC пришла идея, что операторы, начинающие вложенный блок, должны - для повышения читаемости - отделяться двоеточием. </P> <P> Впрочем, это не самое существенное, всего лишь синтаксические штучки. Есть вещи куда более существенные. <br> Итак, Питон - современный, весьма элегантный, красивый, мощный и удобный интерпретируемый расширяемый и встраиваемый объектно-ориентированный язык (со множественным наследованием). Во многих аспектах это совершенно классический процедурный язык, заимстовавший лучшие идеи из Си, Паскаля и других языков, при этом не попавший в ловушку эклектичности. В языке есть также элементы функционального программирования (конструкции lambda, map, reduce). </P> <P> Программы в Питоне состоят из модулей. Минимальная программа - это один файл, содержащий инструкции. <br> В более сложных программах программа состоит из нескольки файлов-модулей, которые она может использовать, импортируя из них имена. <br> Модули могут организовываться в иерархии каталогов и файлов. Например, иерархия модулей XML. Если программист хочет использовать один из модулей, его необходимо проимпортировать: import xml.sax, после чего можно использовать: xml.sax.feed(). <br> В отличи от перла, в котором доступностью имен управляет используемый пакет с помощью конструкции package, в Питоне видимостью имен управляет использующий (импортирующий) модуль. Вышеприведенную конструкцию можно переписать в виде <pre> from xml import sax sax.feed() </pre> или <pre> from xml.sax import feed feed() </pre> </P> <P> Первая тонкость, которую нужно помнить - во время исполнения программы существует 2 (два) пространства имен - глобальное для всего модуля, и локальное для текущей функции. Если из функции надо произвести запись в глобальную переменную, ее надо описать с помощью оператора global, например: <pre> my_global = 0 def set_it(x): global my_global my_global = x </pre> </P> <P> Если my_global - список, хэш или другая сложная структура, в которой мы хотим изменить подобъект, или my_global используется только для чтения - global не нужен. </P> <P> Эти 2 пространства приводят к некоторым (победимым) неудобствам. Например, если внутри функции описана функция: <pre> def f1(): x = 1 def f2(): y = x </pre> то f2 имеет доступ только к глобальным переменным, но не к локальным переменным функции f1. Лексической вложенности в Питоне нет. Функция lambda, создающая новую функцию, создает ее в глобальном пространстве имен. </P> <P> Тонкость номер два - как Питон хранит свои объекты и позволяет программисту их именовать и использовать. В Питоне все имена переменных - это имена ссылок на объекты, а не самих объектов. Оператора присваивания в Питоне нет вообще. Есть связывание - присваивание в переменную ссылки на объект. Например, a = 1 означает: создать объект типа ЦелоеЧисло, проинициализировать его значением 1, и адрес этого объекта записать в переменную a. Чуть подробнее об этом - в следующем параграфе. </P> <P> Тонкость номер три - время жизни объектов. Питон хранит для каждого объекта счетчик ссылок. При присваивании адреса объекта в переменную счетчик ссылок увеличивается, при разрыве связи - уменьшается. Когда счетчик ссылок достигает нуля - объект уничтожается. Подробный пример: <pre> a = 1 # Создать целое число 1, и его адрес поместить в a, счетчик ссылок # равен 1 b = a # Скопировать ссылку на объект из переменной a в переменную b; # счетчик ссылок объекта увеличивается и становится равным 2 a = 2 # Создать целое число 2, и его адрес поместить в a, счетчик ссылок # равен 1; при этом Питон видит, что связь объекта разорвана, # и уменьшит счетчик ссылок объекта 1, счетчик опять станет 1, # ссылка на него есть только в b b = 2 # Создать целое число 2, и его адрес поместить в b; при этом Питон # видит, что связь объекта разорвана, и уменьшит счетчик ссылок # объекта 1, счетчик станет 0, и объект 1 будет уничтожен. </pre> </P> <P> Адресной арифметики в Питоне нет, адреса можно только присваивать и сравнивать оператором is: a is b сравнит ссылки, лежащие в двух переменных. <br> Соответственно, конструкций типа a += b в Питоне нет тоже - ссылкой в a манипулировать нельзя, а для нормального сложения ссылку необходимо разименовать: a = a + b. </P> <P> Хотя переменная может ссылаться на любой объект, сами объекты имеют фиксированный тип данных. Питон - язык со строгой типизацией. В отличии от перла, число и строку сложить нельзя - надо в явном виде либо строку превратить в число, либо число в строку: <pre> a = "1" b = 2 x = a + str(b) # => "12" y = int(a) + b # => 3 </pre> </P> <P> Весьма важной особенностью современных языков является обработка ошибок. Питон предоставляет программисту оператор try и возможность определять свои собственные исключения/ошибки. <br> Тонкость, связанная с исключениями и временем жизни объектов. При возникновении исключения Питон формирует объект traceback - список на стек фреймов; фреймы, соответственно, хранят ссылки на переменные, поэтому эти переменные не будут автоматически удалены даже после завершения обработки исключения. Правильным ходом является удаление объекта traceback. </P> <P> Изначально в питоне исключения были строками, и это до сих пор поддерживается. но сейчас исключения - это экземпляры классов. Существует целая иерархия стандартных классов-исключений, и программист волен писать свои в любом потребном количестве. Никаких особых требований к классу-исключению не предъявляется. Класс этот может быть унаследован от любого стандартного класса, а может не иметь родительских классов вовсе. </P> <P> Тонкости, связанные с типами данных. </P> <P> В Питоне есть объекты неизменяемых и изменяемых типов данных. Числа, строки и n-ки - пример неизменяемых типов. Списки и хэши - изменяемые. </P> <P> Еще раз: строки - неизменяемые. Если надо заменить в строке 5-ый символ, строка разбивается и пересоединяется: <pre> s = "askjdhkfjghdf;gd" s1, s2 = s[:5], s[6:] # Индексы массивов в Питоне идут строго от нуля, к # сожалению s = s1 + 'H' + s2 </pre> </P> <P> Аналогом сишного null и перлового undef в Питоне является объект None. Это натуральный объект, занимающий место в памяти, имеющий тип None. Одно время в Питоне даже был баг, связанный с тем, что объект этот был изменяемым. :) </P> <P> Базовый, встроенный набор функций в Питоне хоть и довольно велик, но далеко уступает перлу. Встроенные функции предназначены в основном для самых базовых манипуляций - проверка/преобразование типа объекта, манипулирование с пространством имен и т.п. <br> Основные функции находятся в многочисленных модулях, и вот тут уже Питон никак не уступает перлу, причем функции эти и модули структурированы по областям применения: строковые манипуляции находятся в модуле string, регулярные выражения - в модулях re и regex/regexp, и т.д. Питон поставляется с большой стандартной библиотекой (часть модулей написана на Си, а большая часть - на питоне же), и в Интернете можно найти немало дополнительных модулей. А вот архива, эквивалентного CPAN, у Питона пока нет :( Но будет :) И процедуры инсталляции модулей третьих сторон пока еще не так чтобы сильно стандартизованы. Хотя и в этой области есть подвижки. <P> В Питоне нет интерполяции переменных. Есть аналог sprintf. То, что в перле пишется как "here $is", в Питоне будет "here %s" % is. </P> <dtml-var standard_html_footer>