Python
Python современный, очень популярный, красивый, мощный и удобный интерпретируемый, расширяемый и встраиваемый, объектно-ориентированный язык (со множественным наследованием), включающий даже элементы функционального программирования. То есть это живой язык, активно использующийся для программирования как «обычных», пользовательских приложений, с переносимым оконным (см. например wxPython), или веб-приложений (см. например Zope). Растет его сфера использования в научных целях, для прототипирования и разработки новых алгоритмов, для анализа или визуализации данных (см. например Scientific Python). Здесь, мы рассмотрим только базовые свойства синтаксиса, чтобы можно было устранить непонимание текстов, отдельных, не больше страничек, функций и процедур на Python, а за всем остальным, добро пожаловать на http://www.python.org.
Здесь мы представим краткое введение в язык Python, в первую очередь для того, чтобы обеспечить однозначное понимание представленных на языке Python алгоритмов.
Вообще, трудно найти другой язык, одновременно пригодный для обучения с одной стороны, и достаточно мощный, для реализации реальных приложений (включая научные). Дело в том, что автор Питона (Guido van Rossum) долгое время участвовал в проекте создания языка обучения программированию ABC, который должен был заменить BASIC, и вынес из проекта несколько ценных идей, как минимизировать синтаксические накладные расходы, которые необходимы в реальном языке программирования (сложные декларации, открытия/закрытия блоков), избежав при этом каббалистического минимализма (доступных только адептам пониманию взаимодействия спецсимволов типа
"<\@\%\$\^">)
в языках типа Perl.
В питоне была применена идея синтаксического выделения блоков с помощью отступов (в пределах блока отступ должен быть одинаков), кроме того операторы, начинающие вложенный блок, должны, для повышения читаемости, отделяться двоеточием:
if len(EP)>0: # ищем вершину, к которой можно добавить цикл for i in range(0,len(EP)): if G.degree(EP[i])>0: v=EP[i] break else: # Подготавливаем пока пустой EP к присоединению цикла v=G.nodes()[0] # выбираем первую попавшуюся вершину EP.append(v) # и добавляем ее в EP i=0
Далее, все переменные в питоне являются однотипными ссылками на объекты. Таким образом, устраняется необходимость декларации переменных, переменная определяется в момент первого присваивания и тип хранимого в ней объекта может быть переопределен последующими присваиваниями.
def euler_circuit(G): EP=[] # Эйлеров цикл - массив вершин.
Кстати, можно присваивать одно и то же значение нескольким переменным одновременно:
>>> x = y = z = 0 # Присвоим нуль переменным x,y,z >>> x 0
Также, интерпретатор берет на себя все управление памятью (резервирование, сборка мусора и т. п.).
Непосредственно в язык встроенны не только примитивные типы данных, как числа и строки, но и более сложные структуры: Кортежи (touples):
>>> a=(3,2,1); >>> print a[0]; 3 >>> print a[2]; 1 >>>
(к сожалению, индексы в Pythonе, также как и в C, 0-based — увы).
Эффективно реализованные словари или хэши (hash):
>>> passwords={'stas': 'mysecret555', 'olga': 'mobydick'}; >>> print passwords['stas']; mysecret555 >>> print passwords['olga']; mobydick >>> passwords['oleg']='hellraiser'; >>> print passwords['oleg']; hellraiser
Списки или последовательности (list) (включая операции по slicinгу):
>>> a=[1,2,4,8,16,32]; >>> print a[3]; 8 >>> print a[3:]; [8, 16, 32] >>> print a[:3]; [1, 2, 4] >>> print a[1:3]; [2, 4] >>> a.append(64); >>> print a [1, 2, 4, 8, 16, 32, 64] >>> a.insert(0,-22); >>> print a [-22, 1, 2, 4, 8, 16, 32, 64]
Теперь перечислим основные операторы.
Оператор if:
if x < 0: x = 0 elif x == 0: print 'Это число - нуль' elif x == 1: print 'Это число - 1' else: print `Это число больше единицы'
Оператор for имеет вид
for некая_переменная in некий_диапазон :
Блок кода после заголовка выполняется, пока некая_переменная принадлежит некому_диапазону (причем этот диапазон может быть списком, числовой последовательностью, массивом каких-либо значений), а если нужно просто организовать цикл «от a до b», то для этого можно воспользоваться функцией range(a, b+1), которая вернет соответствующий список:
for i in range(0,len(EP)): if G.degree(EP[i])>0: v=EP[i] break
Да, для выхода из цикла можно использовать оператор break.
Есть и цикл while, который выполняется пока истинно указанное выражение:
while (N>0): if ((N % 2)==0): X=X*X % m N=N/2 else: y=y*X %m N=N-1 print N,X,y
Понятна и проста декларация любой функции или процедуры (заметим, что декларации могут быть вложенными):
def gcd(a, b): print a,b if a == 0: return b return gcd(b % a, a)
Для возврата значений (тип которых, кстати, может быть тоже любым), очевидно, используется return.
А оператор print печатает содержимое переданных ему аргументов, пытаясь придать печатный вид кортежам, спискам и словарям.
Строковые литералы
Очень эстетически приятной вещью в Pythonе является многообразие строчных литералов — то есть строковых констант. Литералы могут быть однострочные и многострочные, использовать escape-последовательности или не использовать, что дает возможность замечательным образом вставлять в Python-код блоки текста на других языках (программирования или разметки), например:
strSQL = """ SELECT a, b, c, d FROM vtable WHERE a=5 """
или
strTeX = r''' \vspace{1cm} {\Large %s} \vspace{1cm} \begin{center} Вариант %s \end{center} ''' % (strTitle, intVariant)
То есть упрощая стандартную документацию, можно сказать что кавычки для литералов могут быть
- одинарными или двойными в смысле выбора символа ' или "
- и одинарными или троекратными в смысле повторения — троекратные удобны для многострочных блоков, чтобы не мучаться, добавляя в конец каждой строки escape-символ перевода — \r.
Также, перед первой кавычкой строкового литерала может идти префикс (один или несколько символов), поясняющих тип константы — обычная, юникод или raw-строка. Например префикс «r» (raw) избавляет (упрощенно говоря — точнее см. документацию к Python) символ «\» от его escape-функции, что дает, например возможность, без проблем включать блоки текста в TeX-разметке.
Ссылки
- Бинарные сборки под Windows большинства пакетов (многие из которых не встанут без трудоемкой настройки компиляторов) → http://www.lfd.uci.edu/~gohlke/pythonlibs/
Любые правки этой статьи будут перезаписаны при следующем сеансе репликации. Если у вас есть серьезное замечание по тексту статьи, запишите его в раздел «discussion».
Репликация: База Знаний «Заказных Информ Систем» → «Python»