Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

[ Россум, Дрейк, Откидач ] Язык программирования Python

.pdf
Скачиваний:
282
Добавлен:
25.04.2014
Размер:
1.5 Mб
Скачать

2.2. Интерпретатор и его среда

21

2.2 Интерпретатор и его среда

2.2.1 Обработка ошибок

При возникновении ошибки интерпретатор печатает сообщение и остаток содержимого стека. В интерактивном режиме, после этого снова выдается первичное приглашение. Если программа читается из файла, интерпретатор печатает сообщение об ошибке, остаток содержимого стека и выходит с ненулевым кодом завершения. (Исключения, перехваченные ветвью except в инструкции try, не являются ошибками в данном контексте.) Некоторые ошибки — внутренние противоречия и некоторые случаи нехватки памяти — являются безусловно фатальными и приводят к выходу с ненулевым значением. Все сообщения об ошибках выводятся в стандартный поток ошибок; нормальные сообщения, возникающие в процессе выполнения команд, направляются в стандартный поток вывода.

Нажатие прерывающей комбинации клавиш (обычно Ctrl-C) во время выполнения генерирует исключение KeyboardInterrupt, которое может быть обработано с помощью инструкции try.

2.2.2 Исполняемые файлы

В операционных системах UNIX программу на языке Python можно сделать исполняемой непосредственно, поместив, например, строку

#!/usr/bin/env python

(подразумевая, что путь к интерпретатору включен в переменную окружения PATH пользователя) и установив разрешение на исполнение. Символы ‘#!’ должны быть первыми двумя символами файла. Заметьте, что символ ‘#’ в языке Python используется для обозначения комментария.

2.2.3 Инициализация при запуске в интерактивном режиме

Если Вы используете Python интерактивно, часто удобно иметь стандартный набор команд, исполняемых при каждом запуске интерпретатора. Для этого нужно присвоить переменной окружения PYTHONSTARTUP имя файла, содержащего команды инициализации (аналогично ‘.profile’ для UNIX shell).

Указанный файл читается только в интерактивном режиме и не используется, если команды читаются из файла, через конвейер или если терминал явно указан в качестве источника. Инициализационный файл исполняется в том же пространстве имен, что и интерактивные команды, то есть определенные в нем объекты и импортированные модули могут быть использованы далее без каких-либо ограничений. В этом файле Вы также можете переопределить первичное (sys.ps1) и вторичное (sys.ps2) приглашения.

22

Глава 2. Использование интерпретатора

Если Вы хотите считывать дополнительно инициализационный файл из текущего каталога, следует включить соответствующие инструкции в глобальный инициализационный файл, например:

if os.path.isfile(’.pythonrc.py’): execfile(’.pythonrc.py’)

Если необходимо использовать инициализационный файл в программе, Вы должны указать это явно:

import os

filename = os.environ.get(’PYTHONSTARTUP’) if filename and os.path.isfile(filename):

execfile(filename)

23

Глава 3

Неформальное введение в Python

В следующих примерах ввод и вывод различаются наличием или отсутствием приглашения (‘>>> ’ или ‘... ’): для воспроизведения примера Вам следует после появления приглашения набрать весь следующий за приглашением текст. Строки в примере, не начинающиеся с приглашения, выдаются самим интерпретатором. Обратите внимание, что наличие в строке только вторичного приглашения в примерах означает, что Вы должны ввести пустую строку — таким образом в интерактивном режиме обозначается конец многострочных команд.

Многие примеры в книге, даже если они вводятся в интерактивном режиме, снабжены комментариями. Комментарии в языке Python начинаются с символа ‘#’ и продолжаются до конца строки. Комментарий может начинаться в начале строки или после кода, но не внутри строковых выражений. Символ ‘#’ в строковом выражении является всего лишь символом ‘#’.

Несколько примеров:

# ЬФП РЕТЧЩК ЛПННЕОФБТЙК

SPAM = 1

#

Б ЬФП ЧФПТПК

 

#

... Й, ОБЛПОЕГ, ФТЕФЙК!

STRING = "# ьФП ОЕ ЛПННЕОФБТЙК."

3.1Использование интерпретатора Python в качестве калькулятора

Давайте испробуем несколько простых команд Python. Запустите интерпретатор и дождитесь появления первичного приглашения ‘>>> ’ (это не должно занять много времени.)

