Python/Учебник Python 2.6: различия между версиями

Содержимое удалено Содержимое добавлено
орфография
м <source> -> <syntaxhighlight> (phab:T237267)
 
Строка 92:
При наборе символа конца файла (<tt>Ctrl-D</tt> в Unix, <tt>Ctrl-Z</tt> в Windows) в ответ на основное приглашение интерпретатора, последний будет вынужден закончить работу с нулевым статусом выхода. Если это не сработает — вы можете выйти из интерпретатора путём ввода следующих команд:
 
<sourcesyntaxhighlight lang="python">import sys; sys.exit()</sourcesyntaxhighlight>
 
Особенности редактирования строк в интерпретаторе, обычно не вызывают, особых сложностей. Те, кто установил интерпретатор на машину Unix, потенциально имеют поддержку библиотеки [[w:GNU Readline|GNU Readline]], обеспечивающей усовершенствованное интерактивное редактирование и сохранение истории. Самый быстрый, наверное, способ проверить, поддерживается ли расширенное редактирование командной строки, заключается в нажатии <tt>Ctrl-P</tt> в ответ на первое полученное приглашение Python. Если вы услышите сигнал — значит вам доступно редактирование командной строки — тогда обратитесь к [[Учебник Python 2.6 — Приложения#Интерактивное редактирование входных данных и подстановка истории|Приложению об Интерактивном редактировании входных данных]] за описанием клавиш. Если на ваш взгляд ничего не произошло или отобразился символ <tt>^P</tt> — редактирование командной строки недоступно — удалять символы из текущей строки возможно будет лишь использованием клавиши <tt>Backspace</tt>.
Строка 114:
Если команды считываются с <tt>tty</tt> — говорят, что интерпретатор находится в ''интерактивном режиме'' (режиме диалога). В этом режиме он приглашает к вводу следующей команды, отобразив ''основное приглашение''<ref>''(Прим. перев.)'' <tt>primary prompt</tt> — ''зд.'', основное приглашение: приглашение к вводу команды или нескольких команд (сценария);</ref> (обычно это три знака «больше-чем» — <tt>&gt;&gt;&gt;</tt>); в то же время, для ''продолжающих строк''<ref>''(Прим. перев.)'' <tt>continuation lines</tt> — ''зд.'', продолжающие строки (строки продолжения): строки, продолжающие текст команды (оператора, выражения), или раскрывающие внутреннее устройство внешнего оператора (команды, выражения), в последнем случае определяются дополнительным отступом от края — углублением в структуру;</ref> выводится ''вспомогательное приглашение''<ref>''(Прим. перев.)'' <tt>secondary prompt</tt> — ''зд.'', вспомогательное приглашение: приглашение к продолжению ввода команды или набора команд (сценария) с использованием ''продолжающих строк'';</ref> (по умолчанию — три точки — <tt>...</tt>). Перед выводом первого приглашения интерпретатор отображает приветственное сообщение, содержащее номер его версии и пометку о правах копирования:
 
<sourcesyntaxhighlight lang="python">python
Python 2.6 (#1, Feb 28 2007, 00:02:06)
Type "help", "copyright", "credits" or "license" for more information.
>>></sourcesyntaxhighlight>
 
''Продолжающие строки'' используются в случаях, когда необходимо ввести многострочную конструкцию. Взгляните, например, на следующий оператор <code>if</code><ref>''(Прим. перев.)'' Здесь и далее тексты некоторых исходных кодов также будут переведены в примечаниях (вместе с ключевыми словами, поэтому их нельзя будет запустить в интерпретаторе), чтобы показать их смысл или задумку, которые не всегда очевидны без перевода (если он вам нужен :) ):<br/><br/>
Строка 126:
<span style="color: #030">Будьте осторожны — не упадите!</span></code><br/></ref>:
 
<sourcesyntaxhighlight lang="python">>>> the_world_is_flat = 1
>>> if the_world_is_flat:
... print ("Be careful not to fall off!")
...
Be careful not to fall off!</sourcesyntaxhighlight>
 
=== Интерпретатор и его окружение ===
Строка 168:
Например, для написания таких символов в кодировке Unicode, как, например, знак валюты Евро — может быть использована кодировка <tt>ISO-8859-15</tt>, где знак Евро имеет порядковый номер 164. Этот сценарий выведет значение 8346 (место в таблице Unicode, соответствующее символу Евро) и затем выполнит выход:
 
<sourcesyntaxhighlight lang="python"># -*- coding: iso-8859-15 -*-
currency = u"€"
print ord(currency)</sourcesyntaxhighlight>
 
Если ваш редактор поддерживает сохранение файлов в <tt>UTF-8</tt> вместе с пометкой порядка байтов (также известной как BOM - ''Byte Order Mark'') — вы можете использовать эту его возможность вместо указания кодировки. Редактор IDLE приобретает такую способность при установленном пункте меню <tt>Options/General/Default Source Encoding/UTF-8</tt>. Обратите внимание, что такие файлы не распознаются в прошлых релизах (2.2 и ранее), и также не распознаются самой операционной системой в случае файлов сценария со строкой <tt>#!</tt> в заголовке (используется только в системах Unix).
Строка 185:
Если вы хотите прочитать дополнительный файл запуска из текущего каталога — вы можете использовать код вроде:
 
<sourcesyntaxhighlight lang="python">if os.path.isfile('.pythonrc.py'): execfile('.pythonrc.py')</sourcesyntaxhighlight>
 
Если вы хотите использовать файл запуска в сценарии — вам нужно будет указать это явно:
 
<sourcesyntaxhighlight lang="python">import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
execfile(filename)</sourcesyntaxhighlight>
 
== Неформальное введение в Python ==
Строка 202:
Несколько примеров:
 
<sourcesyntaxhighlight lang="python"># это первый комментарий
SPAM = 1 # а это второй комментарий
# ... и наконец третий!
STRING = "# Это не комментарий."</sourcesyntaxhighlight>
 
=== Использование Python в качестве калькулятора ===
Строка 215:
Поведение интерпретатора сходно поведению калькулятора: вы вводите выражение, а в ответ он выводит значение. Синтаксис выражений прямолинеен: операторы <code>+</code>, <code>-</code>, <code>*</code> и <code>/</code> работают также как и в большинстве других языков (например, Паскале или C); для группировки можно использовать скобки. Например:
 
<sourcesyntaxhighlight lang="python">>>> 2+2
4
>>> # Это комментарий
Строка 228:
2
>>> 7//-3
-3</sourcesyntaxhighlight>
 
Знак равенства (<code>'='</code>) используется для присваивания переменной какого-либо значения. После этого действия в интерактивном режиме ничего не выводится:
 
<sourcesyntaxhighlight lang="python">>>> width = 20
>>> height = 5*9
>>> width * height
900</sourcesyntaxhighlight>
 
Значение может быть присвоено нескольким переменным одновременно:
 
<sourcesyntaxhighlight lang="python">>>> x = y = z = 0 # Нулевые x, y и z
>>> x
0
Строка 245:
0
>>> z
0</sourcesyntaxhighlight>
 
Переменные должны быть ''определены'' (<tt>defined</tt>) (должны иметь присвоенное значение) перед использованием, иначе будет сгенерирована ошибка:
 
<sourcesyntaxhighlight lang="python"> >>> # попытка получить доступ к неопределённой переменной
... n
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'n' is not defined</sourcesyntaxhighlight>
 
Присутствует полная поддержка операций с плавающей точкой; операторы с операндами смешанного типа конвертируют целочисленный операнд в число с плавающей точкой:
 
<sourcesyntaxhighlight lang="python">>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5</sourcesyntaxhighlight>
 
Также поддерживаются комплексные числа; к мнимым частям добавляется суффикс <code>j</code> или <code>J</code>. Комплексные числа с ненулевым вещественным компонентом записываются в виде <code>(''<вещественная_часть>''+''<мнимая_часть>''j)</code>, или могут быть созданы с помощью функции <code>complex(''<вещественная_часть>'', ''<мнимая_часть>'')</code>.
 
<sourcesyntaxhighlight lang="python">>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0, 1)
Строка 273:
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)</sourcesyntaxhighlight>
 
Комплексные числа всегда представлены в виде двух чисел с плавающей точкой - вещественной и мнимой частями. Для получения этих частей из комплексного числа <code>z</code> используйте <code>z.real</code> и <code>z.imag</code>.
 
<sourcesyntaxhighlight lang="python">>>> a=1.5+0.5j
>>> a.real
1.5
>>> a.imag
0.5</sourcesyntaxhighlight>
 
Функции конвертации (приведения) к вещественным и целым числам (<code>float()</code>, <code>int()</code> и <code>long()</code>) не работают с комплексными числами — нет единственно правильного способа сконвертировать комплексное число в вещественное. Используйте функцию <code>abs(z)</code> чтобы получить ''модуль'' числа (в виде числа с плавающей точкой) или <code>z.real</code> чтобы получить его вещественную часть:
 
<sourcesyntaxhighlight lang="python">>>> a=3.0+4.0j
>>> float(a)
Traceback (most recent call last):
Строка 296:
>>> abs(a) # sqrt(a.real**2 + a.imag**2)
5.0
>>></sourcesyntaxhighlight>
 
В интерактивном режиме последнее выведенное выражение сохраняется в переменной <code>_</code>. Это значит, что если вы используете Python в качестве настольного калькулятора — всегда есть способ продолжить вычисления с меньшими усилиями, например:
 
<sourcesyntaxhighlight lang="python">>>> tax = 12.5 / 100
>>> price = 100.50
>>> price * tax
Строка 308:
>>> round(_, 2)
113.06
>>></sourcesyntaxhighlight>
 
Эта переменная для пользователя должна иметь статус ''только для чтения''. Не навязывайте ей значение собственноручно — вы создадите независимую переменную с таким же именем, скрывающую встроенную переменную вместе с её магическими свойствами.
Строка 316:
Помимо чисел, Python может работать со строками, которые, в свою очередь, могут быть описаны различными способами. Строки могут быть заключены в одинарные или двойные кавычки:
 
<sourcesyntaxhighlight lang="python">>>> 'spam eggs'
'spam eggs'
>>> 'doesn\'t'
Строка 327:
'"Yes," he said.'
>>> '"Isn\'t," she said.'
'"Isn\'t," she said.'</sourcesyntaxhighlight>
 
Строковые литералы могут быть разнесены на несколько строк различными способами. Могут быть использованы ''продолжающие строки'', с обратным слэшем в качестве последнего символа строки, сообщающим о том, что следующая строка есть продолжение текущей<ref>''(Прим. перев.):''<sourcesyntaxhighlight lang="python">hello = "Это довольно длинная строка, содержащая\n\
несколько строк текста — такой вы бы представили её в C.\n\
Обратите внимание, что пробельное пространство в начале строки\
имеет значение."
 
print hello</sourcesyntaxhighlight></ref>:
 
<sourcesyntaxhighlight lang="python">hello = "This is a rather long string containing\n\
several lines of text just as you would do in C.\n\
Note that whitespace at the beginning of the line is\
significant."
 
print (hello)</sourcesyntaxhighlight>
 
Обратите внимание, что для переноса строки все ещё нужно указывать <code>\n</code>; строка, за которой следует обратный слэш перенесена не будет. Запуск примера выведет следующее:
Строка 351:
Если мы объявим строковой литерал ''сырым'' (<tt>raw</tt>)<ref>''(Прим. перев.)'' ''raw string'' — для описания ''сырой строки'' (не требующей последующей обработки) используется префикс '''<code>r</code>'''.</ref> — символы <code>\n</code> не будут конвертированы в новые строки, таким образом и обратный слэш в конце строки, и символ новой строки в исходном коде — будут добавлены в строку в виде данных. Следовательно, код из примера:
 
<sourcesyntaxhighlight lang="python">hello = r"This is a rather long string containing\n\
several lines of text much as you would do in C."
 
print (hello)</sourcesyntaxhighlight>
 
