<dtml-var standard_html_header>

<H1>Краткое введение в Питон</H1>
<font size="-2">для людей, ушибленных перлом</font>.

<P>&nbsp;&nbsp;&nbsp;
   Первое самое большое отличие, которое бросается в глаза - это
синтаксическое выделение блоков. Традиционно, блоки в языках
программирования группируются с помощью скобок (односимвольных скобок типа
{} или скобок-ключевых слов типа begin/end). Автор Питона долгое время
участвовал в проекте создания языка ABC, пригодного для обучения, и вынес
из проекта идею синтаксического выделения блоков - отступом. В результате
то, что в перле можно записать if (a eq b) { $x = 1; } в Питоне будет
выглядеть
<pre>
   if a == b:
      x = 1
</pre>
с обязательным отступом во второй строке. В пределах блока отступ должен
быть одинаков; размер табуляции жестко установлен равным 8 пробелам.
<br>&nbsp;&nbsp;&nbsp;
   Оттуда же, из проекта ABC пришла идея, что операторы, начинающие
вложенный блок, должны - для повышения читаемости - отделяться двоеточием.
</P>

<P>&nbsp;&nbsp;&nbsp;
   Впрочем, это не самое существенное, всего лишь синтаксические штучки.
Есть вещи куда более существенные.
<br>&nbsp;&nbsp;&nbsp;
   Итак, Питон - современный, весьма элегантный, красивый, мощный и удобный
интерпретируемый расширяемый и встраиваемый объектно-ориентированный язык
(со множественным наследованием). Во многих аспектах это совершенно
классический процедурный язык, заимстовавший лучшие идеи из Си, Паскаля и
других языков, при этом не попавший в ловушку эклектичности. В языке есть
также элементы функционального программирования (конструкции lambda, map,
reduce).
</P>

<P>&nbsp;&nbsp;&nbsp;
   Программы в Питоне состоят из модулей. Минимальная программа - это один
файл, содержащий инструкции.
<br>&nbsp;&nbsp;&nbsp;
   В более сложных программах программа состоит из нескольки
файлов-модулей, которые она может использовать, импортируя из них имена.
<br>&nbsp;&nbsp;&nbsp;
   Модули могут организовываться в иерархии каталогов и файлов. Например,
иерархия модулей XML. Если программист хочет использовать один из модулей,
его необходимо проимпортировать: import xml.sax, после чего можно
использовать: xml.sax.feed().
<br>&nbsp;&nbsp;&nbsp;
   В отличи от перла, в котором доступностью имен управляет используемый
пакет с помощью конструкции package, в Питоне видимостью имен управляет
использующий (импортирующий) модуль. Вышеприведенную конструкцию можно
переписать в виде

<pre>
   from xml import sax
   sax.feed()
</pre>

или

<pre>
   from xml.sax import feed
   feed()
</pre>
</P>

<P>&nbsp;&nbsp;&nbsp;
   Первая тонкость, которую нужно помнить - во время исполнения программы
существует 2 (два) пространства имен - глобальное для всего модуля, и
локальное для текущей функции. Если из функции надо произвести запись в
глобальную переменную, ее надо описать с помощью оператора global, например:

<pre>
   my_global = 0

   def set_it(x):
      global my_global
      my_global = x
</pre>
</P>

<P>&nbsp;&nbsp;&nbsp;
   Если my_global - список, хэш или другая сложная структура, в которой мы
хотим изменить подобъект, или my_global используется только для чтения -
global не нужен.
</P>

<P>&nbsp;&nbsp;&nbsp;
   Эти 2 пространства приводят к некоторым (победимым) неудобствам.
Например, если внутри функции описана функция:

<pre>
   def f1():
      x = 1
      def f2():
         y = x
</pre>

то f2 имеет доступ только к глобальным переменным, но не к локальным
переменным функции f1. Лексической вложенности в Питоне нет. Функция
lambda, создающая новую функцию, создает ее в глобальном пространстве имен.
</P>

<P>&nbsp;&nbsp;&nbsp;
   Тонкость номер два - как Питон хранит свои объекты и позволяет
программисту их именовать и использовать. В Питоне все имена переменных -
это имена ссылок на объекты, а не самих объектов. Оператора присваивания в
Питоне нет вообще. Есть связывание - присваивание в переменную ссылки на
объект. Например, a = 1 означает: создать объект типа ЦелоеЧисло,
проинициализировать его значением 1, и адрес этого объекта записать в
переменную a. Чуть подробнее об этом - в следующем параграфе.
</P>

<P>&nbsp;&nbsp;&nbsp;
   Тонкость номер три - время жизни объектов. Питон хранит для каждого
