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

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

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

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

31

Маленькая буква ‘u’ перед кавычками указывает, что предполагается создание строки Unicode. Если Вы хотите включить в строку специальные символы, используйте управляющие последовательности:

>>> u’Hello\u0020World !’ u’Hello World !’

Управляющая последовательность \u0020 указывает, что необходимо вставить Unicode символ с порядковым номером в шестнадцатеричной системе исчисления 0x0020 (пробел).

Благодаря тому, что первые 256 символов Unicode те же, что и в стандартной кодировке Latin-1, ввод текста на большинстве языков, используемых в западных странах, сильно упрощается.

Как и для обычных строк, для строк Unicode существует “необрабатываемый” режим, задаваемый с помощью буквы ‘r’ или ‘R’ перед кавычками. Управляющими считаются только последовательности, которые применяются для обозначения символов Unicode, и только если используется нечетное количество символов обратной косой черты перед буквой ‘u’:

>>>ur’Hello\u0020World !’ u’Hello World !’

>>>ur’Hello\\u0020World !’ u’Hello\\\\u0020World !’

Кроме описанного выше метода, Python предоставляет возможность создать строку Unicode на основе строки в известной кодировке. Встроенная функция unicode() может работать с Latin-1, ASCII, UTF-8, UTF-16, с русскими кодировками ISO-8859- 5, KOI8-R, CP1251, CP866 и Mac-cyrillic, и многими другими. Python по умолчанию использует кодировку ASCII2, например, при выводе на экран инструкцией print и записи в файл. Если у Вас есть данные в определенной кодировке, для получения строки Unicode используйте встроенную функцию unicode(), указав кодировку в качестве второго аргумента:

>>>s = unicode("рТЙЧЕФ", "KOI8-R")

>>>s u’\u041F\u0440\u0438\u0432\u0435\u0442’

Если строка Unicode содержит символы с кодом больше 127, преобразование в ASCII не возможно:

>>> str(s)

Traceback (most recent call last):

2ASCII является общей частью для подавляющего большинства кодировок. Вы можете изменить кодировку по умолчанию с помощью функции sys.set_string_encoding(). Однако лучше все же указывать ее явно.

32

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

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

UnicodeError: ASCII encoding error: ordinal not in range(128)

Метод encode() позволяет преобразовывать строки Unicode в обычные строки, содержащие текст в указанной кодировке:

>>>s.encode("KOI8-R") ’\360\322\311\327\305\324’

>>>s.encode("UTF-8") ’\320\237\321\200\320\270\320\262\320\265\321\202’

3.1.4Списки

В Python имеется несколько типов данных, используемых для группирования вместе нескольких значений. Самым гибким является список (list), который может быть записан в виде списка значений (элементов), разделенных запятыми, заключенного в квадратные скобки. Совсем не обязательно, чтобы элементы списка были одного типа.

>>>a = [’spam’, ’eggs’, 100, 1234]

>>>a

[’spam’, ’eggs’, 100, 1234]

Как и для строк, для списков нумерация индексов начинается с нуля. Для списка можно получить срез, объединить несколько списков и так далее:

>>>a[0]

’spam’

>>>a[3]

1234

>>>a[-2]

100

>>>a[1:-1] [’eggs’, 100]

>>>a[:2] + [’bacon’, 2*2] [’spam’, ’eggs’, ’bacon’, 4]

>>>3*a[:3] + [’Boe!’]

[’spam’, ’eggs’, 100, ’spam’, ’eggs’, 100, ’spam’, ’eggs’, 100, ’Boe!’]

В отличие от строк, которые неизменяемы (immutable), существует возможность изменения отдельных элементов списка:

>>> a

[’spam’, ’eggs’, 100, 1234]

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

33

>>>a[2] = a[2] + 23

>>>a

[’spam’, ’eggs’, 123, 1234]

Присваивание срезу также возможно, и это может привести к изменению размера списка:

>>># ъБНЕОЙФШ ОЕУЛПМШЛП ЬМЕНЕОФПЧ:

... a[0:2] = [1, 12]

>>>a

[1, 12, 123, 1234]

>>># ХДБМЙФШ:

... a[0:2] = []

>>>a

[123, 1234]

>>> # чУФБЧЙФШ:

... a[1:1] = [’bletch’, ’xyzzy’]

>>> a

[123, ’bletch’, ’xyzzy’, 1234]

>>># чУФБЧЙФШ ЛПРЙА УБНПЗП УЕВС Ч ОБЮБМП:

>>>a[:0] = a

>>>a

[123, ’bletch’, ’xyzzy’, 1234, 123, ’bletch’, ’xyzzy’, 1234]

Встроенная функция len() также применима и к спискам:

>>> len(a) 8

Списки могут быть вложенными (списки, содержащие другие списки), например:

>>>q = [2, 3]

>>>p = [1, q, 4]

>>>len(p)

3

>>>p[1] [2, 3]

>>>p[1][0]

2

>>>p[1].append(’xtra’)

>>>p

[1, [2, 3, ’xtra’], 4]

>>> q

[2, 3, ’xtra’]

Как Вы уже, наверное, догадались, метод append() добавляет элемент в конец списка. Заметьте, что p[1] и q на самом деле ссылаются на один и тот же объект!

34

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

3.2Первые шаги к программированию

Конечно, мы можем использовать Python для более сложных задач, чем “два плюс два”. Например, можно вывести начало ряда Фибоначчи:

>>> # тСД жЙВПОБЮЮЙ:

... # УХННБ ДЧХИ РТЕДЩДХЭЙИ ЬМЕНЕОФПЧ ПРТЕДЕМСЕФ

... # УМЕДХАЭЙК

... a, b = 0, 1

>>> while b < 10:

... print b

... a, b = b, a+b

...

1

1

2

3

5

8

Этот пример знакомит с несколькими новыми особенностями.

Первая строка содержит множественное присваивание (multiple assignment): переменным a и b одновременно присваиваются новые значения 0 и 1. В последней строке оно используется снова, демонстрируя, что выражения в правой части вычисляются до того как будет осуществлено присваивание. Выражения в правой части вычисляются слева направо.

Цикл while выполняется пока условие (здесь: b < 10) является истинным. В Python, как и в С, любое ненулевое значение является истиной, ноль — ложь. В качестве условия может служить также строка, список — на самом деле любая последовательность. Последовательность с ненулевой длиной является истиной, пустая — ложью. Проверка, использованная в примере, является простым сравнением. Стандартные операторы сравнения записываются так же, как в С: <, >, ==, <= (меньше или равно), >= (больше или равно) и != (не равно).

Тело цикла записано с отступом: отступы используются в языке Python для записи группирующих инструкций. Интерпретатор (пока) не предоставляет разумных средств редактирования вводимых строк, поэтому Вам необходимо нажимать клавишу табуляции или пробела для каждой строки с отступом. На практике Вы будете готовить более сложный ввод для Python с помощью текстового редактора, большинство из которых позволяют делать сдвиг автоматически. Когда составная инструкция вводится интерактивно, за ним должна следовать пуста строка, как признак завершения (поскольку синтаксический анализатор не может угадать, когда Вы ввели последнюю строку). Заметим, что сдвиг строк внутри блока должен быть одинаковым.

3.2. Первые шаги к программированию

35

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

>>>i = 256*256

>>>print ’ъОБЮЕОЙЕ РЕТЕНЕООПК i ТБЧОП’, i

ъОБЮЕОЙЕ РЕТЕНЕООПК i ТБЧОП 65536

Завершающая запятая позволяет после вывода значения вставлять пробел вместо перехода на новую строку:

>>>a, b = 0, 1

>>>while b < 1000:

... print b,

... a, b = b, a+b

...

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

Обратите внимание, что интерпретатор переходит на новую строку перед выводом следующего приглашения, даже если последняя выведенная строка не завершается переходом на новую строку.

36

Глава 4

Средства управления логикой

Кроме только что представленной инструкции while, в языке Python присутствуют другие привычные средства управления логикой программы с небольшими изменениями.

4.1Инструкция if

Пожалуй, наиболее известной является инструкция if:

>>>x = int(raw_input("чЧЕДЙФЕ, РПЦБМХКУФБ, ЮЙУМП: "))

>>>if x < 0:

...

x = 0

...

print ’пФТЙГБФЕМШОПЕ, НЕОСЕН ОБ ОПМШ’