выведет:
Строка 364:
Или строки могут быть обрамлены совпадающей парой тройных кавычек: <code>"""</code> или <code><nowiki>'''</nowiki></code>. Окончания каждой строчки не нужно завершать тройными кавычками. В примере ниже строки, начинающиеся с дефиса, также будут включены в строку.
 
<sourcesyntaxhighlight lang="python">print """
Usage: thingy [OPTIONS]
-h Display this usage message
-H hostname Hostname to connect to
"""</sourcesyntaxhighlight>
 
выводит в результате следующее:
 
<sourcesyntaxhighlight lang="text">Usage: thingy [OPTIONS]
-h Display this usage message
-H hostname Hostname to connect to</sourcesyntaxhighlight>
 
Интерпретатор выводит результаты операций над строками тем же способом, каким они были введены: в кавычках, а также в кавычках и с другими забавными символами, экранированными обратными слэшами — для того, чтобы показать точное значение. Строка заключается в двойные кавычки, если строка содержит одинарную кавычку и ни одной двойной, иначе она заключается в одинарные кавычки. (Оператор <code>print</code>, описанный позже, может использоваться для вывода строк без кавычек или экранирования.)
Строка 380:
Строки могут конкатенироваться (склеиваться вместе) оператором <code>+</code> и быть повторенными оператором <code>*</code>:
 
<sourcesyntaxhighlight lang="python">>>> word = 'Help' + 'A'
>>> word
'HelpA'
>>> '<' + word*5 + '>'
'<HelpAHelpAHelpAHelpAHelpA>'</sourcesyntaxhighlight>
 
Два строковых литерала, расположенные друг за другом, автоматически конкатенируются; первая строка в предыдущем примере также могла быть записана как <code>word = 'Help' 'A'</code>; это работает только с двумя литералами — не с произвольными выражениями, содержащими строки.
 
<sourcesyntaxhighlight lang="python">>>> 'str' 'ing' # <- Так — верно
'string'
>>> 'str'.strip() + 'ing' # <- Так — верно
Строка 396:
'str'.strip() 'ing'
^
SyntaxError: invalid syntax</sourcesyntaxhighlight>
 
Строки могут быть проиндексированы; также как и в C, первый символ строки имеет индекс <tt>0</tt>. Отсутствует отдельный тип для символов; символ является строкой с единичной длиной. Подобно языку [[w:Icon (язык программирования)|Icon]], подстроки могут определены через нотацию срезов (<tt>slice</tt>): два индекса, разделенных двоеточием.
 
<sourcesyntaxhighlight lang="python">>>> word = 'Help' + 'A'
>>> word[4]
'A'
Строка 406:
'He'
>>> word[2:4]
'lp'</sourcesyntaxhighlight>
 
Индексы срезов имеют полезные значения по умолчанию; опущенный первый индекс заменяется нулём, опущенный второй индекс подменяется размером срезаемой строки.
 
<sourcesyntaxhighlight lang="python">>>> word[:2] # Первые два символа
'He'
>>> word[2:] # Всё, исключая первые два символа
'lpA'</sourcesyntaxhighlight>
 
В отличие от строк в C, строки Python не могут быть изменены. Присваивание по позиции индекса строки вызывает ошибку:
 
<sourcesyntaxhighlight lang="python">>>> word[0] = 'x'
Traceback (most recent call last):
File "<stdin>", line 1, in ?
Строка 424:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: object doesn't support slice assignment</sourcesyntaxhighlight>
 
Тем не менее, создание новой строки со смешанным содержимым — процесс легкий и очевидный:
 
<sourcesyntaxhighlight lang="python">>>> 'x' + word[1:]
'xelpA'
>>> 'Splat' + word[4]
'SplatA'</sourcesyntaxhighlight>
 
Полезный инвариант операции среза: <code>s[:i] + s[i:]</code> эквивалентно <code>s</code>.
 
<sourcesyntaxhighlight lang="python">>>> word[:2] + word[2:]
'HelpA'
>>> word[:3] + word[3:]
'HelpA'</sourcesyntaxhighlight>
 
Вырождения индексов срезов обрабатываются элегантно: чересчур большой индекс заменяется на размер строки, а верхняя граница меньшая нижней возвращает пустую строку.
 
<sourcesyntaxhighlight lang="python">>>> word[1:100]
'elpA'
>>> word[10:]
''
>>> word[2:1]
''</sourcesyntaxhighlight>
 
Индексы могут быть отрицательными числами, обозначая при этом отсчет справа налево. Например:
 
<sourcesyntaxhighlight lang="python">>>> word[-1] # Последний символ
'A'
>>> word[-2] # Предпоследний символ
Строка 458:
'pA'
>>> word[:-2] # Всё, кроме последних двух символов
'Hel'</sourcesyntaxhighlight>
 
Но обратите внимание, что <tt>-0</tt> действительно эквивалентен <tt>0</tt> - это не отсчет справа.
 
<sourcesyntaxhighlight lang="python">>>> word[-0] # (поскольку -0 равен 0)
'H'</sourcesyntaxhighlight>
 
Отрицательные индексы вне диапазона обрезаются, но не советуем делать это с одно-элементными индексами (''не-срезами''):
 
<sourcesyntaxhighlight lang="python">>>> word[-100:]
'HelpA'
>>> word[-10] # ошибка
Traceback (most recent call last):
File "<stdin>", line 1, in ?
IndexError: string index out of range</sourcesyntaxhighlight>
 
Один из способов запомнить, как работают срезы — думать о них, как об указателях на места между символами, где левый край первого символа установлен в ноль, а правый край последнего символа строки из <code>n</code> символов имеет индекс <code>n</code>, например:
Строка 488:
Встроенная функция <code>len()</code> возвращает длину строки<ref>''(Прим. перев.)'': [[w:en:Supercalifragilisticexpialidocious|Supercalifragilisticexpialidocious]] — английское слово из одноименной песни, прозвучавшей в фильме [[w:en:Mary Poppins (film)|Мэри Поппинс]].</ref>:
 
<sourcesyntaxhighlight lang="python">>>> s = 'supercalifragilisticexpialidocious'
>>> len(s)
34</sourcesyntaxhighlight>
 
{{Смотрите также|
Строка 507:
Создание в Python строк в Unicode является действием настолько же простым, насколько простым является и создание обычных строк:
 
<sourcesyntaxhighlight lang="python">>>> u'Hello World !'
u'Hello World !'</sourcesyntaxhighlight>
 
Строчная буква "<code>u</code>" перед кавычкой указывает на необходимость создания Unicode-строки. Если вы хотите включить в строку специальные символы — вы можете сделать это используя ''кодирование Unicode-Экранированием'' Python (<tt>Python Unicode-Escape encoding</tt>). Следующий пример поясняет как:
 
<sourcesyntaxhighlight lang="python">>>> u'Hello\u0020World !'
u'Hello World !'</sourcesyntaxhighlight>
 
Экранированная последовательность <code>\u0020</code> указывает на позицию, куда требуется вставить символ Unicode с порядковым номером <tt>0x0020</tt> (символ пробела).
Строка 521:
Для экспертов присутствует также ''сырой'' режим — такой же, как и для обычных строк. Вам требуется поставить перед открывающей кавычкой префикс "<code>ur</code>", чтобы Python использовал ''кодирование Сырым-Unicode-Экранированием'' (<tt>Raw-Unicode-Escape encoding</tt>). Описанная выше конверсия <code>\uXXXX</code> будет применена только при условии наличия перед строчной "<code>u</code>" нечётного количества обратных слэшей.
 
<sourcesyntaxhighlight lang="python">>>> ur'Hello\u0020World !'
u'Hello World !'
>>> ur'Hello\\u0020World !'
u'Hello\\\\u0020World !'</sourcesyntaxhighlight>
 
''Сырой'' режим наиболее полезен, если вам необходимо ввести множество обратных слэшей — это может потребоваться в случае использования регулярных выражений.
Строка 532:
Встроенная функция <code>unicode()</code> предоставляет доступ ко всем зарегистрированным кодекам ('''код'''ировщикам и '''дек'''одировщикам) Unicode. Наиболее известными кодировками, которые могут использовать эти кодеки являются <tt>Latin-1</tt>, <tt>ASCII</tt>, <tt>UTF-8</tt> и <tt>UTF-16</tt>. Последние две — кодировки с ''различными длинами'' элементов — они могут хранить каждый символ Unicode в одном или более байтах<ref>''(Прим. перев.)'' <tt>[[w:UTF-16|UTF-16]]</tt> — либо в двух либо в четырёх байтах, <tt>[[w:UTF-8|UTF-8]]</tt> — от одного до четырёх байт</ref>. Кодировкой по умолчанию установлена <tt>ASCII</tt>, принимающая все символы в диапазоне от <tt>0</tt> до <tt>127</tt> и отвергающая любые другие символы сообщением об ошибке. В случае, если Unicode-строка выводится на печать, пишется в файл или конвертируется функцией <code>str()</code> — конвертирование производится с использованием кодировки по умолчанию.
 
<sourcesyntaxhighlight lang="python">>>> u"abc"
u'abc'
>>> str(u"abc")
Строка 541:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)</sourcesyntaxhighlight>
 
Для конвертирования Unicode-строки в строку с использованием желаемой кодировки, объекты Unicode предоставляют метод <code>encode()</code>, имеющей формат <code>encode([encoding,[,errors]]</code>. Encoding - необязательный аргумент, указывающий в какую кодировку стоит перевести строку. По умолчанию - ASCII. Errors - так же необязательный аргумент - указывает на способ обработки ошибок кодировщиком. По умолчанию используется 'strict' - если символ не может быть представлен в данной кодировке, генерируется исключение UnicodeError. Другие возможные значения - 'ignore' (отсутствующие символы удаляются) и 'replace' - (отсутствующие в кодировке символы заменяются, обычно на символ '?'). Для именования кодировок предпочитаются названия записанные в нижнем регистре.
 
<sourcesyntaxhighlight lang="python">>>> u"äöü".encode('utf-8')
'\xc3\xa4\xc3\xb6\xc3\xbc'</sourcesyntaxhighlight>
 
Если у вас есть в наличии данные в некоторой кодировке, а вы хотите создать на их основе соответствующую строку в Unicode — вы можете использовать функцию <code>unicode()</code>, передав название кодировки вторым аргументом.
 
<sourcesyntaxhighlight lang="python">>>> unicode('\xc3\xa4\xc3\xb6\xc3\xbc', 'utf-8')
u'\xe4\xf6\xfc'</sourcesyntaxhighlight>
 
==== Списки ====
Строка 557:
В языке Python доступно некоторое количество ''составных'' типов данных, использующихся для группировки прочих значений вместе. Наиболее гибкий из них — список (<tt>list</tt>); его можно выразить через разделённые запятыми значения (''элементы''), заключённые в квадратные скобки. Элементы списка могут быть разных типов.
 
<sourcesyntaxhighlight lang="python">>>> a = ['spam', 'eggs', 100, 1234]
>>> a
['spam', 'eggs', 100, 1234]</sourcesyntaxhighlight>
 
Подобно индексам в строках, индексы списков начинаются с нуля, списки могут быть срезаны, объединены (''конкатенированы'') и так далее:
 
<sourcesyntaxhighlight lang="python">>>> a[0]
'spam'
>>> a[3]
Строка 574:
['spam', 'eggs', 'bacon', 4]
>>> 3*a[:3] + ['Boo!']
['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boo!']</sourcesyntaxhighlight>
 
В отличие от строк, являющихся неизменяемыми, изменить индивидуальные элементы списка вполне возможно:
 
<sourcesyntaxhighlight lang="python">>>> a
['spam', 'eggs', 100, 1234]
>>> a[2] = a[2] + 23
>>> a
['spam', 'eggs', 123, 1234]</sourcesyntaxhighlight>
 
Присваивание срезу также возможно, и это действие может даже изменить размер списка или полностью его очистить:
 
<sourcesyntaxhighlight lang="python">>>> # Заменим некоторые элементы:
... a[0:2] = [1, 12]
>>> a
Строка 605:
>>> a[:] = []
>>> a
[]</sourcesyntaxhighlight>
 
Встроенная функция <code>len()</code> также применима к спискам:
 
<sourcesyntaxhighlight lang="python">>>> a = ['a', 'b', 'c', 'd']
>>> len(a)
4</sourcesyntaxhighlight>
 
Вы можете встраивать списки (создавать списки, содержащие другие списки), например так:
 
<sourcesyntaxhighlight lang="python">>>> q = [2, 3]
>>> p = [1, q, 4]
>>> len(p)
Строка 622:
[2, 3]
>>> p[1][0]
2</sourcesyntaxhighlight>
 
Вы можете добавить что-нибудь в конец списка.
 
<sourcesyntaxhighlight lang="python">>>> p[1].append('xtra') # Смотрите раздел Подробнее о списках
>>> p
[1, [2, 3, 'xtra'], 4]
>>> q
[2, 3, 'xtra']</sourcesyntaxhighlight>
 
Обратите внимание, что в последнем примере <code>p[1]</code> и <code>q</code> на самом деле ссылаются на один и тот же объект! Мы вернёмся к ''семантике объектов'' позже.
Строка 638:
Безусловно, Python можно использовать для более сложных задач, чем сложение двух чисел. Например, мы можем вывести начальную последовательность чисел Фибоначчи таким образом:
 
<sourcesyntaxhighlight lang="python">>>> # Ряд Фибоначчи:
... # сумма двух элементов определяет следущий элемент
... a, b = 0, 1
Строка 650:
3
5
8</sourcesyntaxhighlight>
 
Этот пример представляет нам некоторые новые возможности.
Строка 661:
 
* Оператор <code>print</code> выводит значения переданного(-ных) ему выражения(-ний). Это поведение отличается от обычного вывода выражения (как происходило выше в примерах с калькулятором) тем, каким способом обрабатываются ряды выражений и строки. Строки выводятся без кавычек и между элементами вставляются пробелы, благодаря чему форматирование вывода становится более удобным — как, например, здесь:
<sourcesyntaxhighlight lang="python">>>> i = 256*256
>>> print ('Значением i является', i)
Значением i является 65536</sourcesyntaxhighlight>
:Замыкающая строку запятая отменяет перевод строки после вывода:
<sourcesyntaxhighlight lang="python">>>> 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</sourcesyntaxhighlight>
:Обратите внимание на то, что интерпретатор вставляет новую строку перед тем как выводит следующее приглашение, если последняя строка не была завершена.
 
Строка 681:
Возможно наиболее широко известный тип выражения &#151; оператор <code>if</code>. Пример:
 
<sourcesyntaxhighlight lang="python">>>> x = int(raw_input("Введите, пожалуйста, целое число: "))
print(x)
>>> if x < 0:
Строка 693:
... print ('Больше')
...
Больше</sourcesyntaxhighlight>
 
Блоков <code>elif</code> может быть ноль или больше, а блок <code>else</code> не обязателен. Ключевое слово „<tt>elif</tt>“ — краткая запись „<tt>else if</tt>“ — позволяет избавиться от чрезмерных отступов. Последовательность <code>if</code> <tt>...</tt> <code>elif</code> <tt>...</tt> <code>elif</code> <tt>...</tt> — замена операторам <code>switch</code> или <code>case</code>, которые можно встретить в других языках.
Строка 701:
Оператор <code>for</code> в Python немного отличается от того, какой вы, возможно, использовали в C или Pascal. Вместо неизменного прохождения по арифметической прогрессии из чисел (как в Pascal) или предоставления пользователю возможности указать шаг итерации и условие останова (как в С), оператор <code>for</code> в Python проходит по всем элементам любой последовательности (списка или строки) в том порядке, в котором они в ней располагаются. Например (игра слов не подразумевалась):<ref>''(Прим. перев.)'' Defenestrate{{ref-en}} — выкидывать кого-либо из окна с целью покалечить. Другие слова — «кошка» и «окно».</ref>
 
<sourcesyntaxhighlight lang="python">>>> # Измерим несколько строк:
... a = ['cat', 'window', 'defenestrate']
>>> for x in a:
Строка 708:
cat 3
window 6
defenestrate 12</sourcesyntaxhighlight>
 
Изменять содержимое последовательности, по которой проходит цикл, небезопасно (это можно сделать только для изменяемых типов последовательностей, таких как списки).
Строка 714:
Нотация срезов делает это практически безболезненным:
 
<sourcesyntaxhighlight lang="python">>>> for x in a[:]: # создать срез-копию всего списка
... if len(x) > 6: a.insert(0, x)
...
>>> a
['defenestrate', 'cat', 'window', 'defenestrate']</sourcesyntaxhighlight>
 
=== Функция <code>range()</code> ===
Строка 724:
Если вам нужно перебрать последовательность чисел, встроенная функция <code>range()</code> придёт на помощь. Она генерирует списки, содержащие арифметические прогрессии:
 
<sourcesyntaxhighlight lang="python">>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]</sourcesyntaxhighlight>
 
Указанная точка завершения никогда не оказывается частью сгенерированного списка; вызов <code>range(10)</code> генерирует список из десяти значений — потенциальные индексы для элементов последовательности длиной 10. Позволено установить начало списка на другое число или указать другую величину инкремента (даже негативную; иногда её называют ''шагом'' (<tt>step</tt>)).
 
<sourcesyntaxhighlight lang="python">>>> range(5, 10)
[5, 6, 7, 8, 9]
>>> range(0, 10, 3)
[0, 3, 6, 9]
>>> range(-10, -100, -30)
[-10, -40, -70]</sourcesyntaxhighlight>
 
Чтобы пройти по всем индексам какой-либо последовательности, совместите вызовы <code>range()</code> и <code>len()</code> следующим образом:
 
<sourcesyntaxhighlight lang="python">>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
... print i, a[i]
Строка 746:
2 a
3 little
4 lamb</sourcesyntaxhighlight>
 
Однако в большинстве таких случаев удобно использовать функцию <code>enumerate()</code>.
Строка 759:
Операторы циклов могут иметь ветвь <code>else</code>; она исполняется, когда цикл прекращает сквозной анализ списка (в случае <code>for</code>) или когда условие становится ложным (в случае <code>while</code>), но не в тех случаях, когда цикл прерывается по <code>break</code>. Это поведение иллюстрируется следующим примером, в котором производится поиск простых чисел:
 
<sourcesyntaxhighlight lang="python">>>> for n in range(2, 10):
... for x in range(2, n):
... if n % x == 0:
Строка 775:
7 - простое число
8 равно 2 * 4
9 равно 3 * 3</sourcesyntaxhighlight>
 
=== Оператор <code>pass</code> ===
Строка 783:
Например:
 
<sourcesyntaxhighlight lang="python">>>> while True:
... pass # Ожидание прерывания c клавиатуры (Ctrl+C) в режиме занятости
...</sourcesyntaxhighlight>
 
Этот оператор часто используется для создания минималистичных классов, к примеру ''исключений'' (<tt>exceptions<tt>), или для игнорирования нежелательных исключений:
 
<big><sourcesyntaxhighlight lang="python">>>> class ParserError(Exception):
... pass
...
Строка 796:
... except ImportError:
... pass
...</sourcesyntaxhighlight></big>
 
Другой вариант: <code>pass</code> может применяться в качестве заглушки для тела функции или условия при создании нового кода, позволяя вам сохранить абстрактный взгляд на вещи.
С другой стороны, оператор <code>pass</code> игнорируется без каких-либо сигналов, и лучшим выбором было бы породить исключение <code>NotImplementedError</code>:
 
<big><sourcesyntaxhighlight lang="python">>>> def initlog(*args):
... raise NotImplementedError # Открыть файл для логгинга, если он ещё не открыт
... if not logfp:
... raise NotImplementedError # Настроить заглушку для логгинга
... raise NotImplementedError('Обработчик инициализации лога вызовов')
...</sourcesyntaxhighlight></big>
 
Если бы здесь использовались операторы <code>pass</code>, а позже вы бы запускали тесты, они могли бы упасть без указания причины.
Строка 817:
Мы можем создать функцию, которая выводит числа Фибоначчи до некоторого предела:
 
<big><sourcesyntaxhighlight lang="python">>>> def fib(n): # вывести числа Фибоначчи меньшие (вплоть до) n
... """Выводит ряд Фибоначчи, ограниченный n."""
... a, b = 0, 1
Строка 826:
>>> # Теперь вызовем определенную нами функцию:
... fib(2000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597</sourcesyntaxhighlight></big>
 
Зарезервированное слово <code>def</code> предваряет ''определение'' функции. За ним должны следовать имя функции и заключённый в скобки список формальных параметров. Выражения, формирующие тело функции, начинаются со следующей строки и должны иметь отступ.
Строка 838:
При определении функции её имя также помещается в текущую таблицу символов. Тип значения, связанного с именем функции, распознается интерпретатором как функция, определённая пользователем (<tt>user-defined function</tt>). Само значение может быть присвоено другому имени, которое затем может также использоваться в качестве функции. Эта система работает в виде основного механизма переименования:
 
<sourcesyntaxhighlight lang="python">>>> fib
<function fib at 10042ed0>
>>> f = fib
>>> f(100)
1 1 2 3 5 8 13 21 34 55 89</sourcesyntaxhighlight>
 
Если вы использовали в работе другие языки программирования, вы можете возразить, что <code>fib</code> — это не функция, а процедура, поскольку не возвращает никакого значения. На самом деле, даже функции без ключевого слова <code>return</code> возвращают значение, хотя и более скучное. Такое значение именуется <code>None</code> (это встроенное имя). Описание значения <code>None</code> обычно придерживается за интерпретатором, если оно оказывается единственным значением, которое нужно вывести. Вы можете проследить за этим процессом, если действительно хотите, используя оператор <code>print</code>:
 
<sourcesyntaxhighlight lang="python">>>> fib(0)
>>> print fib(0)
None</sourcesyntaxhighlight>
 
Довольно легко написать функцию, которая возвращает список чисел из ряда Фибоначчи, вместо того, чтобы выводить их:
 
<sourcesyntaxhighlight lang="python">>>> def fib2(n): # вернуть числа Фибоначчи меньшие (вплоть до) n
... """Возвращает список чисел ряда Фибоначчи, ограниченный n."""
... result = []
Строка 863:
>>> f100 = fib2(100) # вызываем
>>> f100 # выводим результат
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]</sourcesyntaxhighlight>
 
Этот пример, как уже привычно, демонстрирует некоторые новые возможности Python:
Строка 889:
(''Refusenik''{{ref-en}} — [[w:ru:Отказник|Отказник]]). Ниже: «...<code>спросить_подтверждения('Вы действительно хотите выйти?')</code> или так: <code>спросить_подтверждения('Согласны ли вы перезаписать файл?', 2)</code>...»</ref>:
 
<sourcesyntaxhighlight lang="python">def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
while True:
ok = raw_input(prompt)
Строка 896:
retries = retries - 1
if retries < 0: raise IOError, 'refusenik user'
print complaint</sourcesyntaxhighlight>
 
Эта функция может быть вызвана, например, так: <code>ask_ok('Do you really want to quit?')</code> или так: <code>ask_ok('OK to overwrite the file?', 2)</code>.
Строка 904:
Значения по умолчанию вычисляются в точке определения функции — в ''определяющей'' области, поэтому код
 
<sourcesyntaxhighlight lang="python">i = 5
 
def f(arg=i):
Строка 910:
 
i = 6
f()</sourcesyntaxhighlight>
 
выведет 5.
Строка 916:
'''Важное предупреждение:''' Значение по умолчанию вычисляется лишь единожды. Это имеет вес, когда значением по умолчанию является изменяемый объект, такой как список, словарь (<tt>dictionary</tt>) или экземляры большинства классов. Например, следующая функция накапливает переданные ей аргументы с последовательными вызовами:
 
<sourcesyntaxhighlight lang="python">def f(a, L=[]):
L.append(a)
return L
Строка 922:
print f(1)
print f(2)
print f(3)</sourcesyntaxhighlight>
 
Она выведет
 
<sourcesyntaxhighlight lang="python">[1]
[1, 2]
[1, 2, 3]</sourcesyntaxhighlight>
 
==== Именованные аргументы <ref>''(Прим. перев.)'' В оригинале — Keyword Arguments — аргументы по ключевым словам, ключевые аргументы (далее используется слово ''keywords'' для набора имён параметров непостоянного количества. ''Ключевые'' - возможно, корректнее, но как мне показалось — менее понятно ([http://www.infocity.kiev.ua/prog/python/content/sempit_14.phtml альтернативный перевод]))</ref> ====
Строка 941:
(''Из [http://www.ibras.dk/montypython/episode08.htm#6 скетча Монти Пайтона]'')</ref>:
 
<sourcesyntaxhighlight lang="python">def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
print "-- This parrot wouldn't", action,
print "if you put", voltage, "volts through it."
print "-- Lovely plumage, the", type
print "-- It's", state, "!"</sourcesyntaxhighlight>
 
могла бы быть вызвана любым из следующих способов<ref>''(Прим. перев.):''
Строка 953:
попугай('миллион', 'лишённый жизни', 'прыжок')</code><br/><br/></ref>:
 
<sourcesyntaxhighlight lang="python">parrot(1000)
parrot(action = 'VOOOOOM', voltage = 1000000)
parrot('a thousand', state = 'pushing up the daisies')
parrot('a million', 'bereft of life', 'jump')</sourcesyntaxhighlight>
 
а эти случаи оказались бы неверными<ref>''(Прим. перев.):''
Строка 964:
попугай(исполнитель='Джон Клиз')</code><br/><br/></ref>:
 
<sourcesyntaxhighlight lang="python">parrot() # пропущен требуемый аргумент
parrot(voltage=5.0, 'dead') # неименованный аргумент следом за именованным
parrot(110, voltage=220) # повторное значение аргумента
parrot(actor='John Cena') # неизвестное имя аргумента</sourcesyntaxhighlight>
 
В общем случае, список аргументов должен содержать любое количество позиционных (<tt>positional</tt>) аргументов, за которыми должно следовать любое количество именованных аргументов, и при этом имена аргументов выбираются из формальных параметров. Неважно, имеет формальный параметр значение по умолчанию или нет. Ни один из аргументов не может получать значение более чем один раз — имена формальных параметров, совпадающие с именами позиционных аргументов, не могут использоваться в качестве именующих в одном и том же вызове<ref>''(Прим. перев.)'' В главе о функциях автор отталкивается не от привычного по другим учебникам первоначального полного описания определения функций, а уже потом — описания их вызова, а объединяет обе темы вместе (как минимум в случае с непостоянным списком аргументов это возможно непривычно, но оправдано), отдавая приоритет описанию вызова. Учебник рассчитан на тех, кто уже программирует на каком-либо языке программирования и потенциально не должен смутить читателя.</ref>. Вот пример, завершающийся неудачей по причине описанного ограничения:
 
<sourcesyntaxhighlight lang="python">>>> def function(a):
... pass
...
Строка 977:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: function() got multiple values for keyword argument 'a'</sourcesyntaxhighlight>
 
Если в определении функции присутствует завершающий параметр в виде ''**имя'' — он принимает словарь (подробнее в разделе [[Справочник по библиотеке Python 2.6#Маппинг типов|Справочника — Маппинг типов — словари]]), содержащий все именованные аргументы, исключая те, которые соответствуют формальным параметрам. Можно совместить эту особенность с поддержкой формального параметра в формате ''*имя'' (описывается в следующем подразделе), который получает кортеж (<tt>tuple</tt>), содержащий все позиционные аргументы, следующие за списком формальных параметров. (параметр в формате ''*имя'' должен описываться перед параметром в формате ''**имя''.) Например, если мы определим такую функцию<ref>''(Прим. перев.):''
Строка 991:
(''Из [http://www.ibras.dk/montypython/episode33.htm#7 скетча Монти Пайтона]'')</ref>:
 
<sourcesyntaxhighlight lang="python">def cheeseshop(kind, *arguments, **keywords):
print "-- Do you have any", kind, "?"
print "-- I'm sorry, we're all out of", kind
Строка 998:
keys = keywords.keys()
keys.sort()
for kw in keys: print kw, ":", keywords[kw]</sourcesyntaxhighlight>
 
то её можно будет вызвать так<ref>''(Прим. перев.):''
Строка 1008:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;скетч="Скетч о сырной лавке")<br/></br></ref>:
 
<sourcesyntaxhighlight lang="python">cheeseshop("Limburger", "It's very runny, sir.",
"It's really very, VERY runny, sir.",
shopkeeper="Michael Palin",
client="John Cleese",
sketch="Cheese Shop Sketch")</sourcesyntaxhighlight>
 
и она, конечно же, выведет<ref>''(Прим. перев.):''
Строка 1040:
Наконец, наиболее редко используется возможность указания того, что функция может быть вызвана с произвольным числом аргументов. При этом сами аргументы будут обёрнуты в кортеж (см. раздел [[#Кортежи и последовательности|Кортежи и последовательности]]). Переменное количество аргументов могут предварять ноль или более обычных аргументов.
 
<sourcesyntaxhighlight lang="python">def write_multiple_items(file, separator, *args):
file.write(separator.join(args))</sourcesyntaxhighlight>
 
==== Распаковка списков аргументов ====
Строка 1047:
Обратная ситуация возникает когда аргументы уже содержатся в списке или в кортеже, но должны быть распакованы для вызова функции, требующей отдельных позиционных аргументов. Например, встроенная функция <code>range()</code> ожидает отдельных аргументов ''start'' и ''stop'' соответственно. Если они не доступны раздельно, для распаковки аргументов из списка или кортежа в вызове функции используйте *-оператор:
 
<sourcesyntaxhighlight lang="python">>>> range(3, 6) # обычный вызов с отдельными аргументами
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args) # вызов с распакованными из списка аргументами
[3, 4, 5]</sourcesyntaxhighlight>
 
Схожим способом, словари могут получать именованные аргументы через **-оператор<ref>''(Прим. перев.):''
Строка 1065:
(''Из [http://www.ibras.dk/montypython/episode08.htm#6 скетча Монти Пайтона]'')</ref>:
 
<sourcesyntaxhighlight lang="python">>>> def parrot(voltage, state='a stiff', action='voom'):
... print "-- This parrot wouldn't", action,
... print "if you put", voltage, "volts through it.",
Строка 1072:
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. It's bleedin' demised !</sourcesyntaxhighlight>
 
==== Модель <tt>lambda</tt> ====
Строка 1078:
По частым просьбам, в Python были добавлены несколько возможностей, которые были привычны для функциональных языков программирования, таких как Lisp. Используя зарезервированное слово <code>lambda</code> вы можете создать небольшую анонимную функцию. Здесь представлена функция, которая возвращает сумму двух её аргументов: <code>lambda a, b: a+b</code>. Формы <code>lambda</code> могут быть использованы в любом месте где требуется объект функции. При этом они синтаксически ограничены на одно выражение. Семантически, они лишь синтаксический сахар для обычного определения функции. Как и определения вложенных функций, <code>lambda</code>-формы могут ссылаться на переменные из содержащей их области видимости:
 
<sourcesyntaxhighlight lang="python">>>> def make_incrementor(n):
... return lambda x: x + n
...
Строка 1085:
42
>>> f(1)
43</sourcesyntaxhighlight>
 
==== Строки документации ====
Строка 1101:
Вот пример многострочной документации (''док-строки''):
 
<sourcesyntaxhighlight lang="python">>>> def my_function():
... """Не делаем ничего, но документируем.
...
Строка 1111:
Не делаем ничего, но документируем.
 