3.1.1 Числа

Интерпретатор работает как простой калькулятор: Вы можете набрать выражение, и он выведет результат. Синтаксис выражений прост: операторы +, -, * и / работают, как и в большинстве других языков (например, в Pascal и C). Для группирования можно использовать скобки. Например:

24

Глава 3. Неформальное введение в Python

>>>2+2

4

>>># ьФП ЛПННЕОФБТЙК

... 2+2 4

>>> 2+2 # лПННЕОФБТЙК Ч ФПК ЦЕ УФТПЛЕ, ЮФП Й ЛПД 4

>>>(50-5*6)/4

5

>>># рТЙ ГЕМПЮЙУМЕООПН ДЕМЕОЙЙ ТЕЪХМШФБФ ПЛТХЗМСЕФУС Ч

... # НЕОШЫХА УФПТПОХ:

... 7/3 2

>>>7/-3

-3

Подобно С, знак равенства (‘=’) используется для присваивания значения переменной. Присвоенное значение при этом не выводится:

>>>width = 20

>>>height = 5*9

>>>width * height

900

Значение можно присвоить одновременно нескольким переменным:

>>>x = y = z = 0 # рЕТЕНЕООЩН x, y Й z РТЙУЧБЙЧБЕФУС 0

>>>x

0

>>>y

0

>>>z

0

Имеется полная поддержка чисел с плавающей точкой. Операторы со смешанными типами операндов преобразуют целый операнд в число с плавающей точкой:

>>>4 * 2.5 / 3.3

3.0303030303030303

>>>7.0 / 2

3.5

Также поддерживаются и комплексные числа. Мнимая часть записывается с суффиксом ‘j’ или ‘J’. Комплексные числа записываются как ‘(real+imagj)’ или могут быть созданы функцией ‘complex(real, imag)’.

3.1. Использование интерпретатора Python в качестве калькулятора

25

>>>1j * 1J (-1+0j)

>>>1j * complex(0,1) (-1+0j)

>>>3+1j*3

(3+3j)

>>>(3+1j)*3

(9+3j)

>>>(1+2j)/(1+1j)

(1.5+0.5j)

Комплексные числа представляются двумя числами с плавающей точкой — действительной и мнимой частью. Чтобы извлечь эти части из комплексного числа z, используйте z.real and z.imag.

>>>a=1.5+0.5j

>>>a.real

1.5

>>> a.imag 0.5

Функции преобразования к целому числу и числу с плавающей точкой (int(), long() и float()) не работают для комплексных чисел — такое преобразование неоднозначно. Используйте abs(z) для получения абсолютного значения и z.real для получения вещественной части.

>>>a=1.5+0.5j

>>>float(a)

Traceback (innermost last): File "<stdin>", line 1, in ?

TypeError: can’t convert complex to float; use e.g. abs(z)

>>>a.real

1.5

>>>abs(a)

1.5811388300841898

Винтерактивном режиме последнее выведенное значение сохраняется в переменной _. Это позволяет использовать Python в качестве настольного калькулятора, например:

>>>tax = 17.5 / 100

>>>price = 3.50

>>>price * tax

0.61249999999999993

>>> price + _

26

Глава 3. Неформальное введение в Python

4.1124999999999998

>>> print round(_, 2) 4.11

Пользователь должен обращаться с ней как с переменной, доступной только для чтения. Не присваивайте ей значение явно — Вы создадите независимую локальную переменную с таким же именем, сделав встроенную переменную недоступной.

3.1.2 Строки

Кроме чисел, Python также может работать со строками (string), которые могут быть записаны различными путями1. Они могут быть заключены в одинарные или двойные кавычки:

>>>’spam eggs’ ’spam eggs’

>>>’doesn\’t’

"doesn’t"

>>>"doesn’t"

"doesn’t"

>>>’"Yes," he said.’ ’"Yes," he said.’

>>>"\"Yes,\" he said." ’"Yes," he said.’

>>>’"Isn\’t," she said.’ ’"Isn\’t," she said.’

Длинные строковые выражения могут быть разбиты различными способами на несколько строк. Символ новой строки может быть “спрятан” с помощью обратной косой черты (‘\’), например:

