Предварительная информация

0. Python

Python – интерпретируемый язык высокого уровня. Это означает, что программа переводится в машинные команды НЕПОСРЕДСТВЕННО в процессе выполнения.

В таблице перечислены особенности языка Python.

Свойство Достоинства Недостатки
Интерпретатор ГИБКОСТЬ Одна и та же программа может выполнять разные действия в зависимости от состояния системы (можно попросить пользователя ввести ЛЮБУЮ команду и выполнить ее) МЕДЛЕННОСТЬ выполнения. Для выполнения каждой команды необходимо перевести ее в машинный код
Нет описания данных (выделение и освобождение памяти происходит автоматически) Простота кода, использование малого количества символов Возможность ошибки
Вложенность команд определяется отступами Хорошая читаемость, короткий код  
Оперирование объектами Использование ЛЮБОГО элемента в едином стиле  
Единая концепция для разных платформ Кросплатформенность  

1.Установка и настройка

Особое удобство языка Python определяется большим количеством свободно распространяемых модулей, которые можно найти в интернете. Все модули имеют ЕДИНЫЙ стиль использования и не требуют компилирования перед установкой. Все это делает Python настолько кроссплатформенным языком, что кусочек программы взятый со страницы в интернете легко запустится у вас на компьютере.

Набор пакетов для полноценной работы:

  • Python 2.7 - язык программирования, стандартные модули, документация www.python.org
  • NumPy - поддержка массивов, быстрые вычисления с массивами + линейная алгебра http://www.numpy.org/
  • SciPy – математический аппарат для ученого (спец функции, случайные величины, БПФ, решение уравнений) http://www.scipy.org/scipylib/index.html
  • MatPlotLib – построение графиков, диаграмм 2D (интерактивный режим, сохранение в файл) http://matplotlib.org/
  • PIL (Python Image Library) – работа с растровой графикой (чтение, обработка, извлечение информации, запись) http://www.pythonware.com/products/pil/
  • EnthoughPyton – комплексное решение + 3-d визуализатор MayaVi, система интерактивного создания программ IPython https://www.enthought.com/products/epd/

Платформы:

  • Windows – используются установщики
  • Linux – базовая версия входит в систему + дополнения устанавливаются через RPM пакеты

Внимание

пакеты должны соответствовать вашей конфигурации оборудования (AMD или Intel, 32- 64-bit) и версии языка Python (2.6 или 2.7).

2. Работа с Python

Режим Вызов Описание
Интерактивный режим python режим в котором интерпретатор выполняет команду после ее ввода с клавиатуры (данные накапливаются в памяти)
Режим отладки python –i file выполняются команды из файла, интерпретатор остается после выполнения файла (все данные выполнения файла доступны)
Режим выполнения python file выполняются команды из файла, интерпретатор закрывается

Кроме указанных выше стандартных режимов можно осуществлять режим пошагового выполнения программы (при подключении соответствующего модуля).

3. Структура языка

3.1 Типы данных и объектно-ориентированное построение языка Python

Тип определяет область допустимых значений объекта и набор операций над ним. Тип подразумевает пассивное поведение объекта, т.е. действия, которые производятся над ним никак не связаны с определением типа, они описываются отдельно.

Класс - тип + поведение (действия объекта, состоящими в изменении внутреннего состояния и вызовами методов других объектов). Т.е. элемент класса содержит способы изменения своего внутреннего состояния и способы взаимодействия с элементами других классов.

Пример (автоматическое преобразование типов):

>>> x=3.
>>> y=1+2j
>>> y+x
4+2j

Прежде чем произвести операцию сложения Класс(y) должен преобразовать Объект (x) в свой тип. Если в описании класса не заложена такая возможность, то возникает ошибка. В Python все типы являются классами!!!

Python это объектно-ориентированный язык программирования, т.е.

  1. Все данные в нем представляются объектами.
  2. Каждый объект имеет собственную часть памяти и может состоять из других объектов.
  3. Каждый объект имеет тип (принадлежит классу)
  4. Все объекты одного типа могут принимать одни и те же сообщения (и выполнять одни и те же действия).

Для каждого объекта (число, функция, список, и т.д.) задан набор свойств (данных, хранящихся в объекте) и методов (способов использования объекта). Простые объекты (числа) могут рассматриваться традиционным образом, хотя на самом деле, операции над ними «+, -, *, /» и преобразование типов включены в описание их класса.