Нет, правда, эта функция ничего не делает.</sourcesyntaxhighlight>
 
=== Интермеццо: Стиль написания кода ===
Строка 1127:
* Используйте строки документации (''док-строки'')
* Применяйте пробелы вокруг операторов и после запятых, но не добавляйте их в конструкции со скобками:
<code><sourcesyntaxhighlight lang="python">spam(ham[1], {eggs: 2}, 3, 4) #правильно
spam( ham[ 1 ], { eggs: 2 }, 3 , 4 ) #неправильно</sourcesyntaxhighlight></code>
* Называйте ваши классы и функции единообразно; соглашение следующее: используйте <code>CamelCase</code><ref>''(Прим. перев.)'' <tt>CamelCase</tt> (''ВерблюжийСтиль'') — стиль именования идентификаторов, при котором все слова, записанные строчными буквами, объединяются в одно и первая буква каждого слова выделяется заглавной буквой — такая запись напоминает верблюжьи горбы, в связи с чем и названа.</ref> для именования классов и <code>нижний_регистр_с_подчёркиваниями</tt><ref>''(Прим. перев.)'' Пусть данный пример по вине переводчика и использует русские буквы, соглашение корректно настаивает на использовании латиницы для именования идентификаторов, см. следующий пункт соглашения</ref> для функций и методов. (обращайтесь к разделу [[#Первый взгляд на классы|Первый взгляд на классы]] за дополнительной информации о классах и методах)
* Не используйте в вашем коде изощрённых кодировок<ref>''(Прим. перев.)'' В строковых литералах (не комментариях) это, конечно же, позволено</ref>, если он рассчитан на использование в интернациональной среде. Стандартный набор ASCII всегда работает на ура<ref>''(Прим. перев.)'' Не кодировка, а именно набор символов — латиница, пунктуация и несколько служебных символов. Кодировка по умолчанию для файлов с исходными кодами, начиная с Python 3.0, всегда UTF-8 — дабы существовала возможность использовать национальные символы в строковых литералах и, в редких случаях — комментариях.</ref>.
Строка 1160:
Пример, использующий большинство методов списка:
 
<sourcesyntaxhighlight lang="python">>>> a = [66.25, 333, 333, 1, 1234.5]
>>> print a.count(333), a.count(66.25), a.count('x')
2 1 0
Строка 1177:
>>> a.sort()
>>> a
[-1, 1, 66.25, 333, 333, 1234.5]</sourcesyntaxhighlight>
 
==== Использование списка в качестве стека ====
Строка 1183:
Методы списков позволяют легко использовать список в качестве стека, где последний добавленный элемент становится первым полученным („последним пришел — первым вышел“). Чтобы добавить элемент на вершину стека, используйте метод <code>append()</code>. Чтобы получить элемент с вершины стека, используйте метод <code>pop()</code>, без указания явного индекса. Например:
 
<sourcesyntaxhighlight lang="python">>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
Строка 1197:
5
>>> stack
[3, 4]</sourcesyntaxhighlight>
 
==== Использование списка в качестве очереди ====
Строка 1203:
Вы можете без труда использовать список также и в качестве очереди, где первый добавленный элемент оказывается первым полученным („первый пришёл — первый вышел“). Чтобы добавить элемент в конец очереди, используйте метод <code>append()</code>. Чтобы получить элемент из начала очереди, используйте метод <code>pop()</code> с нулём в качестве индекса. Например:
 
<sourcesyntaxhighlight lang="python">>>> queue = ["Eric", "John", "Michael"]
>>> queue.append("Terry") # Прибыл Terry
>>> queue.append("Graham") # Прибыл Graham
Строка 1211:
'John'
>>> queue
['Michael', 'Terry', 'Graham']</sourcesyntaxhighlight>
 
==== Инструменты функционального программирования ====
Строка 1219:
<code>filter(''функция'', ''последовательность'')</code> возвращает последовательность, состоящую из тех элементов ''последовательности'', для которых ''функция''(''элемент'') является истиной. Если последовательность — строка (<tt>string</tt>) или кортеж (<tt>tuple</tt>), результат будет иметь тот же тип; в других случаях — это всегда список. Например, чтобы найти несколько простых чисел:
 
<sourcesyntaxhighlight lang="python">>>> def f(x): return x % 2 != 0 and x % 3 != 0 # вернуть истину, если x не делится ни на 2 ни на 3
...
>>> filter(f, range(2, 25)) # отфильтровать диапазон чисел от 2 до 24 через функцию f
[5, 7, 11, 13, 17, 19, 23]</sourcesyntaxhighlight>
 
----
<code>map(''функция'', ''последовательность'')</code> совершает вызов ''функция''(''элемент'') с каждым элементом ''последовательности'' и возвращает список из возвращавшихся функцией значений. Например, чтобы вычислить кубы нескольких чисел:
 
<sourcesyntaxhighlight lang="python">>>> def cube(x): return x*x*x # вернуть куб аргумента
...
>>> map(cube, range(1, 11)) # спроецировать функцию cube на диапазон от 1 до 10
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]</sourcesyntaxhighlight>
 
Можно передать более чем одну последовательность; тогда функция должна иметь столько аргументов, сколько передано последовательностей и вызывается для каждого соответствующего элемента каждой последовательности (или <code>None</code>, если одна из последовательностей короче другой). Например:
 
<sourcesyntaxhighlight lang="python">>>> seq = range(8) # seq - числа от 0 до 7
>>> def add(x, y): return x+y # функция add складывает свои аргументы
...
>>> map(add, seq, seq) # пропустить функцию add через две последовательности seq параллельно
[0, 2, 4, 6, 8, 10, 12, 14]</sourcesyntaxhighlight>
 
----
<code>reduce(''функция'', ''последовательность'')</code> возвращает единственное значение, собранное из результатов вызовов двухаргументной ''функции'' с первыми двумя элементами последовательности, затем с полученным результатом и последующим элементом, и так далее. Например, чтобы сосчитать сумму чисел от 1 до 10:
 
<sourcesyntaxhighlight lang="python">>>> def add(x,y): return x+y # функция add складывает оба аргумента
...
>>> reduce(add, range(1, 11)) # пройти функцией add последовательно аккумулятивно по числам из диапазона от 1 до 10.
55</sourcesyntaxhighlight>
 
Если в последовательности только один элемент — возвращается его значение; если последовательность пуста — порождается исключение.
Строка 1252:
Можно передать третий аргумент, чтобы обозначить исходное значение. В этом случае исходное значение возвращается для пустой последовательности, функция первоначально применяется к исходному значению и первому элементу последовательности, затем к результату и следующему элементу, и так далее. Пример:
 
<sourcesyntaxhighlight lang="python">>>> def sum(seq): # определить функцию sum, принимающую последовательность
... def add(x,y): return x+y # определить внутреннюю функцию add, возвращающую сумму переданных параметров
... return reduce(add, seq, 0) # вернуть результат аккумулятивного прохождения функцией add по переданной
Строка 1260:
55
>>> sum([]) # сумма пустой последовательности
0</sourcesyntaxhighlight>
 
Не используйте определение функции <code>sum()</code> из этого примера: поскольку суммирование чисел — обычная необходимость, уже доступна встроенная функция <code>sum(''последовательность'')</code>, которая работает точно таким же образом.
Строка 1268:
Метод списковой сборки обеспечивает легкий способ создать список без обращений к <code>map()</code>, <code>filter()</code> и/или <code>lambda</code>. Определение списка, получающееся в результате, имеет тенденцию читаться проще чем списки, построенные с использованием таких конструкций. Каждая списковая сборка состоит из выражения, за которым следует оператор <code>for</code>, а затем ноль или более операторов <code>for</code> или <code>if</code>. Если в результате вычисления выражения получается кортеж, его нужно обернуть в скобки.
 
<sourcesyntaxhighlight lang="python">>>> freshfruit = [' banana', ' loganberry ', 'passion fruit ']
>>> [weapon.strip() for weapon in freshfruit] # взять каждый элемент списка freshfruit, и временно обозначив его как weapon
... # (создав алиас), обрезать у weapon пробелы
Строка 1297:
>>> [vec1[i]*vec2[i] for i in range(len(vec1))] # умножить i-ый элемент списка vec1 на i-ый элемент списка vec2
... # для всех i от нуля до длины массива vec1 минус единица включительно
[8, 12, -54]</sourcesyntaxhighlight>
 
Списковые сборки являются более гибкими чем функция <code>map()</code> и могут применяться к сложным выражениям и вложенным функциям<ref>''(Прим. перев.)'' в Python, как и в большинстве других языков программирования, используется европейский стандарт разделения целой и дробной части десятичных дробей точкой.</ref>:
 
<sourcesyntaxhighlight lang="python">>>> [str(round(355/113.0, i)) for i in range(1,6)] # для всех i от 1 до 5 вернуть результат деления
... # 335 на 113, округлённый до i знаков за запятой
['3.1', '3.14', '3.142', '3.1416', '3.14159']</sourcesyntaxhighlight>
 
==== Вложенные списковые сборки ====
Строка 1311:
Представьте нижеследующий пример матрицы 3x3 в виде списка, содержащего три других списка, по одному в ряд:
 
<sourcesyntaxhighlight lang="python">>>> mat = [
... [1, 2, 3],
... [4, 5, 6],
... [7, 8, 9],
... ]</sourcesyntaxhighlight>
 
Теперь, если вам нужно подменить строки столбцами, вы можете использовать списковую сборку:
 
<sourcesyntaxhighlight lang="python">>>> print [[row[i] for row in mat] for i in [0, 1, 2]]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]</sourcesyntaxhighlight>
 
При создании вложенных списковых сборках нужно помнить о важной вещи:
Строка 1328:
Чуть более многословная, но наглядная, версия этого примера позволяет взглянуть на процесс более детально:
 
<sourcesyntaxhighlight lang="python">for i in [0, 1, 2]:
for row in mat:
print row[i],
print</sourcesyntaxhighlight>
 
В реальных случаях лучше предпочесть встроенные функции, чем сложные выражения. В нашем случае поможет функция <code>zip()</code>:
 
<sourcesyntaxhighlight lang="python">>>> zip(*mat)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]</sourcesyntaxhighlight>
 
