Предварительная информация¶
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 это объектно-ориентированный язык программирования, т.е.
- Все данные в нем представляются объектами.
- Каждый объект имеет собственную часть памяти и может состоять из других объектов.
- Каждый объект имеет тип (принадлежит классу)
- Все объекты одного типа могут принимать одни и те же сообщения (и выполнять одни и те же действия).
Для каждого объекта (число, функция, список, и т.д.) задан набор свойств (данных, хранящихся в объекте) и методов (способов использования объекта). Простые объекты (числа) могут рассматриваться традиционным образом, хотя на самом деле, операции над ними «+, -, *, /» и преобразование типов включены в описание их класса.
| Типы данных | Функция преобразования | Пример присваивания | Примечания |
| Целый (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() |
|
индексация (считывание, запись), добавление, исключение, упорядоченность, сортировка, поиск и перебор |
| Кортеж (tuple) | tuple() |
|
индексация (считывание, запись), упорядоченность, поиск и перебор |
| Словарь (dictionary) | dict() |
|
индексация (считывание, запись), добавление, исключение |
| Множество (set) | set() |
|
добавление, исключение, поиск и перебор |
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 натуральным индексом
- Обычная функция
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, требуют подключения);
- внешние (пишутся пользователем или входят в специальные пакеты)
Встроенные функции
- Функции преобразования типов и классы:
coerce(),str(),repr(),int(),list(),tuple(),long(),float(),complex(),dict(),super(),file(),bool(),object() - Числовые и строковые функции:
abs(),divmod(),ord(),pow(),len(),chr(),unichr(),hex(),oct(),cmp(),round(),unicode() - Функции обработки данных:
apply(),map(),filter(),reduce(),zip(),range(),xrange(),max(),min(),iter(),enumerate(),sum() - Функции определения свойств:
hash(),id(),callable(),issubclass(),isinstance(),type() - Функции для доступа к внутренним структурам:
locals(),globals(),vars(),intern(),dir() - Функции компиляции и исполнения:
eval(),execfile(),reload(),__import__(),compile() - Функции ввода-вывода:
input(),raw_input(),open() - Функции для работы с атрибутами:
getattr(),setattr(),delattr(),hasattr() - Функции-декораторы методов классов:
staticmethod(),classmethod(),property() - Прочие функции:
buffer(),slice()
Стандартные модули (входят в стандартный пакет) можно разбить на несколько классов
- Сервисы периода выполнения. Модули:
sys,copy,math,cmath,random,time,calendar,datetime,sets,array,struct,itertools,locale,gettext. - Поддержка цикла разработки. Модули:
pdb,hotshot,profile,unittest,pydoc. Пакетыdocutils,distutils. - Взаимодействие с ОС (файлы, процессы). Модули:
os,os.path,popen2,shutil,select,signal,stat,tempfile. - Обработка текстов. Модули:
re,StringIO,codecs,difflib,mmap,sgmllib,htmllib,htmlentitydefs. Пакетxml. - Многопоточные вычисления. Модули:
threading,thread,Queue. - Хранение данных. Архивация. Модули:
pickle,shelve,anydbm,gdbm,gzip,zlib,zipfile,bz2,csv,tarfile. - Платформо-зависимые модули. Для UNIX:
commands,pwd,grp,fcntl,resource,termios,readline,rlcompleter. Для Windows:msvcrt,_winreg,winsound. - Поддержка сети. Протоколы Интернет. Модули:
cgi,Cookie,urllib,urlparse,httplib,smtplib,poplib,telnetlib,socket,asyncore. Примеры серверов:SocketServer,BaseHTTPServer,xmlrpclib,asynchat. - Поддержка Internet. Форматы данных. Модули:
quopri,uu,base64,binhex,binascii,rfc822,mimetools,MimeWriter,multifile,mailbox. Пакетemail. - Python о себе. Модули:
parser,symbol,token,keyword,inspect,tokenize,pyclbr,py_compile,compileall,dis,compiler. - Графический интерфейс. Модуль
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, базы данных и т.д.)