Типы данных Функция преобразования Пример присваивания Примечания
Целый (integer) int() a = 134  
Большой целый(long) long() a = 1L  
Вещественный (float) float() a = 1. a = 3.1415  
Комплексный(complex) complex() a = 1+2j  
Логический (boolean) bool() a = True a = False  
Строка (string) str() a=’12414dfgas’ a=”123dfasdf” a=”””rqw 1211dsfasf daffa””” поддержка многострочных выражений (тройные кавычки)
Список (list) list()
a = [12,’sd’,1,b]
(b-имя переменной)
индексация (считывание, запись), добавление, исключение, упорядоченность, сортировка, поиск и перебор
Кортеж (tuple) tuple()
a = (12,’sd’,1,b)
(b-имя переменной)
индексация (считывание, запись), упорядоченность, поиск и перебор
Словарь (dictionary) dict()
a={1:123,’df’:13,’qw’:b}
(b-имя переменной)
индексация (считывание, запись), добавление, исключение
Множество (set) set()
a = set(1,4,’34’,b)
(b-имя переменной)
добавление, исключение, поиск и перебор

3.2 Операции над данными

Все перечисленные ниже операции реализуются для каждого типа данных внутри соответствующего класса. Можно доопределить операции, которые не определены в стандартном Python (например умножение строк). Способ использования переменных определенного типа (объектов класса) заложен в описании класса, например список, кортеж и строка поддерживают операцию взятия среза (выбора элементов). Многие типы (список, кортеж, строка, итератор) поддерживают перебор элементов и, следовательно, могут использоваться в операторе «for» или функциях «sum», «max». Есть объекты (функции), поддерживающие вызов, т.е. их можно вызывать, например «min(*arg)». Можно доопределить операцию вызова для разных типов данных, например строк и использовать строки, для вызова функций по названию.

Пример.

Доопределяем класс строки – строка поддерживает операцию вызова.

string.__call__(self,*arg):
   try:
      apply(self.st,*arg)
   except:
      print ‘No function ’+self.st

Используем строку, как функцию

>>> s = ’max’
>>> s([1,2,3,4,5])
5
  • Встроенные математические функции и операции (бинарные функции)
Операция Описание
a + b сумма
a - b разность
a * b умножение
a / b деление
a ** b степень
a % b деление по модулю (остаток от деления)
abs(a) модуль
  • Операции сравнения
Операция Описание
a == b равно
a != b или a<>b не равно
a < b меньше
a > b больше
a <= b меньше равно
a >= b больше равно
  • Встроенные логические операции
Операция Описание
a or b a или b
a and b a и b
not a не a
a in b a содержится в b
  • Встроенные операции
Операция Описание
a[1] обращение к элементу
a[i:j] обращение к срезу (части) для list и tuple
a.b доступ к атрибуту (части объекта)
a() выполнение (вызов) объекта (например вызов функции)

3.3. Операторы

Python представляет пользователям набор стандартных элементов программирования, представленных в таблице. Обратите внимание, что вложенность конструкций при программировании определяется ОТСТУПАМИ.

  • Цикл «FOR»
for i in (1,2,’rt’,5):
   operator1
   operator2
   ...

i по очереди принимает значения из набора данных

  • Цикл «WHILE»
while i<10:
   i += 0.1
   operator1
   operator2
   ...

выполняется пока i<10

  • Условие «IF»
if i<10:
   operator 1
   operator 1a
   ...
elif i>20:
   operator 2
   operator 2a
   ...
else:
   operator 3
   operator 3a
   ...

Последовательно проверяются условия пока не выполнится какой-то набор операторов

  • Попытка выполнения без возникновения ошибки «TRY»
try:
   operator 1
   operator 1a
   ...
exept:
   operator 2
   operator 2a
   ...

пробует выполнить набор операторов 1 если возникает ошибка выполняется набор операторов 2

  • Определение функции
def name(i,j):
   operator 1
   operator 1a
   return A

определяет функцию к которой можно обратится B = name(1,4).

Операторы «for» и «if» могут быть использованы для создания списков, генераторов, фильтрации последовательностей в одном выражении:

>>>[i**2 for i in range(5)]
[0, 1, 4, 9, 16, 25]
>>>[i**2 for i in range(5) if i>3]
[4, 9, 16, 25]

x = (i**2 for i in range(5) if i>3) – генератор - значения не вычисляются, пока не будет обращения к элементам. Возможно только последовательное обращение, например в операторе (for j in x).

x = [i**2 for i in range(5) if i>3] – список - значения вычисляются сразу все и записываются в список.