В разделе [[#Распаковка списков аргументов|Распаковка списков аргументов]] описано предназначение звёздочки в этих строках.
Строка 1344:
Существует способ удалить элемент, указывая его индекс, а не его значение: оператор <code>del</code>. В отличие от метода <code>pop()</code>, он не возвращает значения. Оператор <code>del</del> может также использоваться для удаления срезов из списка или полной очистки списка (что мы делали ранее через присваивание пустого списка срезу). Например:
 
<sourcesyntaxhighlight lang="python">>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> del a[0]
>>> a
Строка 1353:
>>> del a[:]
>>> a
[]</sourcesyntaxhighlight>
 
<code>del</code> может быть также использован для удаления переменных полностью:
 
<sourcesyntaxhighlight lang="python">>>> del a</sourcesyntaxhighlight>
 
Ссылка на имя <code>a</code> в дальнейшем вызовет ошибку (по крайней мере до тех пор, пока с ним не будет связано другое значение). Позже мы с вами узнаем другие способы использования <code>del</code>.
Строка 1367:
Кортеж состоит из некоторого числа значений разделённых запятыми, например:
 
<sourcesyntaxhighlight lang="python">>>> t = 12345, 54321, 'hello!'
>>> t[0]
12345
Строка 1375:
... u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))</sourcesyntaxhighlight>
 
Как видите, кортежи на выводе всегда заключены в скобки, таким образом вложенные кортежи интрепретируются корректно; они могут быть введены и с обрамляющими скобками и без, тем не менее в любом случае скобки чаще всего необходимы (если кортеж — часть более крупного выражения).
Строка 1383:
Определённая проблема состоит в конструировании кортежей, состоящих из нуля или одного элемента: в синтаксисе языка есть дополнительные хитрости, позволяющие достигнуть этого. Пустые кортежи формируются за счёт пустой пары скобок; кортеж с одним элементом конструируется за счёт запятой, следующей за числом (единственное значение не обязательно заключать в скобки). Необычно, но эффективно. Например:
 
<sourcesyntaxhighlight lang="python">>>> empty = ()
>>> singleton = 'hello', # <-- обратите внимание на замыкающую запятую
>>> len(empty)
Строка 1390:
1
>>> singleton
('hello',)</sourcesyntaxhighlight>
 
Выражение <code>t = 12345, 54321, 'hello!'</code> является примером ''упаковки кортежей'' (<tt>tuple packing</tt>): значения <code>12345</code>, <code>54321</code> и <code>'hello!'</code> упаковываются в кортеж вместе. Обратная операция также возможна:
 
<sourcesyntaxhighlight lang="python">>>> x, y, z = t</sourcesyntaxhighlight>
 
Такое действие называется, довольно удачно, ''распаковкой последовательности'' (<tt>sequence unpacking</tt>). Для распаковки на левой стороне требуется список переменных с количеством элементов равным длине последовательности. Обратите внимание, что множественное присваивание на самом деле является лишь комбинацией упаковки кортежа и распаковки последовательности.
Строка 1415:
Ложь</code><br/><br/></ref>:
 
<sourcesyntaxhighlight lang="python">>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> fruit = set(basket) # создать множество
>>> fruit
Строка 1422:
True
>>> 'crabgrass' in fruit
False</sourcesyntaxhighlight>
 