объекта счетчик ссылок. При присваивании адреса объекта в переменную
счетчик ссылок увеличивается, при разрыве связи - уменьшается. Когда
счетчик ссылок достигает нуля - объект уничтожается.
   Подробный пример:

<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>&nbsp;&nbsp;&nbsp;
   Адресной арифметики в Питоне нет, адреса можно только присваивать и
сравнивать оператором is: a is b сравнит ссылки, лежащие в двух переменных.
<br>&nbsp;&nbsp;&nbsp;
   Соответственно, конструкций типа a += b в Питоне нет тоже - ссылкой в a
манипулировать нельзя, а для нормального сложения ссылку необходимо
разименовать: a = a + b.
</P>

<P>&nbsp;&nbsp;&nbsp;
   Хотя переменная может ссылаться на любой объект, сами объекты имеют
фиксированный тип данных. Питон - язык со строгой типизацией. В отличии от
перла, число и строку сложить нельзя - надо в явном виде либо строку
превратить в число, либо число в строку:

<pre>
   a = "1"
   b = 2
   x = a + str(b) # => "12"
   y = int(a) + b # => 3
</pre>
</P>

<P>&nbsp;&nbsp;&nbsp;
   Весьма важной особенностью современных языков является обработка ошибок.
Питон предоставляет программисту оператор try и возможность определять
свои собственные исключения/ошибки.
<br>&nbsp;&nbsp;&nbsp;
   Тонкость, связанная с исключениями и временем жизни объектов. При
возникновении исключения Питон формирует объект traceback - список на стек
фреймов; фреймы, соответственно, хранят ссылки на переменные, поэтому эти
переменные не будут автоматически удалены даже после завершения обработки
исключения. Правильным ходом является удаление объекта traceback.
</P>

<P>&nbsp;&nbsp;&nbsp;
   Изначально в питоне исключения были строками, и это до сих пор
поддерживается. но сейчас исключения - это экземпляры классов. Существует
целая иерархия стандартных классов-исключений, и программист волен писать
свои в любом потребном количестве. Никаких особых требований к
классу-исключению не предъявляется. Класс этот может быть унаследован от
любого стандартного класса, а может не иметь родительских классов вовсе.
</P>

<P>&nbsp;&nbsp;&nbsp;
   Тонкости, связанные с типами данных.
</P>

<P>&nbsp;&nbsp;&nbsp;
   В Питоне есть объекты неизменяемых и изменяемых типов данных. Числа,
строки и n-ки - пример неизменяемых типов. Списки и хэши - изменяемые.
</P>

<P>&nbsp;&nbsp;&nbsp;
   Еще раз: строки - неизменяемые. Если надо заменить в строке 5-ый символ,
строка разбивается и пересоединяется:

<pre>
   s = "askjdhkfjghdf;gd"
   s1, s2 = s[:5], s[6:] # Индексы массивов в Питоне идут строго от нуля, к
                         # сожалению
   s = s1 + 'H' + s2
</pre>
</P>

<P>&nbsp;&nbsp;&nbsp;
   Аналогом сишного null и перлового undef в Питоне является объект None.
Это натуральный объект, занимающий место в памяти, имеющий тип None. Одно
время в Питоне даже был баг, связанный с тем, что объект этот был
изменяемым. :)
</P>

<P>&nbsp;&nbsp;&nbsp;
   Базовый, встроенный набор функций в Питоне хоть и довольно велик, но
далеко уступает перлу. Встроенные функции предназначены в основном для
самых базовых манипуляций - проверка/преобразование типа объекта,
манипулирование с пространством имен и т.п.
<br>&nbsp;&nbsp;&nbsp;
   Основные функции находятся в многочисленных модулях, и вот тут уже Питон
никак не уступает перлу, причем функции эти и модули структурированы по
областям применения: строковые манипуляции находятся в модуле string,
регулярные выражения - в модулях re и regex/regexp, и т.д. Питон
поставляется с большой стандартной библиотекой (часть модулей написана на
Си, а большая часть - на питоне же), и в Интернете можно найти немало
дополнительных модулей. А вот архива, эквивалентного CPAN, у Питона пока
нет :( Но будет :) И процедуры инсталляции модулей третьих сторон пока еще не
так чтобы сильно стандартизованы. Хотя и в этой области есть подвижки.

<P>&nbsp;&nbsp;&nbsp;
   В Питоне нет интерполяции переменных. Есть аналог sprintf. То, что в
перле пишется как "here $is", в Питоне будет "here %s" % is.
</P>

<dtml-var standard_html_footer>