Язык программирования Python

Сузи Роман Авриевич

Курс посвящен одному из бурно развивающихся и популярных в настоящее время сценарных языков программирования — 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

:

Обработка текстов

Модули этой категории будут подробно рассмотрены в отдельной лекции.