... elif x == 0:

...

print ’îÏÌØ’

... elif x == 1:

...

print ’ïÄÉÎ’

... else:

 

...

print ’вПМШЫЕ’

...

 

Ветвь elif может, как совсем отсутствовать, так и присутствовать несколько раз; наличие ветви else необязательно. Ключевое слово elif является короткой формой для else if и позволяет избежать чрезмерных отступов. Последовательность if ...

elif ... elif ... эквивалентна инструкциям switch и case в других языках.

4.2 Инструкция for

Инструкция for в языке Python немного отличается от того, что используется в таких языках как C или Pascal. Вместо того, чтобы всегда перебирать числа арифметической прогрессии (как в Pascal), или предоставлять пользователю полную свободу выбора итератора и условия выхода из цикла (как в С), перебирает элементы произвольной1

1С формальной точки зрения это не совсем так: в языке Python под последовательностью всегда подразумевается последовательность с произвольным доступом; средства для работы с последовательностями

4.3. Функции range() и xrange()

37

последовательности (например, списка или строки) в порядке их следования:

>>># йЪНЕТЕОЙЕ ОЕУЛПМШЛЙИ УФТПЛ:

... a = [’ЛПФ’, ’ПЛОП’, ’ЧЩВТПУЙФШ’]

>>>for x in a:

... print x, len(x)

...

ËÏÔ 3 ÏËÎÏ 4

ЧЩВТПУЙФШ 9

Небезопасно изменять в цикле итерируемую последовательность (такое возможно только для последовательностей, допускающих изменение, например, списков). Если Вы собираетесь вносить изменения в список, элементы которого перебираете, например, продублировать избранные элементы, следует перебирать элементы копии исходного списка. Запись в виде среза делает это особенно удобным:

>>> for x in a[:]: # УДЕМБФШ ЛПРЙА (УТЕЪБ) ЧУЕЗП УРЙУЛБ

... if len(x) > 4: a.insert(0, x)

...

>>> for x in a:

... print x,

...

ЧЩВТПУЙФШ ЛПФ ПЛОП ЧЩВТПУЙФШ

Используя средства функционального программирования (см. раздел 5.2), можно одновременно перебирать элементы нескольких последовательностей.

4.3Функции range() и xrange()

Если Вам необходимо перебирать последовательность чисел, то пригодится встроенная функция range(). Она создает список, содержащий арифметическую прогрессию:

>>>

range(10)

 

 

[0,

1, 2, 3, 4, 5, 6, 7,

8,

9]

Указанная верхняя граница никогда не входит в созданную последовательность. range(10) создает список из 10 значений, точно соответствующих допустимым индексам для элементов последовательности, имеющей длину 10. Можно указать другую нижнюю границу или другое приращение (шаг), в том числе и отрицательное:

(в том числе и инструкция for) требует возможности получить произвольный элемент по индексу.

38

Глава 4. Средства управления логикой

>>>range(5, 10) [5, 6, 7, 8, 9]

>>>range(0, 10, 3) [0, 3, 6, 9]

>>>range(-10, -100, -30) [-10, -40, -70]

Для того, чтобы перебрать индексы последовательности, используйте совместно range() и len():

>>>a = [’х’, ’нБТЙЙ’, ’ЕУФШ’, ’НБМЕОШЛБС’, ’ПЧЕЮЛБ’]

>>>for i in range(len(a)):

... print i, a[i]

...

0 õ

1 нБТЙЙ

2 ÅÓÔØ

3 НБМЕОШЛБС

4 ПЧЕЮЛБ

Дотошный читатель может заметить, что если нужно перебирать числа большого диапазона, создание списка будет неоправданно, а в некоторых случаях просто не хватит памяти:

>>> l=range(10000000) Traceback (innermost last):

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

Действительно, если мы не собираемся изменять список, достаточно создать псевдосписок — объект, для которого мы можем получить значения “элементов”, но не можем изменить их или порядок их следования. Для этих целей в языке Python предусмотрена функция xrange():

>>>xrange(5, 10) (5, 6, 7, 8, 9)

>>>xrange(0, 10, 3) (0, 3, 6, 9)

>>>xrange(-10, -100, -30) (-10, -40, -70)