<sourcesyntaxhighlight lang="python">>>> # Демонстрация операций с множеством на буквах из двух слов
...
>>> a = set('abracadabra')
Строка 1437:
set(['a', 'c'])
>>> a ^ b # буквы в a или в b, но не в обоих
set(['r', 'd', 'b', 'm', 'z', 'l'])</sourcesyntaxhighlight>
 
=== Словари ===
Строка 1451:
Вот небольшой пример использования словарей:
 
<sourcesyntaxhighlight lang="python">>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
Строка 1464:
['guido', 'irv', 'jack']
>>> 'guido' in tel
True</sourcesyntaxhighlight>
 
Конструктор <code>dict()</code> строит словарь непосредственно на основе пар ключ-значение, где каждая пара представлена в виде кортежа. Когда пары могут быть сформированы шаблоном, ''списковые сборки'' помогут описать список пар ключ-значение более компактно.
 
<sourcesyntaxhighlight lang="python">>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}
>>> dict([(x, x**2) for x in (2, 4, 6)]) # использование списковой сборки
{2: 4, 4: 16, 6: 36}</sourcesyntaxhighlight>
 
Позже в учебнике мы изучим выражения-генераторы (<tt>Generator Expressions</tt>), которые даже лучше подходят для снабжения конструктора <code>dict()</code> парами ключ-значение.
Строка 1477:
Если ключи являются простыми строками, иногда легче описать пары используя именованные аргументы:
 
<sourcesyntaxhighlight lang="python">>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}</sourcesyntaxhighlight>
 
=== Техника прохода циклом ===
Строка 1484:
При прохождении словарей циклом, ключ и соответствующее ему значение могут быть получены параллельно посредством метода <code>iteritems()</code>.
 
<sourcesyntaxhighlight lang="python">>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.iteritems():
... print k, v
...
gallahad the pure
robin the brave</sourcesyntaxhighlight>
 
При прохождении циклом последовательностей, индекс позиции и соответствующее ему значение могут быть получены одновременно посредством функции <code>enumerate()</code>.
<sourcesyntaxhighlight lang="python">>>> for i, v in enumerate(['tic', 'tac', 'toe']):
... print i, v
...
0 tic
1 tac
2 toe</sourcesyntaxhighlight>
 
Для того, чтобы пройти циклом две или более последовательности параллельно, вхождения можно сгруппировать функцией <code>zip()</code><ref>''(Прим. перев.):''
Строка 1511:
Каков(о) ваш(е) любимый цвет? синий.</code></ref>.
 
<sourcesyntaxhighlight lang="python">>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
Строка 1518:
What is your name? It is lancelot.
What is your quest? It is the holy grail.
What is your favorite color? It is blue.</sourcesyntaxhighlight>
 
Чтобы пройти циклом последовательность в обратном порядке, сначала укажите последовательность в прямом направлении, а затем вызовите функцию <code>reversed()</code>.
 
<sourcesyntaxhighlight lang="python">>>> for i in reversed(range(1,10,2)):
... print i
...
Строка 1529:
5
3
1</sourcesyntaxhighlight>
 
Чтобы пройти циклом последовательность в отсортированном порядке, используйте функцию <code>sorted()</code>, которая возвращает отсортированный список, оставляя исходный без изменений.
 
<sourcesyntaxhighlight lang="python">>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for f in sorted(set(basket)):
... print f
Строка 1540:
banana
orange
pear</sourcesyntaxhighlight>
 
=== Подробнее об условиях ===
Строка 1556:
Можно присвоить результат сравнения, или другого булева выражения, переменной. Например,
 
<sourcesyntaxhighlight lang="python">>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'
>>> non_null = string1 or string2 or string3
>>> non_null
'Trondheim'</sourcesyntaxhighlight>
 
Заметьте, что в Python, в отличие от C, присваивание не может использоваться внутри выражений. Программисты на C могут возмутиться по этому поводу, но на самом деле это позволяет избежать класса проблем, обычного для программ на C: ввода <code>=</code> в выражении, вместо предполагавшегося <code>==</code>.
Строка 1567:
Объекты последовательностей можно сравнивать с другими объектами с тем же типом последовательности. Сравнение использует лексикографический порядок: сравниваются первые два элемента, и если они различны — результат сравнения определён; если они равны, сравниваются следующие два элемента и так далее до тех пор, пока одна из последовательностей не будет истощена. Если сравниваемые два элемента сами являются последовательностями одного типа, лексикографическое сравнение входит в них рекурсивно. Если все элементы обеих последовательностей оказались равны, последовательности считаются равными. Если одна последовательность оказывается стартовой последовательностью другой, более короткая последовательность считается меньшей. Лексикографическое упорядочивание строк использует порядок в таблице ASCII для индивидуальных символов. Несколько примеров сравнений между однотипными последовательностями:
 
<sourcesyntaxhighlight lang="python">(1, 2, 3) < (1, 2, 4)
[1, 2, 3] < [1, 2, 4]
'ABC' < 'C' < 'Pascal' < 'Python'
Строка 1573:
(1, 2) < (1, 2, -1)
(1, 2, 3) == (1.0, 2.0, 3.0)
(1, 2, ('aa', 'ab')) < (1, 2, ('abc', 'a'), 4)</sourcesyntaxhighlight>
 
Обратите внимание, что разрешено сравнение объектов разных типов. Итог обусловлен, но кажется произвольным: типы сортируются по их имени. Таким образом, список (<tt>list</tt>) всегда меньше строки (<tt>string</tt>), строка всегда меньше кортежа (<tt>tuple</tt>) и т.д.<ref>Не стоит полагаться на правила сравнения разных типов — в последующих версиях языка они могут быть изменены.</ref> Смешанные числовые типы сравниваются в соответствии с их численными значениями, так что <code>0</code> равен <code>0.0</code> и т.д.
Строка 1585:
Модуль — это файл, содержащий определения и выражения на Python. Именем файла является имя модуля с добавленным суффиксом <tt>.py</tt>. Внутри модуля его имя (в качестве строки) доступно в виде значения глобальной переменной с именем <code>__name__</code>. Например, используя ваш любимый текстовый редактор создайте в текущем каталоге файл с именем <tt>fibo.py</tt> со следующим содержимым (не забывайте, что первой или второй строкой файла должна быть строка с указанием кодировки):
 
<sourcesyntaxhighlight lang="python">
# -*- coding: iso-8859-15 -*-
# модуль вычисления чисел Фибоначчи
Строка 1602:
result.append(b)
a, b = b, a+b
return result</sourcesyntaxhighlight>
 
Теперь войдите в интерпретатор Python и импортируйте этот модуль следующей командой:
 
<sourcesyntaxhighlight lang="python">>>> import fibo</sourcesyntaxhighlight>
 
Это действие не переводит имена определённых функций в текущую таблицу символов; здесь вводится лишь имя модуля <code>fibo</code>. Используя имя модуля вы можете получить доступ к функциям:
 
<sourcesyntaxhighlight lang="python">>>> fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'</sourcesyntaxhighlight>
 
Если вы собираетесь использовать функцию часто, вы можете присвоить её локальному имени:
 
<sourcesyntaxhighlight lang="python">>>> fib = fibo.fib
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377</sourcesyntaxhighlight>
 
=== Подробнее о модулях ===
Строка 1633:
Есть вариация оператора <code>import</code>, которая переносит имена из модуля прямо в таблицу символов импортирующего модуля. Например:
 
<sourcesyntaxhighlight lang="python">>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377</sourcesyntaxhighlight>
 
При этом имя самого модуля, из которого переносятся имена элементов, не добавляется в ''локальную таблицу символов'' (так, в этом примере, имя <code>fibo</code> не определено)
Строка 1641:
И есть даже способ импортировать все имена, которые определяет данный модуль:
 
<sourcesyntaxhighlight lang="python">>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377</sourcesyntaxhighlight>
 
Импортируются все имена, кроме тех, которые начинаются на подчёркивание (<code>_</code>).
Строка 1653:
Когда вы запускаете модуль Python в виде
 
<sourcesyntaxhighlight lang="python">python fibo.py <аргументы></sourcesyntaxhighlight>
 
то код в этом модуле будет исполнен в момент его импортирования, но значение <code>__name__</code> будет установлено как <code>"__main__"</code>. Это значит, что добавляя этот код в конец сценария:
 
<sourcesyntaxhighlight lang="python">if __name__ == "__main__":
import sys
fib(int(sys.argv[1]))</sourcesyntaxhighlight>
 
вы можете сделать возможным запуск файла и в качестве сценария и в качестве импортируемого модуля, поскольку код, который разбирает командную строку выполняется только в том случае, когда модуль исполняется как ''основной'' (<tt>main</tt>) файл:
 
<sourcesyntaxhighlight lang="python">$ python fibo.py 50
1 1 2 3 5 8 13 21 34</sourcesyntaxhighlight>
 
Если модуль импортируется, код не будет выполнен:
 
<sourcesyntaxhighlight lang="python">>>> import fibo
>>></sourcesyntaxhighlight>
 
Такой приём часто используется, чтобы предоставить удобный пользовательский интерфейс к модулю или для тестирования (выполнение модуля в качестве сценария запускает набор тестов).
Строка 1703:
Python поставляется с библиотекой стандартных модулей, описанной в отдельном документе, [[Справочник по библиотеке Python 2.6|Справочнике по библиотеке Python]] (далее — «Справочнику по библиотеке»). Некоторые модули встроены в интерпретатор; они обеспечивают доступ к операциям, не являющимся ядром языка, но несмотря на это, они встроены для большей эффективности и предоставления доступа к примитивам операционной системы, таким как ''системные вызовы'' (<tt>system calls</tt>). Набор таких модулей — выбор настройки, который также зависит от используемой платформы. Например, модуль <code>winreg</code> предоставляется только на тех системах, на которые установлен Windows. Один конкретный модуль заслуживает большего внимания: модуль <tt>[[Справочник по библиотеке Python 2.6#sys|sys]]</tt>, встроенный в каждую версию интерпретатора Python. Переменные </code>sys.ps1</code> и <code>sys.ps2</code> определяют строки, использующиеся в качестве основного и вспомогательного приглашений:
 
<sourcesyntaxhighlight lang="python">>>> import sys
>>> sys.ps1
'>>> '
Строка 1711:
C> print 'Yuck!'
Yuck!
C></sourcesyntaxhighlight>
 
Эти две переменные определены только если интерпретатор находится в интерактивном режиме.
Строка 1717:
Переменная <code>sys.path</code> представляет собой список строк, определяющий путь поиска модулей интерпретатора. Она инициируется путём по умолчанию, взятым из переменной окружения <tt>PYTHONPATH</tt>, или встроенным значением по умолчанию, если <tt>PYTHONPATH</tt> не установлен. Вы можете изменить её значение, используя стандартные операции со списками:
 
<sourcesyntaxhighlight lang="python">>>> import sys
>>> sys.path.append('/ufs/guido/lib/python')</sourcesyntaxhighlight>
 
=== Функция <code>dir()</code> ===
Строка 1724:
Встроенная функция <code>dir()</code> используется для получения имён, определённых в модуле. Она возвращает отсортированный список строк:
 
<sourcesyntaxhighlight lang="python">>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
Строка 1737:
'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setdlopenflags',
'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout',
'version', 'version_info', 'warnoptions']</sourcesyntaxhighlight>
 
Будучи использованной без аргументов, функция <code>dir()</code> возвращает список имён, определённых в данный момент.
 
<sourcesyntaxhighlight lang="python">>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir()
['__builtins__', '__doc__', '__file__', '__name__', 'a', 'fib', 'fibo', 'sys']</sourcesyntaxhighlight>
 
Обратите внимание, что список состоит из имён всех типов: переменных, модулей, функций и т.д.
Строка 1751:
В списке, возвращаемом функцией <code>dir()</code> не содержится встроенных функций и переменных. Если вы хотите получить ''их'' список, то они определены в стандартном модуле <code>__builtin__</code>:
 
<sourcesyntaxhighlight lang="python">>>> import __builtin__
>>> dir(__builtin__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'DeprecationWarning',
Строка 1776:
'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set',
'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super',
'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']</sourcesyntaxhighlight>
 
=== Пакеты ===
Строка 1814:
Пользователи пакета могут импортировать из него конкретные модули, например:
 
<sourcesyntaxhighlight lang="python">import sound.effects.echo</sourcesyntaxhighlight>
 
Таким образом подгружается подмодуль <code>sound.effects.echo</code>. Ссылаться на него нужно используя его полное имя:
 
<sourcesyntaxhighlight lang="python">sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)</sourcesyntaxhighlight>
 
Другой способ импортирования подмодуля:
 
<sourcesyntaxhighlight lang="python">from sound.effects import echo</sourcesyntaxhighlight>
 
Так тоже подгружается подмодуль <code>echo</code>, но теперь он доступен без префикса пакета, поэтому может использоваться следующим образом:
 
<sourcesyntaxhighlight lang="python">echo.echofilter(input, output, delay=0.7, atten=4)</sourcesyntaxhighlight>
 
И еще один вариант — прямое импортирование желаемой функции или переменной:
 
<sourcesyntaxhighlight lang="python">from sound.effects.echo import echofilter</sourcesyntaxhighlight>
 
Опять же, таким образом подгружается подмодуль <code>echo</code>, но теперь его функция <code>echofilter()</code> может быть вызвана непосредственно:
 
<sourcesyntaxhighlight lang="python">echofilter(input, output, delay=0.7, atten=4)</sourcesyntaxhighlight>
 
Заметьте, что при использовании выражения <code>from ''пакет'' import ''элемент''</code>, ''элементом'' может быть подмодуль (или подпакет) пакета или любое другое имя, определённое в пакете - например, функция, класс или переменная. Оператор <code>import</code> сначала проверяет, определён ли элемент в пакете; если нет — он трактует его как модуль и пытается загрузить. Если не удается его найти, порождается исключение <code>ImportError</code>.
Строка 1846:
Единственный выход для автора пакета — предоставить его подробное содержание. Оператор <code>import</code> использует следующее соглашение: если в коде файла <tt>__init__.py</tt> текущего пакета определён список <code>__all__</code>, то он полагается списком имён модулей, которые нужно импортировать если обнаружено выражение <code>from ''пакет'' import *</code>. На совести автора поддержка этого списка в соответствующем состоянии в каждой новой версии пакета. Впрочем, авторы пакета могут его не поддерживать вообще, если не видят смысла в импортировании <code>*</code> из их пакета. Например, файл <code>sounds/effects/__init__.py</code> может содержать следующий код:
 
