Python

Материал из CustisWiki
Перейти к: навигация, поиск

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»