Курс посвящен одному из бурно развивающихся и популярных в настоящее время сценарных языков программирования — Python. Язык Python позволяет быстро создавать как прототипы программных систем, так и сами программные системы, помогает в интеграции программного обеспечения для решения производственных задач. Python имеет богатую стандартную библиотеку и большое количество модулей расширения практически для всех нужд отрасли информационных технологий. Благодаря ясному синтаксису изучение языка не составляет большой проблемы. Написанные на нем программы получаются структурированными по форме, и в них легко проследить логику работы. На примере языка Python рассматриваются такие важные понятия как: объектно–ориентированное программирование, функциональное программирование, событийно–управляемые программы (GUI–приложения), форматы представления данных (Unicode, XML и т.п.). Возможность диалогового режима работы интерпретатора Python позволяет существенно сократить время изучения самого языка и перейти к решению задач в соответствующих предметных областях. Python свободно доступен для многих платформ, а написанные на нем программы обычно переносимы между платформами без изменений. Это обстоятельство позволяет применять для изучения языка любую имеющуюся аппаратную платформу.
Лекция #1: Введение в программирование на языке Python.
Что такое Python?
О
Python
(лучше произносить «питон», хотя некоторые говорят «пайтон») — предмете данного изучения, лучше всего говорит создатель этого языка программирования, голландец Гвидо ван Россум:
«Python — интерпретируемый, объектно–ориентированный высокоуровневый язык программирования с динамической семантикой. Встроенные высокоуровневые структуры данных в сочетании с динамическими типизацией и связыванием делают язык привлекательным для быстрой разработки приложений (RAD, Rapid Application Development). Кроме того, его можно использовать в качестве сценарного языка для связи программных компонентов. Синтаксис Python прост в изучении, в нем придается особое значение читаемости кода, а это сокращает затраты на сопровождение программных продуктов. Python поддерживает модули и пакеты, поощряя модульность и повторное использование кода. Интерпретатор Python и большая стандартная библиотека доступны бесплатно в виде исходных и исполняемых кодов для всех основных платформ и могут свободно распространяться.»
В процессе изучения будет раскрыт смысл этого определения, а сейчас достаточно знать, что Python — это универсальный язык программирования. Он имеет свои преимущества и недостатки, а также сферы применения. В поставку Python входит обширная стандартная библиотека для решения широкого круга задач. В Интернете доступны качественные библиотеки для Python по различным предметным областям: средства обработки текстов и технологии Интернет, обработка изображений, инструменты для создания приложений, механизмы доступа к базам данных, пакеты для научных вычислений, библиотеки построения графического интерфейса и т.п. Кроме того, Python имеет достаточно простые средства для интеграции с языками C, C++ (и Java) как путем встраивания (embedding) интерпретатора в программы на этих языках, так и наоборот, посредством использования библиотек, написанных на этих языках, в Python–программах. Язык Python поддерживает несколько
парадигм
программирования: императивное (процедурный, структурный, модульный подходы), объектно–ориентированное и функциональное программирование.
Можно считать, что Python — это целая технология для создания программных продуктов (и их прототипов). Она доступна почти на всех современных платформах (как 32–битных, так и на 64–битных) с компилятором C и на платформе Java.
Может показаться, что, в программной индустрии нет места для чего–то другого кроме C/C++, Java, Visual Basic, C#. Однако это не так. Возможно, благодаря данному курсу лекций и практических занятий у Python появятся новые приверженцы, для которых он станет незаменимым инструментом.
Как описать язык?
В этой лекции не ставится цели систематически описать Python: для этого существует оригинальное справочное руководство. Здесь предлагается рассмотреть язык одновременно в нескольких аспектах, что достигается набором примеров, которые позволят быстрее приобщиться к реальному программированию, чем в случае строгого академического подхода.
Однако стоит обратить внимание на правильный подход к описанию языка. Создание программы — это всегда коммуникация, в которой программист передает компьютеру информацию, необходимую для выполнения последним действий. То, как эти действия понимает программист (то есть «смысл»), можно назвать
семантикой
. Средством передачи этого смысла является
синтаксис
языка программирования. Ну а то, что делает интерпретатор на основании переданного, обычно называют
прагматикой
. При написании программы очень важно, чтобы в этой цепочке не возникало сбоев.
Синтаксис — полностью формализованная часть: его можно описать на формальном языке синтаксических диаграмм (что и делается в справочных руководствах). Выражением прагматики является сам интерпретатор языка. Именно он читает записанное в соответствии с синтаксисом «послание» и превращает его в действия по заложенному в нем алгоритму. Неформальным компонентом остается только семантика. Именно в переводе смысла в формальное описание и кроется самая большая сложность программирования. Синтаксис языка Python обладает мощными средствами, которые помогают приблизить понимание проблемы программистом к ее «пониманию» интерпретатором. О внутреннем устройстве Python будет говориться в одной из завершающих лекций.
История языка Python
Создание Python было начато Гвидо ван Россумом (Guido van Rossum) в 1991 году, когда он работал над распределенной ОС Амеба. Ему требовался расширяемый язык, который бы обеспечил поддержку системных вызовов. За основу были взяты ABC и Модула–3. В качестве названия он выбрал Python в честь комедийных серий BBC «Летающий цирк Монти–Питона», а вовсе не по названию змеи. С тех пор Python развивался при поддержке тех организаций, в которых Гвидо работал. Особенно активно язык совершенствуется в настоящее время, когда над ним работает не только команда создателей, но и целое сообщество программистов со всего мира. И все–таки последнее слово о направлении развития языка остается за Гвидо ван Россумом.
Программа на Python
Программа
на языке Python может состоять из одного или нескольких модулей. Каждый
модуль
представляет собой текстовый файл в кодировке, совместимой с 7–битной кодировкой ASCII. Для кодировок, использующих старший бит, необходимо явно указывать название кодировки. Например, модуль, комментарии или строковые литералы которого записаны в кодировке KOI8–R, должен иметь в первой или второй строке следующую спецификацию:
# -*- coding: koi8–r -*-
Благодаря этой спецификации интерпретатор Python будет знать, как корректно переводить символы литералов Unicode–строк в Unicode. Без этой строки новые версии Python будут выдавать предупреждение на каждый модуль, в котором встречаются коды с установленным восьмым битом.
О том, как делать программу модульной, станет известно в следующих лекциях. В примерах ниже используются как фрагменты модулей, записанных в файл, так и фрагменты диалога с интерпретатором Python. Последние отличаются характерным приглашением
>>>
. Символ решетка (
#
) отмечает комментарий до конца строки.
Программа на Python, с точки зрения интерпретатора, состоит из
логических строк
. Одна логическая строка, как правило, располагается в одной физической, но длинные логические строки можно явно (с помощью обратной косой черты) или неявно (внутри скобок) разбить на несколько физических:
Основные алгоритмические конструкции
Предполагается, что слушатели уже умеют программировать хотя бы на уровне школьной программы, и потому вполне достаточно провести параллели между алгоритмическими конструкциями и синтаксисом Python. Кроме того, Python как правило не подводит интуицию программиста (по крайней мере, науке хорошо известны типичные ловушки начинающих программистов на Python), поэтому изучать синтаксис Python предпочтительнее на примерах, а не с помощью синтаксических диаграмм или форм Бэкуса–Наура.
Последовательность операторов
Последовательные действия
описываются последовательными строками программы. Стоит, правда, добавить, что в программах важны отступы, поэтому все операторы, входящие в последовательность действий, должны иметь один и тот же отступ:
a = 1
b = 2
a = a + b
b = a - b
Оператор условия и выбора
Разумеется, одними только последовательными действиями в программировании не обойтись, поэтому при написании алгоритмов используется еще и
ветвление
:
if a > b:
c = a
else:
c = b
Циклы
Третьей необходимой алгоритмической конструкцией является
цикл
. С помощью цикла можно описать повторяющиеся действия. В Python имеются два вида циклов:
цикл ПОКА
(выполняется некоторое действие) и
цикл ДЛЯ
(всех значений последовательности). Следующий пример иллюстрирует
цикл ПОКА
на Python:
s = "abcdefghijklmnop"
while s != "":
print s
s = s[1: -1]
Функции
Программист может определять собственные функции двумя способами: с помощью оператора
def
или прямо в выражении, посредством
lambda
. Второй способ (да и вообще работа с функциями) будет рассмотрен подробнее в лекции по функциональному программированию на Python, а здесь следует привести пример определения и вызова функции:
def cena(rub, kop=0):
return "%i руб. %i коп." % (rub, kop)
print cena(8, 50)
Лекция #2: Основные стандартные модули Python.
Одним из важных преимуществ языка Python является наличие большой библиотеки модулей и пакетов, входящих в стандартную поставку. Как говорят, к Python «приложены батарейки».
Понятие модуля
Перед тем как приступить к изучению модулей стандартной библиотеки, необходимо определить то, что в Python называется
модулем
.
В соответствии с модульным подходом к программированию большая задача разбивается на несколько более мелких, каждую из которых (в идеале) решает отдельный модуль. В разных методологиях даются различные ограничения на размер модулей, однако при построении модульной структуры программы важнее составить такую композицию модулей, которая позволила бы свести к минимуму связи между ними. Набор классов и функций, имеющий множество связей между своими элементами, было бы логично расположить в одном модуле. Есть и еще одно полезное замечание: модули должно быть легче использовать, чем написать заново. Это значит, что модуль должен иметь удобный
интерфейс
: набор функций, классов и констант, который он предлагает своим пользователям.
В языке Python набор модулей, посвященных одной проблеме, можно поместить в
пакет
. Хорошим примером такого пакета является пакет
xml
, в котором собраны модули для различных аспектов обработки XML.
В программе на Python модуль представлен объектом–модулем, атрибутами которого являются имена, определенные в модуле:
>>> import datetime
Модули в Python
Модуль оформляется в виде отдельного файла с исходным кодом. Стандартные модули находятся в каталоге, где их может найти соответствующий интерпретатор языка. Пути к каталогам, в которых Python ищет модули, можно увидеть в значении переменной
sys.path
:
>>> sys.path
['', '/usr/local/lib/python23.zip', '/usr/local/lib/python2.3',
'/usr/local/lib/python2.3/plat–linux2', '/usr/local/lib/python2.3/lib–tk',
'/usr/local/lib/python2.3/lib–dynload',
Встроенные функции
В среде 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
Функции преобразования типов и классы
Функции и классы из этой категории служат для преобразования типов данных. В старых версиях Python для преобразования к нужному типу использовалась одноименная функция. В новых версиях Python роль таких функций играют имена встроенных классов (однако семантика не изменилась). Для понимания сути достаточно небольшого примера:
>>> int(23.5)
23
>>> float('12.345')
12.345000000000001
Числовые и строковые функции
Функции работают с числовыми или строковыми аргументами. В следующей таблице даны описания этих функций.
Следующий пример строит таблицу кодировки кириллических букв в Unicode:
print "Таблица Unicode (русские буквы)".center(18*4)
i = 0
Функции обработки данных
Эти функции подробнее будут рассмотрены в лекции по функциональному программированию. Пример с функциями
range()
и
enumerate()
:
>>> for i, c in enumerate("ABC"):
... print i, c
...
0 A
Функции определения свойств
Эти функции обеспечивают доступ к некоторым встроенным атрибутам объектов и другим свойствам. Следующий пример показывает некоторые из этих функций:
>>> s = "abcde"
>>> s1 = "abcde"
>>> s2 = "ab" + "cde"
>>> print "hash:", hash(s), hash(s1), hash(s2)
Обзор стандартной библиотеки
Модули стандартной библиотеки можно условно разбить на группы по тематике.
1. Сервисы периода выполнения. Модули:
sys
,
atexit
,
copy
,
traceback
,
math
,
cmath
,
random
,
time
,
calendar
,
datetime
,
sets
,
array
,
struct
,
itertools
,
locale
,
gettext
.
2. Поддержка цикла разработки. Модули:
pdb
,
hotshot
,
profile
,
unittest
,
pydoc
. Пакеты
docutils
,
distutils
.
3. Взаимодействие с ОС (файлы, процессы). Модули:
os
,
os.path
,
getopt
,
glob
,
popen2
,
shutil
,
select
,
signal
,
stat
,
tempfile
.
3. Обработка текстов. Модули:
string
,
re
,
StringIO
,
codecs
,
difflib
,
mmap
,
sgmllib
,
htmllib
,
htmlentitydefs
. Пакет
xml
.
Сервисы периода выполнения
Модуль sys содержит информацию о среде выполнения программы, об интерпретаторе Python. Далее будут представлены наиболее популярные объекты из этого модуля: остальное можно изучить по документации.
Этот модуль содержит функции для копирования объектов. Вначале предлагается к рассмотрению «парадокс», который вводит в замешательство новичков в Python:
Поддержка цикла разработки
Модули этого раздела помогают поддерживать документацию, производить регрессионное тестирование, отлаживать и профилировать программы на Python, а также обслуживают распространение готовых программ, создавая среду для конфигурирования и установки пакетов.
В качестве иллюстрации можно предположить, что создается модуль для вычисления простых чисел по алгоритму «решето Эратосфена». Модуль будет находиться в файле
Sieve.py
и состоять из одной функции
primes(N)
, которая в результате своей работы дает все простые (не имеющие натуральных делителей кроме себя и единицы) числа от
2
до
N
:
import sets
import math
"""Модуль для вычисления простых чисел от 2 до N """
Взаимодействие с операционной системой
Различные операционные системы имеют свои особенности. Здесь рассматривается основной модуль этой категории, функции которого работают на многих операционных системах.
Разделители каталогов и другие связанные с этим обозначения доступны в виде констант.
Программа на Python работает в операционной системе в виде отдельного процесса. Функции модуля
os
дают доступ к различным значениям, относящимся к процессу и к среде, в которой он исполняется. Одним из важных объектов, доступных из модуля
os
, является словарь переменных окружения
environ
. Например, с помощью переменных окружения web–сервер передает некоторые параметры в CGI–сценарий. В следующем примере можно получить переменную окружения
PATH
:
Обработка текстов
Модули этой категории будут подробно рассмотрены в отдельной лекции.