Еще одной особенностью питона является возможность выполнять код «на лету». Для этого существует две полезные функции:

Функция eval() – вычисление значения выражения, заданного строкой

>>> x = 1
>>> print eval('x+1')
2

Функция exec() – выполняет кусок кода, заданного строкой

>>> exec(’for i in (1,2): \n print i \n’)
1
2

3.4. Ввод-вывод и работа с файлами

Основные операции ввода-вывода

  • Вывод на экран print
>>>Print ‘This is a string’, 123
This is a string 123
  • Ввод с клавиатуры raw_input()
>>> s = raw_input('--> ')
--> Python's Flying
>>> s
"Python's Flying"
  • Перевод строки ‘\n’
>>> print “1 \n 2 \n 3”
1
2
3
  • Работа с файлами

Работа с файлами традиционна для языков программирования. Файл открывается, используется. закрывается. Файл – объект, который возвращается оператором “open” с атрибутом ‘r’, ‘w’,’a’,’r+’ (открыть для чтения, записи, добавления, чтения и записи)

Чтение из файла

f=open(‘name’,’r’)         # открыли для чтения (поддерживается итерация – чтение по строкам)
st=f.read()                # атрибут открытого файла – функция, возвращающая след. строку
print st
f.close()

Запись в файл

f=open(‘name’,’w’)         # открыли для записи
f.write(string)            # атрибут открытого файла – функция, записывает строку в файл
f.close()

3.5 Функциональная программирование

В программировании выделяют понятие «чистой» функции и функции с «побочными эффектами». В Python используются обе эти возможности. Напомним, что функции в Python тоже являются объектами.

  • Чистые функции

Входные данные –>Функция –> Результат. Чистые функции можно представить в виде черного ящика, который ОДНОЗНАЧНО дает результат по входным данным. В виде чистых функций желательно оформлять отдельные фрагменты программы, несущие смысловую нагрузку (решающую небольшую задачу). Это придает программе гибкость и возможность дополнительно использовать фрагменты кода.

  • Функции с побочными эффектами

Входные данные –>Функция + состояние системы –> Результат. В питоне реализовано мощное средство для работы с функциями, сохраняющими промежуточный результат – итераторы. В такой функции есть инициализация (часть выполняющаяся при первом вызове функции) и основная процедура получения данных. Данные вычисляются и передаются в основную программу по мере их использования! Вычислений ровно столько сколько нужно. Особенно полезно, если сходимость оценивается в процессе вычислений или необходимо обрабатывать данные порциями.

Тип функции Свойства Пример
чистые функции (def - return) После выполнения состояние системы не меняется. Каждый раз вычисляется снова. sin(x)
функции с побочным эффектом (def – yield - return) Система запоминает состояние. При вызове вычисления продолжаются запись в файл

Пример: суммирование ряда для нахождения функции Бесселя c натуральным индексом

\[J_{\alpha}(x) = \sum_{m=0}^{\infty} \frac{(-1)^m}{m!\Gamma(m+\alpha+1)} \left( \frac{x}{2} \right)^{2m+\alpha}\]
  • Обычная функция
def J_m(m, a=0, x=1):
   f=1
   for i in range(m): f=f*(i+1)
   for i in range(m+a+1): f=f*(i+1)
   return (-1)**m/f* (x/2)**(2*m+a)

и ее использование

s=0
for m in range(10):
   s+=J_m(m, a, x)

Ужасно!!! Каждый раз вычисляем факториал. Никогда не используйте функции в таком виде!

  • Итератор
def J_iter(a=0, x=1):
  f=1
  for i in range(a+1): f=f*(i+1)
  s=(x/2)**a/f
  m=0
  while 1:
     m+=1
     s=s*(-1)*(x/2)**2/m/(m+a+1)
     yield s
     if s<1e-20 return

и ее использование

s=0
for i in J_iter(a,x):
   s+=i
   if (остановка): break

Используем предыдущее слагаемое, сохраненное в состоянии функции. Заканчиваем если слагаемое меньше 1e-20.

Некоторые функции

Функция, определяемая пользоватетем (дериктива def()).

def f(x,y):
   return x+y

Оператор lambda() – функция, как оператор. Используется для короткой записи определения функций.

f = lambda x, y: x+y

Результат в обоих случаях одинаковый:

>>> f([1,2,3],[5,6,7])
[1,2,3,5,6,7]

Функция apply() – применяет функцию к аргументу.

>>> lst = [1, 2, 3]
>>> apply(max, lst)
3
>>> max(lst)
3