<sourcesyntaxhighlight lang="python">__all__ = ["echo", "surround", "reverse"]</sourcesyntaxhighlight>
 
Это будет значить, что выражение <code>from sound.effects import *</code> импортирует три именованных подмодуля из пакета <code>sound</code>.
Строка 1852:
Если список <code>__all__</code> не определён, выражение <code>from Sound.Effects import *</code> не импортирует все подмодули пакета <code>sound.effects</code> в текущее пространство имён — оно лишь убеждается, что импортирован пакет <code>sound.effects</code> (возможно, выполняя код инициализации из <tt>__init__.py</tt>), а затем импортирует все определённые в пакете имена. В этот список попадают любые имена, определённые (и загруженные явно подмодулями) в <tt>__init__.py</tt>. В него также попадают все явно загруженные предшествующими операторами <code>import</code> подмодули. Рассмотрим следующий код:
 
<sourcesyntaxhighlight lang="python">import sound.effects.echo
import sound.effects.surround
from sound.effects import *</sourcesyntaxhighlight>
 
В этом примере, модули <code>echo</code> и <code>surround</code> импортируются в текущее пространство имён, поскольку они определены в пакете <code>sound.effects</code> на тот момент, когда исполняется оператор <code>from ... import</code>. (И это также работает если определён <code>__all__</code>.)
Строка 1870:
Начиная с Python 2.5, в дополнение к описанным выше способам ''неявного относительного импортирования'' (<tt>implicit relative imports</tt>), вы можете использовать ''явное относительное импортирование'' (<tt>explicit relative imports</tt>) пользуясь формой <code>from ''модуль'' import ''имя''</code> оператора <code>import</code>. Такие способы импортирования используют символы точки для описания текущего и родительского пакетов, порожденных относительным импортированием. Например, для модуля <code>surround</code> вы можете написать:
 
<sourcesyntaxhighlight lang="python">from . import echo
from .. import Formats
from ..Filters import equalizer</sourcesyntaxhighlight>
 
Обратите внимание, что и явное и неявное относительное импортирование основано на имени текущего модуля. Поскольку имя главного модуля всегда „<code>__main__</code>“ — модули, предназначенные для использования в качестве главных модулей приложения на Python, должны всегда использовать ''абсолютное импортирование'' (<tt>absolute imports</tt>).
Строка 1898:
Несколько примеров:
 
<sourcesyntaxhighlight lang="python">>>> s = 'Привет, мир.'
>>> str(s)
'Привет, мир.'
Строка 1919:
>>> # Аргументом функции repr() может быть объект Python:
... repr((x, y, ('фарш', 'яйца')))
"(32.5, 40000, ('фарш', 'яйца'))"</sourcesyntaxhighlight>
 
Вот два способа вывести таблицу квадратов и кубов:
 
<sourcesyntaxhighlight lang="python">>>> for x in range(1, 11):
... print repr(x).rjust(2), repr(x*x).rjust(3),
... # Заметьте замыкающую предыдущую строку запятую
Строка 1950:
8 64 512
9 81 729
10 100 1000</sourcesyntaxhighlight>
 
(Обратите внимание, что в первом примере единичные пробелы между колонок добавлены за счёт принципов работы оператора <code>print</code>: он всегда вставляет пробелы между своими аргументами)
Строка 1958:
Есть другой метод, <code>zfill()</code>, который заполняет нулями пространство слева от числовой строки. Он распознаёт знаки плюс и минус:
 
<sourcesyntaxhighlight lang="python">>>> '12'.zfill(5)
'00012'
>>> '-3.14'.zfill(7)
'-003.14'
>>> '3.14159265359'.zfill(5)
'3.14159265359'</sourcesyntaxhighlight>
 