hello = "ьФП ДМЙООПЕ УФТПЛПЧПЕ ЧЩТБЦЕОЙЕ, УПДЕТЦБЭЕЕ\n\ ОЕУЛПМШЛП УФТПЛ ФЕЛУФБ, ЛБЛ чЩ ВЩ ЬФП УДЕМБМЙ Ч C.\n\

пВТБФЙФЕ ЧОЙНБОЙЕ, ЮФП РТПВЕМЩ Ч\ ОБЮБМЕ УФТПЛЙ\nЙНЕАФ ЪОБЮЕОЙЕ.\n"

print hello

Результат будет следующим:

ьФП ДМЙООПЕ УФТПЛПЧПЕ ЧЩТБЦЕОЙЕ, УПДЕТЦБЭЕЕ ОЕУЛПМШЛП УФТПЛ ФЕЛУФБ, ЛБЛ чЩ ВЩ ЬФП УДЕМБМЙ Ч C.

1В настоящее время Python считает печатными 7-битное подмножество символов. Представление же остальных символов выводится с использованием управляющих последовательностей, что делает работу в интерактивном режиме, например, с русским языком неудобной. По этой причине текст в некоторых примерах данной книги оставлен без перевода.

3.1. Использование интерпретатора Python в качестве калькулятора

27

пВТБФЙФЕ ЧОЙНБОЙЕ, ЮФП РТПВЕМЩ Ч ОБЮБМЕ УФТПЛЙ ЙНЕАФ ЪОБЮЕОЙЕ.

По-другому, текст может быть заключен в утроенные кавычки: """ или ’’’. Концы строк не нужно “прятать” при использовании утроенных кавычек, но они будут включены в текст.

print """

Usage: thingy [OPTIONS]

-h

 

Display this usage message

-H

hostname

Hostname to connect to