Функции range() и xrange() – генерирует последовательность целых чисел. (xrange() - итератор). Если аргумент всего один, она генерирует список чисел от 0 (включительно) до заданного числа (исключительно) . Если аргументов два, то список начинается с числа, указанного первым аргументом. Если аргументов три - третий аргумент задает шаг

>>> print range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print range(1, 10)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print range(1, 10, 3)
[1, 4, 7]

Функция map() – применяет функцию ко всем элементам последовательности.

>>> l1 = [2, 7, 5, 3]
>>> l2 = [-2, 1, 0, 4]
>>> print map(lambda x, y: x+y, l1, l2)
[0, 8, 5, 7]

В версии 2.7 можно использовать другую конструкцию:

>> [i+j for i,j in zip(l1,l2)]
[0, 8, 5, 7]

Функция filter() – выбор элементов из последовательности в соответствии с условием.

>>> filter(lambda x: x>3, [1,2,3,4,5,6])
[4,5,6]

В версии 2.7 можно использовать другую конструкцию:

>> [i for i in [1,2,3,4,5,6] if i>3]
[4,5,6]

Функция sum() – сумма элементов. (Для строк используют метод join()).

Функция reduce() – вычисление с накоплением результата (можно указать начальное значение).

>>>reduce(lambda x, y: x + y, [1,2,3], 10)
16

Функция zip() возвращает список кортежей, в котором i-й кортеж содержит i-е элементы аргументов-последовательностей. Длина результирующей последовательности равна длине самой короткой из последовательностей-аргументов

l1 = [1,2,3,4,5]
l2 = ['a','b','c','d','e']
>>> zip(l1,l2)
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')]

Функция enumerate() создает итератор, нумерующий элементы другого итератора.

>>> print [x for x in enumerate("abcd")]
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

Функция sorted() позволяет создавать итератор, выполняющийсортировку:

>>> sorted('avdsdf')
['a', 'd', 'd', 'f', 's', 'v']

3.6 Работа с модулями

В Python реализована концепция модульного подхода к программированию. Т.е. программист выбирает функциональные элементы, которые ему понадобятся при создании конкретной программы. В соответствии с модульным подходом большая задача разбивается на несколько более мелких, каждую из которых (в идеале) решает отдельный модуль. В языке Python набор модулей, посвященных одной проблеме, совмещают в одном пакете. Наиболее известные пакеты: NumPy, SciPy, и.т.д. Установка пакета делает модули, входящие в него, доступными для подключения. В модуль входят объекты (функции и данные). После подключения модуля эти объекты становятся доступны для использования в программе. Подключение модуля к программе на Python осуществляется с помощью оператора import или from – import.

Загрузка модуля или функции из модуля Использование функций Описание
import math a=math.sin(b) используем атрибут (часть модуля, реализующую функцию sin) модуля math
import math as mm a=mm.sin(b) для обращения к модулю нужно использовать имя mm
from math import * a=sin(b) импортировали все атрибуты модуля (доступны все функции по их именам)
from math import sin a=sin(b) импортировали только функцию sin
from math import sin as ssin a=ssin(b) изменили имя для вызова функции

Функции питона можно разделить на три класса:

  • встроенные (доступны всегда);
  • стандартные (входят в стандартные модули Python, требуют подключения);
  • внешние (пишутся пользователем или входят в специальные пакеты)

Встроенные функции

  1. Функции преобразования типов и классы: coerce(), str(), repr(), int(), list(), tuple(), long(), float(), complex(), dict(), super(), file(), bool(), object()
  2. Числовые и строковые функции: abs(), divmod(), ord(), pow(), len(), chr(), unichr(), hex(), oct(), cmp(), round(), unicode()
  3. Функции обработки данных: apply(), map(), filter(), reduce(), zip(), range(), xrange(), max(), min(), iter(), enumerate(), sum()
  4. Функции определения свойств: hash(), id(), callable(), issubclass(), isinstance(), type()
  5. Функции для доступа к внутренним структурам: locals(), globals(), vars(), intern(), dir()
  6. Функции компиляции и исполнения: eval(), execfile(), reload(), __import__(), compile()
  7. Функции ввода-вывода: input(), raw_input(), open()
  8. Функции для работы с атрибутами: getattr(), setattr(), delattr(), hasattr()
  9. Функции-декораторы методов классов: staticmethod(), classmethod(), property()
  10. Прочие функции: buffer(), slice()