>>>a = [’х’, ’нБТЙЙ’, ’ЕУФШ’, ’НБМЕОШЛБС’, ’ПЧЕЮЛБ’]

>>>for i in xrange(len(a)):

... print i, a[i]

...

0 õ

1 нБТЙЙ

4.4. Инструкции break и continue, ветвь else в циклах

39

2 ÅÓÔØ

3 НБМЕОШЛБС

4 ПЧЕЮЛБ

4.4Инструкции break и continue, ветвь else в циклах

Инструкция break, как и в C, выходит из самого внутреннего вложенного цикла for или while. Инструкция continue, также позаимствованная из C, продолжает выполнение цикла со следующей итерации.

Циклы могут иметь ветвь else, которая выполняется при “нормальном” выходе (исчерпание последовательности в цикле for, неудовлетворение условия в цикле while), без прерывания инструкцией break. Продемонстрируем ее использование на примере поиска простых чисел:

>>>

for

n in xrange(2, 10):

...

 

 

for x in xrange(2, n):

...

 

 

if n % x == 0:

...

 

 

print n, ’=’, x, ’*’, n/x

...

 

 

break

...

 

 

else:

...

 

 

print n, ’- РТПУФПЕ ЮЙУМП’

...

 

 

 

2

-

РТПУФПЕ ЮЙУМП

3

-

РТПУФПЕ ЮЙУМП

4

=

2

*

2

5

-

РТПУФПЕ ЮЙУМП

6

=

2

*

3

7

-

РТПУФПЕ ЮЙУМП

8

=

2

*

4

9

=

3

*

3

4.5 Инструкция pass

Инструкция pass ничего не делает и может быть использована там, где инструкция требуется синтаксисом языка, однако действий никаких выполнять не требуется:

>>> while 1:

...

pass # пЦЙДБОЙЕ РТЕТЩЧБОЙС ПФ ЛМБЧЙБФХТЩ

...

 

40

Глава 4. Средства управления логикой

4.6 Определение функций

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

>>> def fib(n):

 

 

 

 

...

 

’’’чЩЧПДЙФ РПУМЕДПЧБФЕМШОПУФШ ЮЙУЕМ жЙВПОБЮЮЙ,

...

 

ОЕ РТЕЧЩЫБАЭЙИ n’’’

 

...

 

a, b = 0,

1

 

 

 

...

 

while b <

n:

 

 

 

...

 

print

b,

 

 

 

...

 

a, b = b, a+b

 

...

 

 

 

 

 

 

>>> # фЕРЕТШ ЧЩЪПЧЕН

ФПМШЛП ЮФП ПРТЕДЕМЕООХА ЖХОЛГЙА

... fib(2000)

 

 

 

 

1 1

2 3

5 8 13 21

34

55

89 144

233 377 610 987 1597

Ключевое слово def представляет определение функции. После него должно следовать имя функции и, в скобках, список формальных параметров. Инструкции, образующие тело функции, записываются с отступом, начиная со следующей строки. Первой инструкцией тела функции может быть строка документации (см. раздел 4.7.5). Существуют средства для автоматического создания документации, а также средства, позволяющие пользователю просматривать строки документации в интерактивном режиме. Включение строк документации в код является хорошей традицией.

Выполнение функции вводит новую таблицу имен, используемую для локальных переменных. Точнее, все присваивания переменным в теле функции сохраняются в локальной таблице имен. При ссылке на переменную, ее поиск производится сначала в локальной таблице имен, затем в глобальной и, в последнюю очередь, в таблице встроенных имен. Так, глобальным переменным нельзя прямо присвоить значение в теле функции (не упомянув их перед этим в инструкции global), хотя на них можно ссылаться.

Аргументы функции в момент вызова помещаются в локальную таблицу имен вызываемой функции. Таким образом, аргументы передаются по значению (где значение всегда является ссылкой на объект, а не его значением)2. В случае вызова функции другой функцией, также создается новая локальная таблица имен для этого вызова.

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

>>> fib

<function object at 10042ed0>

2На самом деле, правильнее было бы сказать, что аргументы передаются по ссылке на объект: если передается объект, допускающий изменения, то изменения (например, добавление элементов в список) будут видны в том месте, откуда функция была вызвана.