"""

выведет следующее:

 

Usage: thingy [OPTIONS]

 

-h

Display this usage message

-H hostname

Hostname to connect to

Интерпретатор выводит результат строковых операций в том же виде, в котором они могли бы быть набраны: в кавычках, обходя кавычки и другие специальные символы с помощью управляющих последовательностей, начинающихся с обратной косой черты (‘\’). Текст заключается в двойные кавычки, если он не содержит двойные кавычки, во всех остальных случаях, он выводится в одинарных кавычках. Инструкция print, описанная ниже, может быть использована для вывода текста без кавычек и специальных последовательностей.

Существует также “необрабатываемый” режим ввода строк, задаваемый с помощью буквы ‘r’ или ‘R’ перед кавычками: в этом случае символ обратной косой черты также может быть использован для маскировки символов одинарной и двойной кавычек, если им предшествует нечетное число символов обратной косой черты, однако сам символ обратной косой черты остается частью строки. Даже в таком режиме строка не может заканчиваться нечетным количеством символов обратной косой черты. Необрабатываемый режим наиболее полезен в тех случаях, когда необходимо вводить значительное количество символов обратной косой черты, например, в регулярных выражениях.

Строки можно объединить (склеить) с помощью оператора + и размножить оператором *:

>>>word = ’Help’ + ’A’

>>>word

’HelpA’

>>> ’<’ + word*5 + ’>’ ’<HelpAHelpAHelpAHelpAHelpA>’

Две строки, записанные друг за другом, автоматически объединяются. Первая строка в приведенном примере может быть также записана как ‘word = ’Help’ ’A’’.

28

Глава 3. Неформальное введение в Python

Такой метод работает только для строк записанных непосредственно, но не для произвольных строковых выражений.

>>> ’str’ ’ing’

 

# рТБЧЙМШОП

’string’

 

 

>>> ’str’.strip()

+ ’ing’

# рТБЧЙМШОП

’string’

 

 

>>> ’str’.strip()

’ing’

# пЫЙВЛБ

File "<stdin>",

line 1

 

’str’.strip()

’ing’

 

 

^

 

SyntaxError: invalid syntax

Строка — последовательность символов с произвольным доступом, Вы можете получить любой символ строки по его индексу. Подобно C, первый символ имеет индекс 0. Нет отдельного типа для символа, символ — это просто строка единичной длины. Подобно Icon, подстрока может быть определена с помощью среза — двух индексов, разделенных двоеточием.

>>>word[4]

’A’

>>>word[0:2]

’He’

>>>word[2:4]

’lp’

Строки в языке Python невозможно изменить. Попытка изменить символ в определенной позиции или подстроку вызовет ошибку:

>>>word[0] = ’x’ Traceback (innermost last):

File "<stdin>", line 1, in ?

TypeError: object doesn’t support item assignment

>>>word[:-1] = ’Splat’

Traceback (innermost last): File "<stdin>", line 1, in ?

TypeError: object doesn’t support slice assignment

Индексы среза имеют полезные значения по умолчанию: опущенный первый индекс считается равным 0, опущенный второй индекс дает такой же результат, как если бы он был равен длине строки.

>>>word[:2] # рЕТЧЩЕ ДЧБ УЙНЧПМБ

’He’

>>>word[2:] # чУС УФТПЛБ, ЛТПНЕ РЕТЧЩИ ДЧХИ УЙНЧПМПЧ ’lpA’

3.1. Использование интерпретатора Python в качестве калькулятора

29

Полезный инвариант операции среза: s[:i] + s[i:] равно s.

>>>word[:2] + word[2:] ’HelpA’

>>>word[:3] + word[3:] ’HelpA’

Срезы с вырожденными индексами обрабатываются изящно: слишком большой индекс обрабатывается, как если бы он был равен длине строки; если верхняя граница меньше нижней, то возвращается пустая строка.

>>>word[1:100]

’elpA’

>>>word[10:]

’’

>>>word[2:1]

’’

Индексы могут иметь отрицательные значения, для отсчета с конца:

>>>word[-1] # рПУМЕДОЙК УЙНЧПМ

’A’

>>>word[-2] # рТЕДРПУМЕДОЙК УЙНЧПМ

’p’

>>>word[-2:] # рПУМЕДОЙЕ ДЧБ УЙНЧПМБ

’pA’

>>>word[:-2] # лТПНЕ РПУМЕДОЙИ ДЧХИ УЙНЧПМПЧ ’Hel’

Однако -0 обозначает то же самое, что и 0, то есть не будет отсчитываться с конца.

>>> word[-0] # (ФБЛ ЛБЛ -0 ТБЧЕО 0) ’H’

Отрицательные индексы в срезах выходящие за пределы обрабатываются, как если бы они были равны нулю, но не пытайтесь использовать это для простых индексов (с одним элементом):

>>>

word[-100:]

 

’HelpA’

 

>>>

word[-10]

# пЫЙВЛБ

Traceback (innermost last):

File "<stdin>", line 1

IndexError: string index out of range

30

Глава 3. Неформальное введение в Python

Лучший способ запомнить, как определяются индексы в срезе — считать их указывающими между символами, с номером 0 на левой границе первого символа. А правая граница последнего символа имеет индекс равный длине строки, например:

 

H

 

e

 

 

l

 

p

 

A

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

1

2

3

4

5

5

4

3

2

1

 

 

Первая строка чисел показывает позиции в строке, на которые указывают индексы от 0 до 5, вторая — соответствующие отрицательные индексы. Срез от i до j включает в себя все символы между краями, помеченными i и j, соответственно.

Для неотрицательных индексов длина подстроки равняется разности индексов, если они оба не выходят за пределы диапазона, например, длина подстроки word[1:3] равна 2.

Встроенная функция len() возвращает длину строки:

>>>s = ’supercalifragilisticexpialidocious’

>>>len(s)

34

3.1.3Строки Unicode

Начиная с версии 1.6, в языке Python доступен новый тип данных для хранения текста — строка Unicode. Его можно использовать для работы с текстом, содержащим одновременно буквы и символы нескольких языков, доступных в Unicode (см. http://www.unicode.org). Строки Unicode полностью интегрируется с обычными строками, автоматически производя, где это необходимо, преобразование.

Unicode имеет значительное преимущество — предоставляет возможность использовать все символы, используемые в современных и древних текстах. Ранее мы могли использовать только 256 символов из определенной кодовой страницы, что приводило к большим затруднениям, особенно при интернационализации (internationalization, обычно записывается как i18n — i + 18 символов + n) программного обеспечения. Unicode решает эту проблему, определяя одну кодовую страницу для всех символов.

Создаются строки Unicode настолько же просто, как и обычные строки:

>>> u’Hello World !’ u’Hello World !’