Стандартные модули (входят в стандартный пакет) можно разбить на несколько классов

  1. Сервисы периода выполнения. Модули: sys, copy, math, cmath, random, time, calendar, datetime, sets, array, struct, itertools, locale, gettext.
  2. Поддержка цикла разработки. Модули: pdb, hotshot, profile, unittest, pydoc. Пакеты docutils, distutils.
  3. Взаимодействие с ОС (файлы, процессы). Модули: os, os.path, popen2, shutil, select, signal, stat, tempfile .
  4. Обработка текстов. Модули: re, StringIO, codecs, difflib, mmap, sgmllib, htmllib, htmlentitydefs. Пакет xml.
  5. Многопоточные вычисления. Модули: threading, thread, Queue.
  6. Хранение данных. Архивация. Модули: pickle, shelve, anydbm, gdbm, gzip, zlib, zipfile, bz2, csv, tarfile.
  7. Платформо-зависимые модули. Для UNIX: commands, pwd, grp, fcntl, resource, termios, readline, rlcompleter. Для Windows: msvcrt, _winreg, winsound.
  8. Поддержка сети. Протоколы Интернет. Модули: cgi, Cookie, urllib, urlparse, httplib, smtplib, poplib, telnetlib, socket, asyncore. Примеры серверов: SocketServer, BaseHTTPServer, xmlrpclib, asynchat.
  9. Поддержка Internet. Форматы данных. Модули: quopri, uu, base64, binhex, binascii, rfc822, mimetools, MimeWriter, multifile, mailbox. Пакет email.
  10. Python о себе. Модули: parser, symbol, token, keyword, inspect, tokenize, pyclbr, py_compile, compileall, dis, compiler.
  11. Графический интерфейс. Модуль Tkinter.

—————————— Сервисы ————————————————-

  • Модуль sys. Модуль sys содержит информацию о среде выполнения программы, об интерпретаторе Python.
  • Модуль copy. Этот модуль содержит функции для копирования объектов.
  • Модули math и cmath. В этих модулях собраны математические функции для действительных и комплексных аргументов.
  • Модуль random Этот модуль генерирует псевдослучайные числа для нескольких различных распределений.
  • Модуль time Этот модуль дает функции для получения текущего времени и преобразования форматов времени.
  • Модули array и struct. Эти модули реализуют низкоуровневый массив и структуру данных. Основное их назначение - разбор двоичных форматов данных.
  • Модуль itertools. Этот модуль содержит набор функций для работы с итераторами. Итераторы позволяют работать с данными последовательно, как если бы они получались в цикле.
  • Модуль locale. Модуль locale применяется для работы с культурной средой. В конкретной культурной среде могут использоваться свои правила для написания чисел, валют, времени и даты и т.п.

—————————– Отладка ————————————————–

  • Модуль pdb. Модуль pdb предоставляет функции отладчика с интерфейсом - командной строкой. Сессия отладки вышеприведенного модуля могла бы быть такой:
  • Модуль profile. С помощью профайлера разработчики программного обеспечения могут узнать, сколько времени занимает исполнение различных функций и методов.

—————————– Работа с ОС ———————————————-

  • Модуль os. Функции модуля os дают доступ к различным значениям, относящимся к процессу и к среде, в которой он исполняется

—————————– Обработка текстов —————————————-

  • Модуль StringIO - работа со строкой как с файлом.
  • Модуль difflib - приблизительное сравнения двух строк.
  • Модуль re – работа с регулярными выражениями (поиск или замена строк, отвечающих некоторому шаблону).

—————————– Многопоточные вычисления ———————————

  • Модуля threading – работа с потоками.
  • Модуль thread – низкоуровневый доступ к потокам. Многие функции модуля threading реализованы на базе модуля thread.

—————————— Хранение данных. Архивация ——————————

  • Модуль pickle. Процесс записи объекта в виде последовательности байтов называется сериализацией. Модуль pickle позволяет сериализовывать объекты и сохранять их в строке или файле.
  • Модуль shelve. Для хранения объектов в родном для Python формате можно применять полку (shelve). По своему интерфейсу полка ничем не отличается от словаря.
  • Модуль csv. Формат CSV (comma separated values - значения, разделенные запятыми) достаточнопопулярен для обмена данными между электронными таблицами и базами данных.

—————————— Поддержка Internet. Форматы данных ———————-

В стандартной библиотеке Python имеются разноуровневые модули для работы с различными форматами, применяющимися для кодирования данных в сети Интернет и тому подобных приложениях. (почта, XML, базы данных и т.д.)