Основной способ применения метода <code>str.format()</code> выглядит так<ref>''(Прим. перев.)'' We are the knights who say "Ni!" (''Мы - те рыцари, что говорят "Ни!"'') — цитата из [http://www.mwscomp.com/movies/grail/grail-13.htm сцены 13-й] фильма Монти Пайтон и Святой Грааль (Monty Python and Holy Grail)</ref>:
 
<sourcesyntaxhighlight lang="python">>>> print 'Мы — те {0}, что говорят "{1}!"'.format('рыцари', 'Ни')
Мы — те рыцари, что говорят "Ни!"</sourcesyntaxhighlight>
 
Скобки и символы, которые они окружают (их называют ''полями форматирования'' (<tt>format fields</tt>)) заменяются на объекты, переданные в метод <code>format</code>. Номер в скобках обозначает позицию объекта в списке аргументов, переданных в метод <code>format</code>.
 
<sourcesyntaxhighlight lang="python">>>> print '{0} и {1}'.format('фарш', 'яйца')
фарш и яйца
>>> print '{1} и {0}'.format('фарш', 'яйца')
яйца и фарш</sourcesyntaxhighlight>
 
Если в методе <code>format</code> используются именованные аргументы, ссылаться на их значения можно используя имя соответствующего аргумента<ref>''(Прим. перев.)'' <tt>вывести('Этот {пища} — {прилагательное}.'.format(пища='фарш', прилагательное='непередаваемо ужасен'))</tt></ref>.
 
<sourcesyntaxhighlight lang="python">>>> print 'Этот {food} — {adjective}.'.format(
... food='фарш', adjective='непередаваемо ужасен')
Этот фарш — непередаваемо ужасен.</sourcesyntaxhighlight>
 
Позиционные и именованные аргументы можно произвольно совмещать<ref>''(Прим. перев.)'' <tt>вывести 'История о {0}, {1}, и {другой}.'.форматировать('Билл', 'Манфред', другой='Георг')</tt></ref>:
 
<sourcesyntaxhighlight lang="python">>>> print 'История о {0}е, {1}е, и {other}е.'.format('Билл', 'Манфред',
other='Георг')
История о Билле, Манфреде, и Георге.</sourcesyntaxhighlight>
 
После имени поля может следовать необязательный спецификатор формата ‘<code>:</code>’. Пользуясь им, можно управлять тем, как значение будет отформатировано. Следующий пример оставляет у числа Пи только три цифры после десятичного разделителя<ref>''(Прим. перев.)'' В качестве десятичного разделителя в Python используется точка, в соответствии со стандартами большинства стран.</ref>.
 
<sourcesyntaxhighlight lang="python">>>> import math
>>> print 'Значение ПИ — примерно {0:.3f}.'.format(math.pi)
Значение ПИ — примерно 3.142.</sourcesyntaxhighlight>
 
Если после спецификатора ‘<code>:</code>’ указать число — оно будет обозначать минимальную ширину поля, выраженную в количестве символов. Это удобно использовать для создания приятных для прочтения таблиц:
 
<sourcesyntaxhighlight lang="python">>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
>>> for name, phone in table.items():
... print '{0:10} ==> {1:10d}'.format(name, phone)
Строка 2003:
Jack ==> 4098
Dcab ==> 7678
Sjoerd ==> 4127</sourcesyntaxhighlight>
 
Если ваша строка с форматами очень длинна, а вы не хотите разбивать её на подстроки, было бы неплохо если бы вы могли ссылаться на переменные, предназначенные для форматирования, не по позиции, а по имени. Это можно сделать, просто передав словарь и используя квадратные скобки ‘<tt>[]</tt>’ для доступа к ключам.
 
<sourcesyntaxhighlight lang="python">>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print 'Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; '
'Dcab: {0[Dcab]:d}'.format(table)
Jack: 4098; Sjoerd: 4127; Dcab: 8637678</sourcesyntaxhighlight>
 
Также это можно сделать, передав таблицу в виде именованных аргументов, используя нотацию „<code>**</code>“:
 
<sourcesyntaxhighlight lang="python">>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print 'Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(**table)
Jack: 4098; Sjoerd: 4127; Dcab: 8637678</sourcesyntaxhighlight>
 
Это, в отдельности, довольно полезно использовать в сочетании с новой встроенной функцией <code>vars()</code>, которая возвращает словарь, содержащий все локальные переменные.
Строка 2026:
Для форматирования строк можно использовать и оператор <code>%</code>. Он интерпретирует левый аргумент как строку форматирования в стиле <code>sprintf</code>, которую следует применить к правому аргументу, и возвращает строку, получившуюся за счёт этого преобразования. Например:
 
<sourcesyntaxhighlight lang="python">>>> import math
>>> print 'Значение ПИ — примерно %5.3f.' % math.pi
Значение ПИ — примерно 3.142.</sourcesyntaxhighlight>
 
Поскольку метод <code>str.format()</code> довольно нов, большая часть исходных кодов Python всё ещё использует оператор <code>%<code>. Однако, со временем, форматирование строк будет удалено из языка, поэтому в большинстве случаев следует использовать <code>str.format()</code>.
Строка 2039:
Функция <code>open()</code> возвращает объект файла и в большинстве случаев используется с двумя аргументами: <code>open(''имя_файла'', ''режим'')</code>.
 
<sourcesyntaxhighlight lang="python">>>> f = open('/tmp/workfile', 'w')
>>> print f
<open file '/tmp/workfile', mode 'w' at 80a0960></sourcesyntaxhighlight>
 
Первый аргумент — строка, содержащая имя файла. Второй аргумент — другая строка, содержащая несколько символов, описывающих каким образом файл будет использоваться. Значение аргумента ''режим'' может быть символом <code>'r'</code>, если файл будет открыт только для чтения, <code>'w'</code> — открыт только для записи (существующий файл с таким же именем будет стёрт), и <code>'a'</code> — файл открыт для добавления: любые данные, записанные в файл автоматически добавляются в конец. <code>'r+'</code> открывает файл и для чтения и для записи. Аргумент ''режим'' необязателен: если он опущен — предполагается, что он равен <code>'r'</code>.
Строка 2053:
Чтобы прочитать содержимое файла вызовите <code>f.read(''размер'')</code> — функция читает некоторое количество данных и возвращает их в виде строки. <code>''размер''</code> — необязательный числовой аргумент. Если <code>''размер''</code> опущен или отрицателен, будет прочитано и возвращено всё содержимое файла; если файл по величине в два раза больше оперативной памяти вашего компьютера, то решение этой проблемы остаётся на вашей совести. В обратном случае, будет прочитано и возвращено максимум <code>''размер''</code> байт. Если был достигнут конец файла, <code>f.read()</code> вернёт пустую строку (<code>""</code>).
 
<sourcesyntaxhighlight lang="python">>>> f.read()
'Это всё содержимое файла.\n'
>>> f.read()
''</sourcesyntaxhighlight>
 
<code>f.readline()</code> читает одну строку из файла; символ новой строки (<code>\n</code>) остаётся в конце прочитанной строки и отсутствует при чтении последней строки файла только если файл не оканчивается пустой строкой. За счёт этого возвращаемое значение становится недвусмысленным: если <code>f.readline()</code> возвращает пустую строку — достигнут конец файла, в то же время незаполненная строка, представленная посредством <code>'\n'</code>, содержит лишь символ новой строки.<ref>''(Прим. перев.)'' В источнике, в большинстве случаев, разделяется понятие ''строки'' как типа данных и ''строки'' как строки текста (ср., ''строчка'') за счёт слов ''string'' и ''line'' соответственно. В русском языке это различие передать сложно, тем не менее я старался по возможности избежать двусмысленностей.</ref>
 
<sourcesyntaxhighlight lang="python">>>> f.readline()
'Это первая строка файла.\n'
>>> f.readline()
'Вторая строка файла\n'
>>> f.readline()
''</sourcesyntaxhighlight>
 
<code>f.readlines()</code> возвращает список, содержащий все строки с данными, обнаруженные в файле. Если передан необязательный параметр <code>подсказка_размера</code>, функция читает из файла указанное количество байт, плюс некоторое количество байт сверх, достаточное для завершения строки, и формирует список строк из результата. Функция часто используется для построчного чтения больших файлов, эффективного за счёт отсутствия необходимости загрузки файла в память полностью. Возвращены будут только полные (завершённые) строки.
 
<sourcesyntaxhighlight lang="python">>>> f.readlines()
['Это первая строка файла.\n', 'Вторая строка файла\n']</sourcesyntaxhighlight>
 
Альтернативный способ построчного чтения — прохождение циклом по объекту файла. Он быстр, рационально использует память и имеет простой код в результате:
 
<sourcesyntaxhighlight lang="python">>>> for line in f:
print line,
Это первая строка файла.
Вторая строка файла</sourcesyntaxhighlight>
 
Альтернативный способ проще, но не предоставляет тонкого контроля над происходящим. Поскольку оба этих способа работают с буферизацией строк по разному, не следует их смешивать.
Строка 2084:
<code>f.write(''строка'')</code> записывает содержимое ''строки'' в файл и возвращает <code>None</code>.
 
<sourcesyntaxhighlight lang="python">>>> f.write('Это тест\n')</sourcesyntaxhighlight>
 
Чтобы записать в файл нечто отличное от строки, предварительно это нечто нужно в строку сконвертировать<ref>''(Прим. перев.)'' Возможно, подразумевается [[w:Ответ на главный вопрос жизни, вселенной и всего такого|ответ на главный вопрос жизни, вселенной и всего такого]]</ref>:
 
<sourcesyntaxhighlight lang="python">>>> value = ('ответ', 42)
>>> s = str(value)
>>> f.write(s)</sourcesyntaxhighlight>
 
<code>f.tell()</code> возвращает целое, представляющее собой текущую позицию в файле объекта файла <code>f</code>, измеренную в байтах от начала файла. Чтобы изменить позицию объекта файла, используйте "<code>f.seek(''смещение'', ''откуда'')</code>". Позиция вычисляется за счёт сложения смещения и точки отсчёта; точка отсчёта выбирается из аргумента <code>''откуда''</code>. Значение <code>0</code> аргумента <code>''откуда''</code> отмеряет смещение от начала файла, значение <code>1</code> применяет текущую позицию в файле, а значение <code>2</code> в качестве точки отсчёта использует конец файла. Аргумент <code>''откуда''</code> может быть опущен и по умолчанию устанавливается в <code>0</code>, используя начало файла в качестве точки отсчёта.
 
<sourcesyntaxhighlight lang="python">>>> f = open('/tmp/workfile', 'r+')
>>> f.write('0123456789abcdef')
>>> f.seek(5) # Перейти к шестому байту в файле
Строка 2101:
>>> f.seek(-3, 2) # Перейти к третьему байту с конца
>>> f.read(1)
'd'</sourcesyntaxhighlight>
 
Когда вы закончили все действия над файлом, вызовите <code>f.close()</code> чтобы закрыть его и освободить все системные ресурсы, использованные при открытии этого файла. Все попытки использовать объект файла после вызова <code>f.close()</code> будут завершены неудачей.
 
<sourcesyntaxhighlight lang="python">>>> f.close()
>>> f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ValueError: I/O operation on closed file</sourcesyntaxhighlight>
 
Считается хорошей манерой использовать ключевое слово <code>with</code> при работе с объектами файлов. Преимущество этого способа в том, что файл всегда корректно закрывается после выполнения блока, либо если при выполнении было порождено исключение. Кроме того, получающийся код намного короче, чем эквивалентная форма с блоками <tt><code>try</code>-<code>finally</code></tt>:
 
<sourcesyntaxhighlight lang="python">>>> with open('/tmp/workfile', 'r') as f:
... read_data = f.read()
>>> f.closed
True</sourcesyntaxhighlight>
 
У объектов файла есть ещё несколько дополнительных методов, таких как <code>isatty()</code> и <code>truncate()</code>, которые используются не так часто; обратитесь к [[Справочник по библиотеке Python 2.6|Справочнику по библиотеке]] для более полного обзора по объекту файла.
Строка 2128:
Если у вас есть некоторый объект <code>x</code> и объект файла <code>f</code>, открытый на запись, простейший способ ''законсервировать'' объект требует одной-единственной строки кода:
 
<sourcesyntaxhighlight lang="python">pickle.dump(x, f)</sourcesyntaxhighlight>
 
Чтобы снова расконсервировать объект, при условии, что <code>f</code> — объект файла, открытого для чтения:
 
<sourcesyntaxhighlight lang="python">x = pickle.load(f)</sourcesyntaxhighlight>
 
(Существуют варианты выполнения этих операций, применяемые при ''расконсервации'' нескольких объектов или когда вам требуется записать ''консервированные'' данные в файл; проконсультируйтесь с полной документацией по модулю [[Справочник по библиотеке Python 2.6#pickle|pickle]] из [[Справочник по библиотеке Python 2.6|Справочника по библиотеке]].)
Строка 2146:
Синтаксические ошибки, также известные как ошибки разбора кода (''парсинга'', <tt>parsing</tt>) — вероятно, наиболее привычный вид протестов интерпретатора, попадающихся вам при изучении Python:
 
<sourcesyntaxhighlight lang="python">>>> while True print 'Hello world'
File "<stdin>", line 1, in ?
while True print 'Hello world'
^
SyntaxError: invalid syntax</sourcesyntaxhighlight>
 
Парсер<ref>''(Прим. перев.)'' ''Parser'' {{ref-en}} — программа синтаксического анализа, синтаксический анализатор; программа грамматического разбора</ref> повторно выводит возмутившую его строку и отображает небольшую «стрелку», указывающую на самую первую позицию в строке, где была обнаружена ошибка. Причина ошибки (или, по крайней мере, место обнаружения) находится в символе<ref>''(Прим. перев.)'' ''Token'' {{ref-en}} — некоторая смысловая единица выражения: оператор, ключевое слово, значение переменной, ...</ref>, предшествующем указанному: в приведённом примере ошибка обнаружена на месте вызова оператора <code>print</code>, поскольку перед ним пропущено двоеточие (<code>':'</code>). Также здесь выводятся имя файла и номер строки, благодаря этому вы знаете в каком месте искать, если ввод был сделан из сценария.
Строка 2158:
Даже если выражение или оператор синтаксически верны, они могут вызвать ошибку при попытке их исполнения. Ошибки, обнаруженные при исполнении, называются ''исключениями'' (<tt>exceptions</tt>) и не фатальны безоговорочно: позже вы научитесь перехватывать их в программах на Python. Большинство исключений, правда, как правило, не обрабатываются программами и приводят к сообщениям об ошибке, таким как следующие:
 
<sourcesyntaxhighlight lang="python">>>> 10 * (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
Строка 2169:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects</sourcesyntaxhighlight>
 
Последняя строка сообщения об ошибке описывает произошедшее. Исключения представлены различными типами и тип исключения выводится в качестве части сообщения: в примере это типы <code>ZeroDivisionError</code>, <code>NameError</code> и <code>TypeError</code>. Часть строки, описывающая тип исключения — это имя произошедшего встроенного исключения. Такое утверждение истинно для всех встроенных исключений, но не обязано быть истинным для исключений, определённых пользователем (однако, само соглашение — довольно полезное). Имена стандартных исключений это встроенные идентификаторы (не ключевые слова).
Строка 2183:
Существует возможность написать код, который будет перехватывать избранные исключения. Посмотрите на представленный пример, в котором пользователю предлагают вводить число до тех пор, пока оно не окажется корректным целым. Тем не менее пользователь может прервать программу (используя сочетание клавиш <tt>Control-C</tt> или какое-либо другое, поддерживаемое операционной системой); заметьте — о вызванном пользователем прерывании сигнализирует исключение <code>KeyboardInterrupt</code>.
 
<sourcesyntaxhighlight lang="python">>>> while True:
... try:
... x = int(raw_input("Введите, пожалуйста, число: "))
Строка 2189:
... except ValueError:
... print "Ой! Это некорректное число. Попробуйте ещё раз..."
...</sourcesyntaxhighlight>
 
Оператор <code>try</code> работает следующим образом:
Строка 2203:
Оператор <code>try</code> может иметь более одного блока <code>except</code> — для описания обработчиков различных исключений. При этом будет выполнен максимум один обработчик. Обработчики следят<ref>''(Прим. перев.)'' ''Handle'' {{ref-en}} — ''зд.'', [ловить и] обрабатывать, управлять, контролировать, разбирать, следить, управляться с...</ref> только за теми исключениями, которые появляются в соответствующем блоке <code>try</code>, не за порождёнными в других обработчиках. Блок <code>except</code> может указывать несколько исключений в виде заключённого в скобки кортежа, например:
 
<sourcesyntaxhighlight lang="python">... except (RuntimeError, TypeError, NameError):
... pass</sourcesyntaxhighlight>
 
В последнем блоке <code>except</code> можно не указывать имени (имён) исключений, тогда он будет действовать как обработчик группы исключений. Используйте эту возможность с особой осторожностью, поскольку таким образом он может с лёгкостью перехватить и фактическую ошибку программиста! Также такой обработчик может быть использован для вывода сообщения об ошибке и порождения исключения заново (при этом позволяя обработать исключение коду, вызвавшему обработчик):
 
<sourcesyntaxhighlight lang="python">import sys
 
try:
Строка 2220:
except:
print "Неожиданная ошибка:", sys.exc_info()[0]
raise</sourcesyntaxhighlight>
 
У оператора <code>try ''...'' except</code> есть необязательный ''блок <code>else<code>'', который, если присутствует, должен размещаться после всех блоков <code>except<code>. Его полезно использовать при наличии кода, который должен быть выполнен, если блок <code>try<code> не породил исключений. Например:
 
<sourcesyntaxhighlight lang="python">for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
Строка 2231:
else:
print arg, 'содержит', len(f.readlines()), 'строк'
f.close()</sourcesyntaxhighlight>
 
Использование блока <code>else</code> предпочтительнее, чем добавление дополнительного кода к блоку <code>try</code>, поскольку исключает неожиданный перехват исключения, которое появилось не по причине выполнения кода, защищенного оператором <code>try ''...'' except</code>.
Строка 2241:
Использование <code>.args</code> в целом не одобряется. Вместо этого, рекомендуемый способ использования — это передача исключению единственного аргумента (который может быть кортежем, если требуется несколько аргументов) и его связь с атрибутом <code>message</code>. Таким образом можно создать экземпляр исключения перед его ''порождением'' (<tt>raising</tt>) и добавить любые атрибуты по желанию.
 
<sourcesyntaxhighlight lang="python">>>> try:
... raise Exception('spam', 'eggs')
... except Exception as inst:
Строка 2255:
('spam', 'eggs')
x = spam
y = eggs</sourcesyntaxhighlight>
 
Если у исключения есть аргумент, он выводится в качестве последней части («детальной») сообщения необработанных исключений.
Строка 2261:
Обработчики исключений перехватывают не только исключения, появившиеся прямо в блоке <code>try</code>, но также если они появились внутри функций, которые были в блоке <code>try</code> вызваны (даже неявно). Например:
 
<sourcesyntaxhighlight lang="python">>>> def this_fails():
... x = 1/0
...
Строка 2269:
... print 'Перехват ошибки времени исполнения:', detail
...
Перехват ошибки времени исполнения: integer division or modulo by zero</sourcesyntaxhighlight>
 
=== Порождение исключений ===
Строка 2275:
Оператор <code>raise</code> позволяет программисту принудительно породить исключение. Например:
 
<sourcesyntaxhighlight lang="python">>>> raise NameError, 'ПриветТам'
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: ПриветТам</sourcesyntaxhighlight>
 
Первый аргумент оператора <code>raise</code> именует исключение, которое нужно породить. Необязательный второй аргумент определяет аргумент исключения. Кроме того, код выше может быть записан в виде <code>raise NameError('ПриветТам')</code>. Обе формы работают корректно, однако второму варианту, похоже, отдаётся стилистическое предпочтение.
Строка 2284:
Если вам нужно определить, было ли порождено исключение, но при этом не перехватывать его — упрощённая форма оператора <code>raise</code> позволяет вам породить исключение заново:
 
<sourcesyntaxhighlight lang="python">>>> try:
... raise NameError, 'ПриветТам'
... except NameError:
Строка 2293:
Traceback (most recent call last):
File "<stdin>", line 2, in ?
NameError: ПриветТам</sourcesyntaxhighlight>
 
=== Исключения, определённые пользователем ===
Строка 2299:
В программах можно определять свои собственные исключения — посредством создания нового класса исключения. В общем случае, исключения должны быть отнаследованы от класса <code>Exception</code>: явно или не явно. Например:
 
<sourcesyntaxhighlight lang="python">>>> class MyError(Exception):
... def __init__(self, value):
... self.value = value
Строка 2314:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
__main__.MyError: 'ой!'</sourcesyntaxhighlight>
 
В этом примере конструктор по умолчанию <code>__init__()</code> класса <code>Exception</code> был перегружен. Новое поведение отличается лишь созданием нового атрибута <code>value</code> и заменяет поведение по умолчанию, при котором создаётся атрибут <code>args</code>.
Строка 2320:
Классы исключений могут определять любые действия, которые могут делать все другие классы, но обычно их внутренняя структура сохраняется в простом виде, часто предоставляя лишь некоторые атрибуты, которые позволят обработчикам исключений выяснить информацию об ошибке подробно. При создании модуля, который может породить различные ошибки, обычной практикой будет создание базового класса для исключений, определённых в этом модуле, и подклассов, которые будут создавать определённые классы исключений для разных ошибочных состояний:
 
<sourcesyntaxhighlight lang="python">class Error(Exception):
"""Базовый класс для всех исключений в этом модуле."""
pass
Строка 2349:
self.previous = previous
self.next = next
self.message = message</sourcesyntaxhighlight>
 
Большинство исключений определяются именем, заканчивающимся на «<code>Error</code>», сходно именованию стандартных исключений.
Строка 2359:
У оператора <code>try</code> есть другой необязательный блок, предназначенный для операций подчистки, которые нужно выполнить независимо от условий:
 
<sourcesyntaxhighlight lang="python">>>> try:
... raise KeyboardInterrupt
... finally:
Строка 2367:
Traceback (most recent call last):
File "<stdin>", line 2, in ?
KeyboardInterrupt</sourcesyntaxhighlight>
 
''Блок <code>finally</code>'' исполняется всегда, когда интерпретатор покидает оператор <code>try</code>, независимо — были исключения или нет. Если в блоке <code>try</code> появилось исключение, которое не было обработано в блоке <code>except</code> (или появилось в самих блоках <code>except</code> или <code>else</code>) — оно порождается заново после выполнения блока <code>finally</code>. Также блок <code>finally</code> исполняется «по пути наружу», если какой-либо другой блок оператора <code>try</code> был покинут за счёт одного из операторов: <code>break</code>, <code>continue</code> или <code>return</code>. Более сложный пример:
 
<sourcesyntaxhighlight lang="python">>>> def divide(x, y):
... try:
... result = x / y
Строка 2392:
File "<stdin>", line 1, in ?
File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'</sourcesyntaxhighlight>
 
Как видите, блок <code>finally</code> выполняется при любом событии. Ошибка <code>TypeError</code> порождается при делении двух строк и не перехватывается блоком <code>except</code>, и поэтому порождается заново сразу после выполнения блока <code>finally</code>.
Строка 2402:
Некоторые объекты определяют стандартные действия при подчистке, применяемые если объект больше не нужен, независимо от того, удачна была операция использования объекта или нет. Посмотрите на следующий пример, в которым мы пытаемся открыть файл и вывести его содержимое на экран.
 
<sourcesyntaxhighlight lang="python">for line in open("myfile.txt"):
print(line)</sourcesyntaxhighlight>
 
Проблема этого кода в том, что он оставляет файл открытым на неопределённое время после выполнения данной части кода. В простых сценариях это не является проблемой, но может стать ей в больших приложениях. Оператор <code>with</code> позволяет использовать объекты (такие как, например, файлы) таким образом, чтобы вы всегда могли быть уверены в том, что ресурсы будут сразу и корректно очищены.
 
<sourcesyntaxhighlight lang="python">with open("myfile.txt") as f:
for line in f:
print(line)</sourcesyntaxhighlight>
 
После выполнения оператора, файл ''<code>f</code>'' всегда закрывается, даже если при прочтении строк обнаружилась проблема. В документации к объектам, которые поддерживают предопределённые действия по подчистке, таким как файлы, эта их способность будет явно указана.
Строка 2461:
Простейшая форма определения класса выглядит так:
 
<sourcesyntaxhighlight lang="python">class ИмяКласса:
<выражение-1>
.
.
.
<выражение-N></sourcesyntaxhighlight>
 
Определения классов, как и определения функций (операторы <code>def</code>) должны быть исполнены для того, чтобы иметь какой-либо эффект. (Вы можете, предположим, поместить определение класса в ветку оператора <code>if</code> или внутрь функции.)
Строка 2482:
''Ссылки на атрибуты'' (<tt>Attribute references</tt>) используют стандартный синтаксис, использующийся для всех ссылок на атрибуты в Python: <code>''объект''.''имя''</code>. Корректными именами атрибутов являются все имена, которые находились в пространстве имён класса при создании объекта-класса. Таким образом, если определение класса выглядело так:
 
<sourcesyntaxhighlight lang="python">class MyClass:
"""Простой пример класса"""
i = 12345
def f(self):
return 'привет мир'</sourcesyntaxhighlight>
 
то <code>MyClass.i</code> и <code>MyClass.f</code> являются корректными ссылками на атрибуты, возвращающими целое и ''объект-функцию'' (<tt>function object</tt>) соответственно. Атрибутам класса можно присваивать значение, так что вы можете изменить значение <code>MyClass.i</code> через присваивание. <code>__doc__</code> также является корректным атрибутом, возвращающим строку документации, принадлежащей классу: <code>"Простой пример класса"</code>.
Строка 2492:
Создание экземпляра класса использует нотацию функций. Просто представьте, что объект-класс — это непараметризованная функция, которая возвращает новый экземпляр класса. Например (предполагая класс, приведённый выше):
 
<sourcesyntaxhighlight lang="python">x = MyClass()</sourcesyntaxhighlight>
 
создаёт новый экземпляр класса и присваивает этот объект локальной переменной <code>x</code>.
Строка 2498:
Операция ''создания экземпляра'' (<tt>instantiation</tt>, «вызов» объекта-класса) создаёт пустой объект. Большая часть классов предпочитает создавать экземпляры, настроенные с учётом определённого начального состояния. Для этого класс может определять специальный метод под именем <code>__init__()</code>, например так:
 
<sourcesyntaxhighlight lang="python">def __init__(self):
self.data = []</sourcesyntaxhighlight>
 
Когда в классе определён метод <code>__init__()</code>, при создании экземпляра автоматически вызывается <code>__init__()</code> нового, созданного, класса. Так, в этом примере, новый инициализированный экземпляр может быть получен за счёт выполнения кода:
 
<sourcesyntaxhighlight lang="python">x = MyClass()</sourcesyntaxhighlight>
 
Конечно же, для большей гибкости, метод <code>__init__()</code> может иметь аргументы. В этом случае аргументы, переданные оператору создания экземпляра класса, передаются методу <code>__init__()</code>. Например,
 
<sourcesyntaxhighlight lang="python">>>> class Complex:
... def __init__(self, realpart, imagpart):
... self.r = realpart
Строка 2514:
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)</sourcesyntaxhighlight>
 
==== Объекты-экземпляры ====
Строка 2522:
''Атрибуты-данные'' (<tt>data attributes</tt>) аналогичны «переменным экземпляров» в Smalltalk и «членам-данным» в C++. Атрибуты данных не нужно описывать — как и переменные, они начинают существование в момент первого присваивания. Например, если <code>x</code> — экземпляр созданного выше <code>MyClass</code>, следующий отрывок кода выведет значение <code>16</code>, не вызвав ошибок:
 
<sourcesyntaxhighlight lang="python">x.counter = 1
while x.counter < 10:
x.counter = x.counter * 2
print x.counter
del x.counter</sourcesyntaxhighlight>
 
Другой тип ссылок на атрибуты экземпляра — это ''метод'' (<tt>method</tt>). Метод — это функция, «принадлежащая» объекту. (В Python термин не уникален для экземпляров класса: другие объекты также могут иметь методы. Например, объекты списков имеют методы <code>append</code>, <code>insert</code>, <code>remove</code>, <code>sort</code> и т. д. Тем не менее, далее по обсуждению под термином «метод» мы будем понимать только методы объектов-экземпляров классов, пока отдельно не будет указано иное.)
Строка 2536:
Обычно, метод вызывают сразу после его связывания [с функцией]:
 
<sourcesyntaxhighlight lang="python">x.f()</sourcesyntaxhighlight>
 
На примере <code>MyClass</code> такой код возвратит строку <code>'привет мир'<code>. Однако, не обязательно вызывать метод так уж сразу: <code>x.f</code> — это объект-метод, он может быть отложен и вызван когда-либо позже. Например:
 
<sourcesyntaxhighlight lang="python">xf = x.f
while True:
print xf()</sourcesyntaxhighlight>
 
будет печатать <code>'привет мир'<code> до конца времён.
Строка 2566:
Любой объект-функция, являющийся атрибутом класса, определяет метод для экземпляров этого класса. Не так важно, чтобы текст определения функции был заключен в определение класса: присваивание объекта-функции локальной переменной класса также работает неплохо. Например:
 
<sourcesyntaxhighlight lang="python"># Функция, определённая вне класса
def f1(self, x, y):
return min(x, x+y)
Строка 2574:
def g(self):
return 'привет мир'
h = g</sourcesyntaxhighlight>
 
Теперь <code>f</code>, <code>g</code> и <code>h</code> — все являются атрибутами класса <code>C</code>, ссылающимися на объекты-функции, и, следовательно, все они являются методами экземпляров <code>C</code> — <code>h</code> становится полностью эквивалентен <code>g</code>. Заметьте, что такая практика обычно служит лишь тому, чтобы запутать читателя программы.
Строка 2580:
Методы могут вызывать другие методы за счёт использования атрибутов-методов аргумента <code>self</code>:
 
<sourcesyntaxhighlight lang="python">class Bag:
def __init__(self):
self.data = []
Строка 2587:
def addtwice(self, x):
self.add(x)
self.add(x)</sourcesyntaxhighlight>
 
Методы могут ссылаться на глобальные имена таким же образом, как и обычные функции. Глобальная область видимости, связанная с методом, — это модуль, содержащий определение класса. (Сам класс никогда не используется в качестве глобальной области видимости!) В то время, как одни редко находят причины для использования глобальных данных в методах, существует множество вполне законных способов использования глобальной области видимости: для примера, функции и модули, импортированные в глобальную область видимости, могут использоваться методами так же хорошо, как функциями и классами, в них определёнными. Обычно класс, содержащий метод, сам определён в этой глобальной области видимости, и в следующем разделе мы найдём пару хороших причин, почему метод может иметь желание ссылаться на собственный класс!
Строка 2595:
Конечно же, не поддерживай «класс» наследование, не стоило бы называть его «классом». Синтаксис производного класса выглядит так:
 
<sourcesyntaxhighlight lang="python">class ИмяПроизводногоКласса(ИмяБазовогоКласса):
<выражение-1>
.
.
.
<выражение-N></sourcesyntaxhighlight>
 
Имя ''<code>ИмяБазовогоКласса</code>'' должно быть определено в области видимости, содержащей определение производного класса. Вместо имени базового класса также позволяется использовать другие выражения. Это может быть полезно, например, когда базовый класс определён в другом модуле:
 
<sourcesyntaxhighlight lang="python">class ИмяПроизводногоКласса(имямодуля.ИмяБазовогоКласса):</sourcesyntaxhighlight>
 
Использование определения производного класса проходит таким же образом, как и базового. Базовый класс полностью сохраняется по завершению конструирования объекта-класса. Такой метод используется для разрешения ссылок на атрибуты<ref>''(Прим. перев.)'' ''Resolving attribute references'' {{ref-en}} — разрешение (поиск значений) ссылок на атрибуты.</ref>: если запрошенный атрибут не был найден в самом классе, поиск продолжается в базовом классе. Правило применяется рекурсивно, если базовый класс сам является производным от некоторого другого класса.
Строка 2623:
Python также поддерживает ограниченную форму ''множественного наследования'' (<tt>multiple inheritance</tt>). Определение класса с несколькими базовыми классами будет выглядеть так:
 
<sourcesyntaxhighlight lang="python">class ИмяПроизводногоКласса(Базовый1, Базовый2, Базовый3):
<выражение-1>
.
.
.
<выражение-N></sourcesyntaxhighlight>
 
Для классов в старом стиле единственное правило — это правило «глубина-сначала», затем «слева-направо». Таким образом, если атрибут не найден в ''<code>ИмяПроизводногоКласса</code>'', его поиск выполняется в ''<code>Базовом1</code>'', затем (рекурсивно) в базовых классах ''<code>Базового1</code>'' и только если он там не найден, поиск перейдёт в ''<code>Базовый2</code>'' и так далее.
Строка 2648:
=== Всякая всячина ===
 
Иногда полезно иметь тип данных, похожий на <code>record</code> из языка Pascal или <code>struct</code> из языка C — для сборки вместе нескольких поименованных элементов, содержащих данные. Пустое определение класса хорошо поможет<ref>''(Прим. перев.)'':<sourcesyntaxhighlight lang="python">class Рабочий:
pass
 
Строка 2656:
джон.имя = 'Джон До'
джон.отдел = 'компьютерная лаборатория'
джон.зарплата = 1000</sourcesyntaxhighlight></ref>:
 
<sourcesyntaxhighlight lang="python">class Employee:
pass
 
Строка 2666:
john.name = 'John Doe'
john.dept = 'computer lab'
john.salary = 1000</sourcesyntaxhighlight>
 
Отрезок кода на Python, требующий на входе определённого абстрактного типа данных, часто может быть передан классу, который эмулирует вместо него методы этого типа данных. Например, если у вас есть функция, форматирующая некоторые данные из объекта файла, то вы можете определить методы класса <code>read()</code> и <code>readline()</code>, которые вместо этого получат данные из строкового буфера и передать им его в качестве аргумента.
Строка 2678:
Вот две новых (синтаксически) корректных формы оператора <code>raise</code>:
 
<sourcesyntaxhighlight lang="python">raise Класс, экземпляр
 
raise экземпляр</sourcesyntaxhighlight>
 
В первой форме, ''<code>экземпляр</code>'' должен быть экземпляром ''<code>Класса</code>'', или класса, производного от него. Вторая форма является краткой записью следующего кода:
 
<sourcesyntaxhighlight lang="python">raise экземпляр.__class__, экземпляр</sourcesyntaxhighlight>
 
Класс в блоке <code>except</code> является сопоставимым с исключением, если является этим же классом или самим по себе базовым классом (никаких других способов обхода — описанный в блоке <code>except</code> производный класс не сопоставим с базовым). Например, следующий код выведет B, C, D в этом порядке:
 
<sourcesyntaxhighlight lang="python">class B:
pass
class C(B):
Строка 2703:
print "C"
except B:
print "B"</sourcesyntaxhighlight>
 
Обратите внимание, что если бы блоки <code>except</code> шли в обратном порядке (начиная с "<code>except B</code>"), код вывел бы B, B, B — сработал бы первый совпадающий блок <code>except</code>.
Строка 2713:
К этому моменту вы, возможно, заметили, что используя оператор <code>for</code> можно пройти циклом по большинству объектов-контейнеров:
 
<sourcesyntaxhighlight lang="python">for element in [1, 2, 3]:
print element
for element in (1, 2, 3):
Строка 2722:
print char
for line in open("myfile.txt"):
print line</sourcesyntaxhighlight>
 
Такой стиль доступа к элементам прост, лаконичен и удобен. Использованием ''итераторов'' (<tt>iterators</tt>) пропитан язык Python, и это его выделяет среди других. Негласно, оператор <code>for</code> вызывает метод <code>iter()</code> объекта-контейнера. Функция возвращает объект итератора, который определяет метод <code>next()</code>, который по очереди получает доступ к элементам в контейнере, по одному за раз. Если больше не остаётся элементов, метод <code>next()</code> порождает исключение <code>StopIteration</code>, которое сообщает оператору <code>for</code> о необходимости завершения прохода. Следующий пример показывает как это всё работает:
 
<sourcesyntaxhighlight lang="python">>>> s = 'абв'
>>> it = iter(s)
>>> it
Строка 2741:
File "<stdin>", line 1, in ?
it.next()
StopIteration</sourcesyntaxhighlight>
 
Ознакомившись с механизмами, скрытыми за протоколом итераторов, легко добавить возможность итерирования к вашим классам. Определите метод <code>__iter__()</code>, который возвращает объект с методом <code>next()</code>. Если класс определяет и метод <code>next()</code>, тогда <code>__iter__()</code> может просто возвращать <code>self</code>.
 
<sourcesyntaxhighlight lang="python">class Reverse:
"Итератор для прохождения циклом по последовательности в обратном направлении"
def __init__(self, data):
Строка 2764:
а
п
с</sourcesyntaxhighlight>
 
=== Генераторы ===
Строка 2770:
''Генераторы'' (<tt>generators</tt>) — простой и мощный инструмент для создания итераторов. Они записываются как обычная функция, но где бы им ни было необходимо вернуть данные, используется оператор <code>yield</code>. Каждый раз, при вызове <code>next()</code>, генератор возвращается к месту, где он был оставлен (он запоминает все значения данных, а также какой оператор был выполнен последним). Пример показывает, что создание генераторов может быть тривиально простым:
 
<sourcesyntaxhighlight lang="python">def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]
Строка 2781:
л
о
г</sourcesyntaxhighlight>
 
Всё, что можно сделать с использованием генераторов, может быть сделано с использованием основанных на итераторах классов, как описано в предыдущем разделе. Благодаря автоматическому созданию методов <code>__iter__()</code> и <code>next()</code> генераторы так компактны.
Строка 2814:
['ф', 'ь', 'л', 'о', 'г']</code></ref>:
 
<sourcesyntaxhighlight lang="python">>>> sum(i*i for i in range(10)) # сумма квадратов
285
 
Строка 2831:
>>> data = 'golf'
>>> list(data[i] for i in range(len(data)-1,-1,-1))
['f', 'l', 'o', 'g']</sourcesyntaxhighlight>