Предварительная информация¶
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, базы данных и т.д.)