справочник по Python. мм isbn 9785932861578 9 785932 861578
Скачать 4.21 Mb.
|
Глава 1. Вводное руководство Глава 2. Лексические и синтаксические соглашения Глава 3. Типы данных и объекты Глава 4. Операторы и выражения Глава 5. Структура программы и управление потоком выполнения Глава 6. Функции и функциональное программирование Глава 7. Классы и объектно-ориентированное программирование Глава 8. Модули, пакеты и дистрибутивы Глава 9. Ввод и вывод Глава 10. Среда выполнения Глава 11. Тестирование, отладка, профилирование и оптимизация Глава 1 . Вводное руководство Данная глава представляет собой краткое введение в язык программиро- вания Python. Цель ее состоит в том, чтобы продемонстрировать наиболее важные особенности языка Python, не погружаясь при этом в описание деталей. Следуя поставленной цели, эта глава кратко описывает основные понятия языка, такие как переменные, выражения, конструкции управ- ления потоком выполнения, функции, генераторы, классы, а также ввод- вывод. Эта глава не претендует на полноту охвата рассматриваемых тем. Однако опытные программисты без труда смогут на основе представлен- ных здесь сведений создавать достаточно сложные программы. Начинаю- щие программисты могут опробовать некоторые примеры, чтобы получить представление об особенностях языка. Если вы только начинаете изучать язык Python и используете версию Python 3, эту главу лучше будет изу- Python и используете версию Python 3, эту главу лучше будет изу- и используете версию Python 3, эту главу лучше будет изу- Python 3, эту главу лучше будет изу- 3, эту главу лучше будет изу- чать, опираясь на версию Python 2.6. Практически все основные понятия в равной степени применимы к обеим версиям, однако в Python 3 появи- лось несколько важных изменений в синтаксисе, в основном связанных с вводом и выводом, которые могут отрицательно сказаться на работоспо- собности многих примеров в этом разделе. За дополнительной информаци- дополнительной информаци- дополнительной информаци- информаци- информаци- ей обращайтесь к приложению «Python 3». Вызов интерпретатора Программы на языке Python выполняются интерпретатором. Обычно ин- Python выполняются интерпретатором. Обычно ин- выполняются интерпретатором. Обычно ин- терпретатор вызывается простым вводом команды python. Однако суще- ствует множество различных реализаций интерпретатора и разнообраз- ных сред разработки (например, Jython, IronPython, IDLE, ActivePython, Wing IDE, pydev и так далее), поэтому за информацией о порядке вызова следует обращаться к документации. После запуска интерпретатора в ко- мандной оболочке появляется приглашение к вводу, в котором можно вво- дить программы, исполняемые в простом цикле чтение-выполнение. На- пример, ниже представлен фрагмент вывода, где интерпретатор отобража- ет сообщение с упоминанием об авторских правах и выводит приглашение к вводу >>>, где пользователь ввел знакомую команду «Привет, Мир»: 24 Глава 1. Вводное руководство Python 2.6rc2 (r26rc2:66504, Sep 19 2008, 08:50:24) [GCC 4.0.1 (Apple Inc. build 5465)] on darwin Type “help”, “copyright”, “credits” or “license” for more information. >>> print “Привет, Мир” Привет, Мир >>> Примечание Если при попытке опробовать предыдущий пример была получена ошибка SyntaxError , это может свидетельствовать о том, что вы пользуетесь версией Py- Py- thon 3. В этом случае вы по-прежнему можете следовать за примерами этой главы, но при этом должны помнить, что инструкция print в версии Python 3 была преоб- Python 3 была преоб- 3 была преоб- разована в функцию. Чтобы избавиться от ошибки, просто заключите выводимые значения в круглые скобки. Например: >>> print(“Привет, Мир”) Привет, Мир >>> Добавление круглых скобок допускается и при использовании Python 2, при усло- Python 2, при усло- 2, при усло- вии, что выводится единственный элемент. Однако такой синтаксис редко можно встретить в существующем программном коде на языке Python. В последующих главах этот синтаксис иногда будет использоваться в примерах, основная цель ко- торых не связана с выводом информации, но которые, как предполагается, должны одинаково работать при использовании любой из версий Python 2 или Python 3. Интерактивный режим работы интерпретатора Python является одной из наиболее полезных особенностей. В интерактивной оболочке можно вво- дить любые допустимые инструкции или их последовательности и тут же получать результаты. Многие, включая и автора, используют интерпрета- тор Python в интерактивном режиме в качестве настольного калькулятора. Например: >>> 6000 + 4523.50 + 134.12 10657.620000000001 >>> _ + 8192.32 18849.940000000002 >>> При использовании интерпретатора Python в интерактивном режиме мож- Python в интерактивном режиме мож- в интерактивном режиме мож- но использовать специальную переменную _, которая хранит результат по- следней операции. Ее можно использовать для хранения промежуточных результатов при выполнении последовательности инструкций. Однако важно помнить, что эта переменная определена только при работе интер- претатора в интерактивном режиме. Если вам необходимо написать программу, которая будет использоваться не один раз, поместите инструкции в файл, как показано ниже: # helloworld.py print “Привет, Мир” Переменные и арифметические выражения 25 Ф айлы с исходными текстами программ на языке Python являются обыч- Python являются обыч- являются обыч- ными текстовыми файлами и обычно имеют расширение .py. Символ # от- мечает начало комментария, простирающегося до конца строки. Чтобы выполнить программу в файле helloworld.py, необходимо передать имя файла интерпретатору, как показано ниже: % python helloworld.py Привет, Мир % Чтобы запустить программу на языке Python в Windows, можно дважды щелкнуть мышью на файле с расширением .py или ввести имя программы в окне Запустить… ( Run command ), которое вызывается одноименным пунктом в меню Пуск ( Start ). В результате в окне консоли будет запущен интерпрета- тор, который выполнит указанную программу. Однако следует помнить, что окно консоли будет закрыто сразу же после окончания работы про- граммы (зачастую еще до того, как вы успеете прочитать результаты). При отладке лучше всего запускать программы с помощью инструментов раз- работчика на языке Python, таких как IDLE. В UNIX можно добавить в первую строку программы последовательность #! , как показано ниже: #!/usr/bin/env python print “Привет, Мир” Интерпретатор последовательно выполняет инструкции, пока не достигнет конца файла. При работе в интерактивном режиме завершить сеанс рабо- ты с интерпретатором можно вводом символа EOF (end of file – конец файла) или выбором пункта меню Exit (Выйти) в среде разработки Python. В UNIX символ EOF вводится комбинацией клавиш Ctrl+D ; в Windows – Ctrl+Z . Про- грамма может совершить выход, возбудив исключение SystemExit. >>> raise SystemExit Переменные и арифметические выражения В листинге 1.1 приводится программа, которая использует переменные и выражения для вычисления сложных процентов. Листинг 1.1. Простое вычисление сложных процентов principal = 1000 # Начальная сумма вклада rate = 0.05 # Процент numyears = 5 # Количество лет year = 1 while year <= numyears: principal = principal * (1 + rate) print year, principal # В Python 3: print(year, principal) year += 1 В результате работы программы будет получена следующая таблица: 26 Глава 1. Вводное руководство 1 1050.0 2 1102.5 3 1157.625 4 1215.50625 5 1276.2815625 Python – это язык с динамической типизацией, то есть в ходе выполнения программы одна и та же переменная может хранить значения различных типов. Оператор присваивания просто создает связь между именем пере- менной и значением. Хотя каждое значение имеет собственный тип дан- ных, например целое число или строка, сами переменные не имеют типа и в процессе выполнения программы могут ссылаться на значения любых типов. Этим Python отличается от языка C, например, в котором каждая переменная имеет определенный тип, размер и местоположение в памяти, где сохраняется ее значение. Динамическую природу языка Python можно наблюдать в листинге 1.1 на примере переменной principal. Изначально ей присваивается целочисленное значение. Однако позднее в программе вы- полняется следующее присваивание: principal = principal * (1 + rate) Эта инструкция вычисляет выражение и присваивает результат перемен- ной с именем principal. Несмотря на то что первоначальное значение пере- менной principal было целым числом 1000, новое значение является числом с плавающей точкой (значение переменной rate является числом с плаваю- щей точкой, поэтому результатом приведенного выше выражения также будет число с плавающей точкой). То есть в середине программы «тип» переменной principal динамически изменяется с целочисленного на число с плавающей точкой. Однако, если быть более точными, следует заметить, что изменяется не тип переменной principal, а тип значения, на которое ссылается эта переменная. Конец строки завершает инструкцию. Однако имеется возможность разме- стить несколько инструкций в одной строке, отделив их точкой с запятой, как показано ниже: principal = 1000; rate = 0.05; numyears = 5; Инструкция while вычисляет условное выражение, следующее прямо за ней. Если результат выражения оценивается как истина, выполняется тело инструкции while. Условное выражение, а вместе с ним и тело цик- ла, вычисляется снова и снова, пока не будет получено ложное значение. Тело цикла выделено отступами, то есть в листинге 1.1 на каждой ите- рации выполняются три инструкции, следующие за инструкцией while. Язык Python не предъявляет жестких требований к величине отступов, важно лишь, чтобы в пределах одного блока использовались отступы одно- го и того же размера. Однако чаще всего отступы оформляются четырьмя пробелами (и так и рекомендуется). Один из недостатков программы, представленной в листинге 1.1, заключа- ется в отсутствии форматирования при выводе данных. Чтобы исправить Переменные и арифметические выражения 27 е го, можно было бы использовать выравнивание значений переменной principal по правому краю и ограничить точность их представления двумя знаками после запятой. Добиться такого форматирования можно несколь- кими способами. Наиболее часто для подобных целей используется опера- тор форматирования строк (%), как показано ниже: print “%3d %0.2f” % (year, principal) print(“%3d %0.2f” % (year, principal)) # Python 3 Теперь вывод программы будет выглядеть, как показано ниже: 1 1050.00 2 1102.50 3 1157.63 4 1215.51 5 1276.28 Строки формата содержат обычный текст и специальные спецификаторы формата, такие как “%d”, “%s” и “%f”. Приведенные спецификаторы опреде- ляют формат представления данных определенных типов – целых чисел, строк и чисел с плавающей точкой соответственно. Спецификаторы форма- та могут также содержать модификаторы, определяющие ширину поля вы- вода и точность представления значений. Например, спецификатор “%3d” форматирует целое число, с выравниванием по правому краю в поле ши- риной 3 символа, а спецификатор “%0.2f” форматирует число с плавающей точкой так, чтобы выводились только два знака после запятой. Поведение спецификаторов формата для строк во многом идентично поведению спец- ификаторов формата для функции printf() в языке C и подробно описыва- ется в главе 4 «Операторы и выражения». Более современный подход к форматированию строк заключается в фор- матировании каждой части строки по отдельности, с помощью функции format() . Например: print format(year,”3d”),format(principal,”0.2f”) print(format(year,”3d”),format(principal,”0.2f”)) # Python 3 Спецификаторы формата для функции format() похожи на спецификаторы, традиционно используемые в операторе форматирования строк (%). Напри- мер, спецификатор “3d” форматирует целое число, выравнивая его по пра- вому краю в поле шириной 3 символа, а спецификатор “0.2f” форматирует число с плавающей точкой, ограничивая точность представления двумя знаками после запятой. Кроме того, строки имеют собственный метод for- mat() , который может использоваться для форматирования сразу несколь- ких значений. Например: print “{0:3d} {1:0.2f}”.format(year,principal) print(“{0:3d} {1:0.2f}”.format(year,principal)) # Python 3 В данном примере число перед двоеточием в строках “{0:3d}” и “{1:0.2f}” определяет порядковый номер аргумента метода format(), а часть после двое точия – спецификатор формата. 28 Глава 1. Вводное руководство Условные операторы Для простых проверок можно использовать инструкции if и else. Напри- мер: if a < b: print “Компьютер говорит Да” else: print “Компьютер говорит Нет” Тела инструкций if и else отделяются отступами. Инструкция else явля- ется необязательной. Чтобы создать пустое тело, не выполняющее никаких действий, можно ис- пользовать инструкцию pass, как показано ниже: if a < b: pass # Не выполняет никаких действий else: print “Компьютер говорит Нет” Имеется возможность формировать булевы выражения с использованием ключевых слов or, and и not: if product == “игра” and type == “про пиратов” \ and not (age < 4 or age > 8): print “Я беру это!” Примечание При выполнении сложных проверок строка программного кода может оказаться достаточно длинной. Чтобы повысить удобочитаемость, инструкцию можно пере- нести на следующую строку, добавив символ обратного слэша (\) в конце строки, как показано выше. В этом случае обычные правила оформления отступов к сле- дующей строке не применяются, поэтому вы можете форматировать строки, про- должающие инструкцию, как угодно. В языке Python отсутствует специальная инструкция проверки значений, такая как switch или case. Чтобы выполнить проверку на соответствие не- скольким значениям, можно использовать инструкцию elif, например: if suffix == “.htm”: content = “text/html” elif suffix == “.jpg”: content = “image/jpeg” elif suffix == “.png”: content = “image/png” else: raise RuntimeError(“Содержимое неизвестного типа”) Для определения истинности используются значения True и False типа Boolean. Например: if ‘spam’ in s: has_spam = True Операции ввода-вывода с файлами 29 else: has_spam = False Все операторы отношений, такие как < и >, возвращают True или False. Опе- ратор in, задействованный в предыдущем примере, часто используется для проверки вхождения некоторого значения в другой объект, такой как стро- ка, список или словарь. Он также возвращает значение True или False, бла- годаря чему предыдущий пример можно упростить, как показано ниже: has_spam = ‘spam’ in s Операции ввода-вывода с файлами Следующая программа открывает файл и читает его содержимое построчно: f = open(“foo.txt”) # Возвращает файловый объект line = f.readline() # Вызывается метод readline() файла while line: print line, # Завершающий символ ‘,’ предотвращает перевод строки # print(line,end=’’) # Для Python 3 line = f.readline() f.close() Функция open() возвращает новый файловый объект. Вызывая методы этого объекта, можно выполнять различные операции над файлом. Метод read- line() читает одну строку из файла, включая завершающий символ перевода строки. По достижении конца файла возвращается пустая строка. В данном примере программа просто выполняет обход всех строк в файле foo.txt . Такой прием, когда программа в цикле выполняет обход некото- рой коллекции данных (например, строк в файле, чисел, строковых зна- чений и так далее), часто называют итерациями. Поскольку потребность в итерациях возникает достаточно часто, для этих целей в языке Python предусмотрена специальная инструкция for, которая выполняет обход эле- ментов коллекции. Например, та же программа может быть записана бо- лее кратко: for line in open(“foo.txt”): print line, Чтобы записать вывод программы в файл, в инструкцию print можно до- бавить оператор >> перенаправления в файл, как показано в следующем примере: f = open(“out”,”w”) # Открывает файл для записи while year <= numyears: principal = principal * (1 + rate) print >>f,”%3d %0.2f” % (year,principal) year += 1 f.close() Оператор >> можно использовать только в Python 2. При работе с версией Python 3 инструкцию print следует изменить, как показано ниже: print(“%3d %0.2f” % (year,principal),file=f) 30 Глава 1. Вводное руководство Кроме того, файловые объекты обладают методом write(), который мож- но использовать для записи неформатированных данных. Например, ин- струкцию print в предыдущем примере можно было бы заменить следую- щей инструкцией: f.write(“%3d %0.2f\n” % (year,principal)) Хотя в этих примерах выполняются операции над файлами, те же приемы можно использовать при работе со стандартными потоками ввода и выво- да. Например, когда требуется прочитать ввод пользователя в интерактив- ном режиме, его можно получить из файла sys.stdin. Когда необходимо вывести данные на экран, можно записать их в файл sys.stdout, который используется инструкцией print. Например: import sys sys.stdout.write(“Введите свое имя :”) name = sys.stdin.readline() При использовании Python 2 этот пример можно сократить еще больше, как показано ниже: name = raw_input(“Введите свое имя :”) В Python 3 функция raw_input() стала называться input(), но она действует точно так же. Строки Чтобы создать литерал строки, ее необходимо заключить в апострофы, в кавычки или в тройные кавычки, как показано ниже: a = “Привет, Мир!” b = ‘Python – прелесть’ c = “””Компьютер говорит ‘Нет’””” Строковый литерал должен завершаться кавычками того же типа, как ис- пользовались в начале. В противоположность литералам в апострофах и в кавычках, которые должны располагаться в одной логической строке, ли- тералы в тройных кавычках могут включать текст произвольной длины – до завершающих тройных кавычек. Литералы в тройных кавычках удоб- но использовать, когда содержимое литерала располагается в нескольких строках, как показано ниже: print ‘’’Content-type: text/html ёё |