Файл: Книга на вашем родном языке 6 2 Переводы 7 1 Доступные переводы переводы 7 3 Предисловие 16.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.01.2024
Просмотров: 228
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
17.3. Серия «Модуль недели»
135
Дополнительно
К настоящему моменту мы уже рассмотрели большую часть того, что вам придётся ис- пользовать при работе с Python. В этой главе мы охватим некоторые дополнительные аспекты, которые помогут отшлифовать ваши знания.
18.1 Передача кортежей
Хотелось ли вам когда-нибудь, чтобы функция возвращала не один результат, а два? Это возможно. Всё, что для этого нужно, – использовать кортеж.
>>>
def
get_error_details
():
...
return
(
2
,
'описание ошибки No2'
)
...
>>>
errnum, errstr
=
get_error_details()
>>>
errnum
2
>>>
errstr
'описание ошибки No2'
Обратите внимание, что использование выражения «
a, b = <некоторое выражение>
»
интерпретирует результат как кортеж из двух значений.
Чтобы интерпретировать результат как «
(a, <всё остальное>)
», нужно просто поста- вить звёздочку, как это делалось для параметров функций:
>>>
a,
*
b
=
[
1
,
2
,
3
,
4
]
>>>
a
1
>>>
b
[2, 3, 4]
Это также подразумевает, что поменять местами два значения в Python быстрее всего можно так:
136
A Byte of Python (Russian), Версия 2.02
>>>
a
=
5
; b
=
8
>>>
a, b
=
b, a
>>>
a, b
(8, 5)
18.2 Специальные методы
Есть ряд методов, играющих особую роль для классов. Например,
__init__
и
__del__
Специальные методы служат для того, чтобы имитировать поведение встроенных типов данных. Например, всё, что потребуется для использования операции индексирования x[индекс]
применительно к своему классу (в таком виде, как это делалось для списков и кортежей), это реализовать метод
__getitem__()
. Кстати, именно этот метод Python использует для самого класса list
!
Некоторые полезные специальные методы перечислены в таблице ниже. Все другие ме- тоды можно посмотреть в документации
Имя
Описание
__init__(self, …)
Этот метод вызывается прямо перед тем, как вновь созданный объект возвращается для использования.
__del__(self)
Вызывается перед уничтожением объекта
__str__(self)
Вызывается при использовании функции print или str()
__lt__(self, other)
Вызывается, когда используется оператор «меньше» (<).
Существуют и аналогичные методы для всех операторов (+, >,
и т.д.)
__getitem__(self, key) Вызывается при использовании оператора индексирования x[индекс]
__len__(self)
Вызывается при обращении к встроенной функции len()
для объекта-последовательности.
18.3 Блоки в одно выражение
Мы неоднократно говорили, что каждый блок команд отделяется от других своим соб- ственным уровнем отступа. Однако, существует и исключение. Если блок команд содер- жит только одно выражение, его можно указывать в одной строке с условным оператором или, скажем, оператором цикла. Рассмотрим это на примере:
>>>
flag
=
True
>>>
if
flag:
print
(
'Да'
)
Да
18.2. Специальные методы
137
A Byte of Python (Russian), Версия 2.02
Обратите внимание, что единственный оператор расположен в той же строке, а не отдель- ным блоком. Этот способ может подкупить тем, что якобы «сокращает» программу, но я настоятельно рекомендую избегать его во всех случаях, кроме проверки ошибок. Прежде всего, потому что гораздо легче добавлять команды, когда уже есть необходимый уровень отступа.
18.4 Lambda-формы
Ключевое слово lambda используется для создания функций и возврата их значения во время выполнения программы.
lambda принимает параметр, за которым следует одно выражение, которое становится телом функции, а значение этого выражения возвраща- ется новой функцией.
Пример: (сохраните как lambda.py
)
points
=
[ {
'x'
:
2
,
'y'
:
3
}, {
'x'
:
4
,
'y'
:
1
} ]
points sort(key
=
lambda
i : i[
'y'
])
print
(points)
Вывод:
$ python3 lambda.py
[{'x': 4, 'y': 1}, {'x': 2, 'y': 3}]
Как это работает:
Обратите внимание на то, что метод sort класса list может принимать пара- метр key
, определяющий способ сортировки списка (обычно мы думаем толь- ко о сортировке по возрастанию или по убыванию). В данном случае мы хотим провести сортировку по собственному принципу, для чего нам необходимо написать соответствующую функцию. Но вместо того, чтобы создавать отдель- ный блок def для описания функции, которая будет использоваться только в этом месте, мы применяем лямбда-выражение.
18.5 Генераторы списков
Генераторы списков служат для создания новых списков на основе существующих. Пред- ставьте, что имеется список чисел, на основе которого требуется получить новый список,
состоящий из всех чисел, умноженных на 2, но только при условии, что само число боль- ше 2. Генераторы списков подходят для таких задач как нельзя лучше.
18.4. Lambda-формы
138
A Byte of Python (Russian), Версия 2.02
Пример: (сохраните как list_comprehension.py
)
listone
=
[
2
,
3
,
4
]
listtwo
=
[
2
*
i
for
i
in
listone
if
i
>
2
]
print
(listtwo)
Вывод:
$ python3 list_comprehension.py
[6, 8]
Как это работает:
В этом примере мы создаём новый список, указав операцию, которую необхо- димо произвести (
2 * i
), когда выполняется некоторое условие (
if i > 2
).
Обратите внимание, что исходный список при этом не изменяется.
Преимущество использования генераторов списков состоит в том, что это заметно сокра- щает объёмы стандартного кода, необходимого для циклической обработки каждого эле- мента списка и сохранения его в новом списке.
18.6 Передача кортежей и словарей в функции
Для получения параметров, переданных функции, в виде кортежа или словаря, существу- ют специальные приставки «
*
» или «
**
» соответственно. Это особенно полезно в случа- ях, когда функция может принимать переменное число параметров.
>>>
def
powersum
(power,
*
args):
...
'''Возвращает сумму аргументов, возведённых в указанную степень.'''
...
total
=
0
...
for
i
in
args:
...
total
+=
pow
(i, power)
...
return
total
...
>>>
powersum(
2
,
3
,
4
)
25
>>>
powersum(
2
,
10
)
100
Поскольку перед переменной args указана приставка «
*
», все дополнительные аргу- менты, переданные функции, сохранятся в args в виде кортежа. В случае использова- ния приставки «
**
» все дополнительные параметры будут рассматриваться как пары ключ/значение в словаре.
18.6. Передача кортежей и словарей в функции
139
A Byte of Python (Russian), Версия 2.02 18.7 exec и eval
Функция exec служит для выполнения команд Python, содержащихся в строке или фай- ле, в отличие от самого текста программы. Например, во время выполнения программы можно сформировать строку, содержащую текст программы на Python, и запустить его при помощи exec
:
>>>
exec(
'print("Здравствуй, Мир!")'
)
Здравствуй, Мир!
Аналогично, функция eval позволяет вычислять корректные выражения Python, содер- жащиеся в строке. Вот простой пример.
>>>
eval
(
'2*3'
)
6 18.8 Оператор assert
Оператор assert существует для того, чтобы указать, что нечто является истиной. На- пример, если требуется гарантировать, что в списке будет хотя бы один элемент, и вы- звать ошибку, если это не так, то оператор assert идеально подойдёт для такой задачи.
Когда заявленное выражение ложно, вызывается ошибка
AssertionError
. Метод pop()
возвращает последний элемент списка, одновременно удаляя его оттуда.
>>>
mylist
=
[
'item'
]
>>>
assert len
(mylist)
>=
1
>>>
mylist pop()
'item'
>>>
mylist
[]
>>>
assert len
(mylist)
>=
1
Traceback (most recent call last):
File
""
, line
1
, in
AssertionError
Тем не менее, оператор assert следует использовать благоразумно. В большинстве слу- чаев гораздо лучше «отлавливать» исключения и либо решать соответствующую про- блему автоматически, либо выдавать пользователю сообщение об ошибке и завершать работу программы.
18.7. exec и eval
140
A Byte of Python (Russian), Версия 2.02 18.9 Функция repr
Функция repr используется для получения канонического строкового представления объекта. Любопытно, что в большинстве случаев eval(repr(object)) == object
>>>
i
=
[]
>>>
i append(
'item'
)
>>>
repr
(i)
"['item']"
>>>
eval
(
repr
(i))
['item']
>>>
eval
(
repr
(i))
==
i
True
По большому счёту, функция repr служит для получения печатаемого представления объекта. Определив метод
__repr__
в собственном классе, можно указать, что он будет возвращать по вызову функции repr
18.10 Управляющие последовательности
Попробуйте ответить на вопрос: Как указать строку, содержащую одинарную кавычку (
'
)?
Например, строку «
What's your name?
». Её ведь нельзя записать просто как «
'What's your name?'
», потому что тогда Python не сможет определить, где начало строки, и где конец. В таком случае придётся каким-то образом указать, что данная одинарная кавычка не обозначает конца строки. Это можно сделать при помощи так называемой управляю-
щей последовательности. Укажите одинарную кавычку как
\'
– через обратную косую черту. Теперь наша строка будет выглядеть так:
'What\'s your name?'
Другой способ записи такой специфической строки –
"What's your name?"
, т.е. с ис- пользованием двойных кавычек. Аналогично следует использовать управляющую после- довательность для вставки двойной кавычки в строку, ограниченную двойными кавычка- ми. Сама же обратная наклонная черта указывается управляющей последовательностью
\\
А как записать двустрочную строку? Один из вариантов нам уже знаком – заключить строку в тройные кавычки, как было показано
ранее
. Но есть и другой – использовать управляющую последовательность для символа перевода строки
\n
. Например: «
Это первая строка\nЭто вторая строка
». Полезно знать ещё одну управляющую после- довательность – табуляцию (
\t
). Управляющих последовательностей существует намного больше, но здесь упомянуты только наиболее важные.
Следует отметить, что одинарная наклонная черта в конце строки лишь указывает на то,
что продолжение идёт строкой ниже, но не вставляет перевода строки. Например:
18.9. Функция repr
141
A Byte of Python (Russian), Версия 2.02
"Это первое предложение.
\
Это второе предложение."
эквивалентно записи "Это первое предложение. Это второе предложение."
18.11 Необрабатываемые строки
Для записи строки, в которой не будет проводиться никакой специальной обработки, как,
например, управляющих последовательностей, перед строкой указывается приставка «
r
»
или «
R
»
1
. Например,
r"Перевод строки обозначается \n"
Замечание для пользователей регулярных выражений
Для работы с регулярными выражениями всегда используйте необрабатываемые строки.
В противном случае вас ждёт много возни с обратными косыми чёрточками. Например,
обратные ссылки можно обозначать как '\\1'
или r'\1'
18.12 Резюме
Итак, в настоящей главе мы рассмотрели некоторые дополнительные возможности
Python, хотя по-прежнему, не охватили всего. Тем не менее, к настоящему моменту мы уже прошли почти всё, что вам когда-либо понадобится использовать на практике. Этого вполне достаточно для начала работы над любыми программами.
Далее мы обсудим, как продолжать исследовать Python.
1
«r» – от англ. «raw» – «сырой, необработанный» (прим. перев.)
18.11. Необрабатываемые строки
142
Что дальше
Добросовестный читатель, дочитавший книгу до сих пор, а также много практиковав- шийся в написании программ, наверняка уже освоился с Python. И конечно, вы уже по- пробовали реализовать какие-нибудь собственные идеи на Python, чтобы потренировать- ся. Нет? Тогда стоит начать! Но в таком случае возникает вопрос: «Что же делать дальше?».
Я предлагаю вам справиться со следующей задачей.
Задача
Создайте собственную программу «Адресная книга», работающую из командной стро- ки и позволяющую просматривать, добавлять, изменять, удалять или искать контактные данные ваших знакомых. Кроме того, эта информация также должна сохраняться на дис- ке для последующего доступа.
Это достаточно простая задача, если думать о ней в терминах, которые мы до сих пор проходили. Если же вы всё-таки нуждаетесь в подсказке, как действовать, вот она.
Подсказка (не читать!)
Создайте класс для хранения персональных данных. Объекты визитных карточек храни- те в словаре, в котором имена контактов будут служить ключами. Для длительного хра- нения этих объектов на жёстком диске воспользуйтесь модулем pickle. Для добавления,
изменения или удаления контактов применяйте встроенные методы словаря.
Как только вы справитесь с этим, вы смело можете называться программистом на Python.
А теперь немедленно напишите мне письмо
;-). Это не обязательный шаг, но весьма ре- комендуемый. Также подумайте о покупке бумажной версии книги
, чтобы поддержать её дальнейшую разработку.
Если эта задачка показалась вам слишком лёгкой, попробуйте ещё одну:
143
A Byte of Python (Russian), Версия 2.02
Задача
Реализуйте команду replace
. Эта команда заменяет одну строку другой в списке передан- ных ей файлов.
Команда replace может быть любой желаемой сложности: от простой замены строк до поиска по шаблону (регулярному выражению).
А вот ещё некоторые возможные направления вашего дальнейшего путешествия по миру
Python:
19.1 Упражнения
На Stack Overflow есть неплохое обсуждение упражнений на Python, помогающих отто- чить ваше мастерство
19.2 Примеры программ
Лучший способ овладеть языком программирования – это писать много программ и чи- тать много программ:
•
Проект PLEAC
•
Хранилище кода Rosetta
•
Примеры для Python на java2s
•
Книга рецептов Python
– ценнейшая коллекция рецептов и подсказок, как решать те или иные проблемы при помощи Python. Обязательна к прочтению каждым про- граммистом на Python.
•
Модуль недели
– ещё один замечательный путеводитель по
стандартной библио-
теке Python
19.3 Вопросы и ответы
•
Официальные «Можно и нельзя» в Python
•
Официальные ЧаВо Python
•
Список НеЧасто задаваемых Вопросов от Norvig
•
Вопросы и ответы из интервью о Python
19.1. Упражнения
144
A Byte of Python (Russian), Версия 2.02
•
Вопросы на StackOverflow с пометкой «python»
19.4 Советы и рекомендации
•
Трюки и уловки Python
•
Сколачиваем программы при помощи Python
•
Очаровательный Python
– замечательная серия статей о Python Дэвида Мерца.
19.5 Учебники
•
Всеобъемлющий список учебников по Python от Awaretek
19.6 Видео
•
PyVideo
19.7 Обсуждение
Если вы застряли на какой-то проблеме в Python и не знаете, кого спросить, тогда список рассылки python-tutor подойдёт наилучшим образом.
Тем не менее, сначала проделайте всю домашнюю работу и попытайтесь решить пробле- му самостоятельно.
19.8 Новости
Если вас интересуют последние новости мира Python, отслеживайте их на официальной планете Python
19.4. Советы и рекомендации
145
A Byte of Python (Russian), Версия 2.02 19.9 Установка библиотек
В
Каталоге пакетов Python существует колоссальное количество открытых библиотек, ко- торые вы можете использовать в своих программах. Для их установки можно воспользо- ваться pip
19.10 Графические программы
Для создания собственной графической программы на Python понадобится какая-нибудь библиотека ГИП (графического интерфейса пользователя) со своими привязками к
Python. Привязки позволяют писать программу на Python, используя библиотеки, кото- рые сами по себе написаны на C, C++ или других языках.
Выбор ГИП для Python достаточно обширен:
• Kivy
http://kivy.org
• PyGTK
Это привязки Python к инструментарию GTK+, на основе которого построен
GNOME. У GTK+ есть много своих особенностей, но как только вы освоитесь, вы сможете создавать ГИП очень быстро. Что касается дизайнера графического интер- фейса Glade, то он просто незаменим. Документация же всё ещё требует некоторых улучшений. GTK+ хорошо работает в GNU/Linux, но его порт на Windows пока не закончен. При помощи GTK+ можно создавать как свободные, так и проприетарные программы. Для начала прочитайте
Учебник по PyGTK
• PyQt
Это привязки Python к инструментарию Qt, на основе которого построена KDE. Qt чрезвычайно прост в использовании, особенно благодаря Qt Designer и изумитель- ной документации Qt. PyQt бесплатно, если используется для создания свободных программ (с лицензией GPL). Для создания закрытых проприетарных программ вам придётся его купить. Начиная с Qt 4.5, разрешается создавать при помощи него не только GPL’ные программы. Для начала прочитайте краткое пособие по PyQt или
Книгу PyQt
• wxPython
Это привязки Python к инструментарию wxWidgets. wxPython не так прост в освое- нии, но зато он переносим и работает на GNU/Linux, Windows, Mac и даже на встраи- ваемых платформах. Многие среды разработки для wxPython, такие как
SPE (Stani’s
Python Editor)
и wxGlade включают дизайнеры графического интерфейса. При по- мощи wxPython можно создавать как свободные, так и проприетарные программы.
Для начала прочитайте учебник по wxPython
19.9. Установка библиотек
146
135
Дополнительно
К настоящему моменту мы уже рассмотрели большую часть того, что вам придётся ис- пользовать при работе с Python. В этой главе мы охватим некоторые дополнительные аспекты, которые помогут отшлифовать ваши знания.
18.1 Передача кортежей
Хотелось ли вам когда-нибудь, чтобы функция возвращала не один результат, а два? Это возможно. Всё, что для этого нужно, – использовать кортеж.
>>>
def
get_error_details
():
...
return
(
2
,
'описание ошибки No2'
)
...
>>>
errnum, errstr
=
get_error_details()
>>>
errnum
2
>>>
errstr
'описание ошибки No2'
Обратите внимание, что использование выражения «
a, b = <некоторое выражение>
»
интерпретирует результат как кортеж из двух значений.
Чтобы интерпретировать результат как «
(a, <всё остальное>)
», нужно просто поста- вить звёздочку, как это делалось для параметров функций:
>>>
a,
*
b
=
[
1
,
2
,
3
,
4
]
>>>
a
1
>>>
b
[2, 3, 4]
Это также подразумевает, что поменять местами два значения в Python быстрее всего можно так:
136
A Byte of Python (Russian), Версия 2.02
>>>
a
=
5
; b
=
8
>>>
a, b
=
b, a
>>>
a, b
(8, 5)
18.2 Специальные методы
Есть ряд методов, играющих особую роль для классов. Например,
__init__
и
__del__
Специальные методы служат для того, чтобы имитировать поведение встроенных типов данных. Например, всё, что потребуется для использования операции индексирования x[индекс]
применительно к своему классу (в таком виде, как это делалось для списков и кортежей), это реализовать метод
__getitem__()
. Кстати, именно этот метод Python использует для самого класса list
!
Некоторые полезные специальные методы перечислены в таблице ниже. Все другие ме- тоды можно посмотреть в документации
Имя
Описание
__init__(self, …)
Этот метод вызывается прямо перед тем, как вновь созданный объект возвращается для использования.
__del__(self)
Вызывается перед уничтожением объекта
__str__(self)
Вызывается при использовании функции print или str()
__lt__(self, other)
Вызывается, когда используется оператор «меньше» (<).
Существуют и аналогичные методы для всех операторов (+, >,
и т.д.)
__getitem__(self, key) Вызывается при использовании оператора индексирования x[индекс]
__len__(self)
Вызывается при обращении к встроенной функции len()
для объекта-последовательности.
18.3 Блоки в одно выражение
Мы неоднократно говорили, что каждый блок команд отделяется от других своим соб- ственным уровнем отступа. Однако, существует и исключение. Если блок команд содер- жит только одно выражение, его можно указывать в одной строке с условным оператором или, скажем, оператором цикла. Рассмотрим это на примере:
>>>
flag
=
True
>>>
if
flag:
(
'Да'
)
Да
18.2. Специальные методы
137
A Byte of Python (Russian), Версия 2.02
Обратите внимание, что единственный оператор расположен в той же строке, а не отдель- ным блоком. Этот способ может подкупить тем, что якобы «сокращает» программу, но я настоятельно рекомендую избегать его во всех случаях, кроме проверки ошибок. Прежде всего, потому что гораздо легче добавлять команды, когда уже есть необходимый уровень отступа.
18.4 Lambda-формы
Ключевое слово lambda используется для создания функций и возврата их значения во время выполнения программы.
lambda принимает параметр, за которым следует одно выражение, которое становится телом функции, а значение этого выражения возвраща- ется новой функцией.
Пример: (сохраните как lambda.py
)
points
=
[ {
'x'
:
2
,
'y'
:
3
}, {
'x'
:
4
,
'y'
:
1
} ]
points sort(key
=
lambda
i : i[
'y'
])
(points)
Вывод:
$ python3 lambda.py
[{'x': 4, 'y': 1}, {'x': 2, 'y': 3}]
Как это работает:
Обратите внимание на то, что метод sort класса list может принимать пара- метр key
, определяющий способ сортировки списка (обычно мы думаем толь- ко о сортировке по возрастанию или по убыванию). В данном случае мы хотим провести сортировку по собственному принципу, для чего нам необходимо написать соответствующую функцию. Но вместо того, чтобы создавать отдель- ный блок def для описания функции, которая будет использоваться только в этом месте, мы применяем лямбда-выражение.
18.5 Генераторы списков
Генераторы списков служат для создания новых списков на основе существующих. Пред- ставьте, что имеется список чисел, на основе которого требуется получить новый список,
состоящий из всех чисел, умноженных на 2, но только при условии, что само число боль- ше 2. Генераторы списков подходят для таких задач как нельзя лучше.
18.4. Lambda-формы
138
A Byte of Python (Russian), Версия 2.02
Пример: (сохраните как list_comprehension.py
)
listone
=
[
2
,
3
,
4
]
listtwo
=
[
2
*
i
for
i
in
listone
if
i
>
2
]
(listtwo)
Вывод:
$ python3 list_comprehension.py
[6, 8]
Как это работает:
В этом примере мы создаём новый список, указав операцию, которую необхо- димо произвести (
2 * i
), когда выполняется некоторое условие (
if i > 2
).
Обратите внимание, что исходный список при этом не изменяется.
Преимущество использования генераторов списков состоит в том, что это заметно сокра- щает объёмы стандартного кода, необходимого для циклической обработки каждого эле- мента списка и сохранения его в новом списке.
18.6 Передача кортежей и словарей в функции
Для получения параметров, переданных функции, в виде кортежа или словаря, существу- ют специальные приставки «
*
» или «
**
» соответственно. Это особенно полезно в случа- ях, когда функция может принимать переменное число параметров.
>>>
def
powersum
(power,
*
args):
...
'''Возвращает сумму аргументов, возведённых в указанную степень.'''
...
total
=
0
...
for
i
in
args:
...
total
+=
pow
(i, power)
...
return
total
...
>>>
powersum(
2
,
3
,
4
)
25
>>>
powersum(
2
,
10
)
100
Поскольку перед переменной args указана приставка «
*
», все дополнительные аргу- менты, переданные функции, сохранятся в args в виде кортежа. В случае использова- ния приставки «
**
» все дополнительные параметры будут рассматриваться как пары ключ/значение в словаре.
18.6. Передача кортежей и словарей в функции
139
A Byte of Python (Russian), Версия 2.02 18.7 exec и eval
Функция exec служит для выполнения команд Python, содержащихся в строке или фай- ле, в отличие от самого текста программы. Например, во время выполнения программы можно сформировать строку, содержащую текст программы на Python, и запустить его при помощи exec
:
>>>
exec(
'print("Здравствуй, Мир!")'
)
Здравствуй, Мир!
Аналогично, функция eval позволяет вычислять корректные выражения Python, содер- жащиеся в строке. Вот простой пример.
>>>
eval
(
'2*3'
)
6 18.8 Оператор assert
Оператор assert существует для того, чтобы указать, что нечто является истиной. На- пример, если требуется гарантировать, что в списке будет хотя бы один элемент, и вы- звать ошибку, если это не так, то оператор assert идеально подойдёт для такой задачи.
Когда заявленное выражение ложно, вызывается ошибка
AssertionError
. Метод pop()
возвращает последний элемент списка, одновременно удаляя его оттуда.
>>>
mylist
=
[
'item'
]
>>>
assert len
(mylist)
>=
1
>>>
mylist pop()
'item'
>>>
mylist
[]
>>>
assert len
(mylist)
>=
1
Traceback (most recent call last):
File
"
, line
1
, in
AssertionError
Тем не менее, оператор assert следует использовать благоразумно. В большинстве слу- чаев гораздо лучше «отлавливать» исключения и либо решать соответствующую про- блему автоматически, либо выдавать пользователю сообщение об ошибке и завершать работу программы.
18.7. exec и eval
140
A Byte of Python (Russian), Версия 2.02 18.9 Функция repr
Функция repr используется для получения канонического строкового представления объекта. Любопытно, что в большинстве случаев eval(repr(object)) == object
>>>
i
=
[]
>>>
i append(
'item'
)
>>>
repr
(i)
"['item']"
>>>
eval
(
repr
(i))
['item']
>>>
eval
(
repr
(i))
==
i
True
По большому счёту, функция repr служит для получения печатаемого представления объекта. Определив метод
__repr__
в собственном классе, можно указать, что он будет возвращать по вызову функции repr
18.10 Управляющие последовательности
Попробуйте ответить на вопрос: Как указать строку, содержащую одинарную кавычку (
'
)?
Например, строку «
What's your name?
». Её ведь нельзя записать просто как «
'What's your name?'
», потому что тогда Python не сможет определить, где начало строки, и где конец. В таком случае придётся каким-то образом указать, что данная одинарная кавычка не обозначает конца строки. Это можно сделать при помощи так называемой управляю-
щей последовательности. Укажите одинарную кавычку как
\'
– через обратную косую черту. Теперь наша строка будет выглядеть так:
'What\'s your name?'
Другой способ записи такой специфической строки –
"What's your name?"
, т.е. с ис- пользованием двойных кавычек. Аналогично следует использовать управляющую после- довательность для вставки двойной кавычки в строку, ограниченную двойными кавычка- ми. Сама же обратная наклонная черта указывается управляющей последовательностью
\\
А как записать двустрочную строку? Один из вариантов нам уже знаком – заключить строку в тройные кавычки, как было показано
ранее
. Но есть и другой – использовать управляющую последовательность для символа перевода строки
\n
. Например: «
Это первая строка\nЭто вторая строка
». Полезно знать ещё одну управляющую после- довательность – табуляцию (
\t
). Управляющих последовательностей существует намного больше, но здесь упомянуты только наиболее важные.
Следует отметить, что одинарная наклонная черта в конце строки лишь указывает на то,
что продолжение идёт строкой ниже, но не вставляет перевода строки. Например:
18.9. Функция repr
141
A Byte of Python (Russian), Версия 2.02
"Это первое предложение.
\
Это второе предложение."
эквивалентно записи "Это первое предложение. Это второе предложение."
18.11 Необрабатываемые строки
Для записи строки, в которой не будет проводиться никакой специальной обработки, как,
например, управляющих последовательностей, перед строкой указывается приставка «
r
»
или «
R
»
1
. Например,
r"Перевод строки обозначается \n"
Замечание для пользователей регулярных выражений
Для работы с регулярными выражениями всегда используйте необрабатываемые строки.
В противном случае вас ждёт много возни с обратными косыми чёрточками. Например,
обратные ссылки можно обозначать как '\\1'
или r'\1'
18.12 Резюме
Итак, в настоящей главе мы рассмотрели некоторые дополнительные возможности
Python, хотя по-прежнему, не охватили всего. Тем не менее, к настоящему моменту мы уже прошли почти всё, что вам когда-либо понадобится использовать на практике. Этого вполне достаточно для начала работы над любыми программами.
Далее мы обсудим, как продолжать исследовать Python.
1
«r» – от англ. «raw» – «сырой, необработанный» (прим. перев.)
18.11. Необрабатываемые строки
142
Что дальше
Добросовестный читатель, дочитавший книгу до сих пор, а также много практиковав- шийся в написании программ, наверняка уже освоился с Python. И конечно, вы уже по- пробовали реализовать какие-нибудь собственные идеи на Python, чтобы потренировать- ся. Нет? Тогда стоит начать! Но в таком случае возникает вопрос: «Что же делать дальше?».
Я предлагаю вам справиться со следующей задачей.
Задача
Создайте собственную программу «Адресная книга», работающую из командной стро- ки и позволяющую просматривать, добавлять, изменять, удалять или искать контактные данные ваших знакомых. Кроме того, эта информация также должна сохраняться на дис- ке для последующего доступа.
Это достаточно простая задача, если думать о ней в терминах, которые мы до сих пор проходили. Если же вы всё-таки нуждаетесь в подсказке, как действовать, вот она.
Подсказка (не читать!)
Создайте класс для хранения персональных данных. Объекты визитных карточек храни- те в словаре, в котором имена контактов будут служить ключами. Для длительного хра- нения этих объектов на жёстком диске воспользуйтесь модулем pickle. Для добавления,
изменения или удаления контактов применяйте встроенные методы словаря.
Как только вы справитесь с этим, вы смело можете называться программистом на Python.
А теперь немедленно напишите мне письмо
;-). Это не обязательный шаг, но весьма ре- комендуемый. Также подумайте о покупке бумажной версии книги
, чтобы поддержать её дальнейшую разработку.
Если эта задачка показалась вам слишком лёгкой, попробуйте ещё одну:
143
A Byte of Python (Russian), Версия 2.02
Задача
Реализуйте команду replace
. Эта команда заменяет одну строку другой в списке передан- ных ей файлов.
Команда replace может быть любой желаемой сложности: от простой замены строк до поиска по шаблону (регулярному выражению).
А вот ещё некоторые возможные направления вашего дальнейшего путешествия по миру
Python:
19.1 Упражнения
На Stack Overflow есть неплохое обсуждение упражнений на Python, помогающих отто- чить ваше мастерство
19.2 Примеры программ
Лучший способ овладеть языком программирования – это писать много программ и чи- тать много программ:
•
Проект PLEAC
•
Хранилище кода Rosetta
•
Примеры для Python на java2s
•
Книга рецептов Python
– ценнейшая коллекция рецептов и подсказок, как решать те или иные проблемы при помощи Python. Обязательна к прочтению каждым про- граммистом на Python.
•
Модуль недели
– ещё один замечательный путеводитель по
стандартной библио-
теке Python
19.3 Вопросы и ответы
•
Официальные «Можно и нельзя» в Python
•
Официальные ЧаВо Python
•
Список НеЧасто задаваемых Вопросов от Norvig
•
Вопросы и ответы из интервью о Python
19.1. Упражнения
144
A Byte of Python (Russian), Версия 2.02
•
Вопросы на StackOverflow с пометкой «python»
19.4 Советы и рекомендации
•
Трюки и уловки Python
•
Сколачиваем программы при помощи Python
•
Очаровательный Python
– замечательная серия статей о Python Дэвида Мерца.
19.5 Учебники
•
Всеобъемлющий список учебников по Python от Awaretek
19.6 Видео
•
PyVideo
19.7 Обсуждение
Если вы застряли на какой-то проблеме в Python и не знаете, кого спросить, тогда список рассылки python-tutor подойдёт наилучшим образом.
Тем не менее, сначала проделайте всю домашнюю работу и попытайтесь решить пробле- му самостоятельно.
19.8 Новости
Если вас интересуют последние новости мира Python, отслеживайте их на официальной планете Python
19.4. Советы и рекомендации
145
A Byte of Python (Russian), Версия 2.02 19.9 Установка библиотек
В
Каталоге пакетов Python существует колоссальное количество открытых библиотек, ко- торые вы можете использовать в своих программах. Для их установки можно воспользо- ваться pip
19.10 Графические программы
Для создания собственной графической программы на Python понадобится какая-нибудь библиотека ГИП (графического интерфейса пользователя) со своими привязками к
Python. Привязки позволяют писать программу на Python, используя библиотеки, кото- рые сами по себе написаны на C, C++ или других языках.
Выбор ГИП для Python достаточно обширен:
• Kivy
http://kivy.org
• PyGTK
Это привязки Python к инструментарию GTK+, на основе которого построен
GNOME. У GTK+ есть много своих особенностей, но как только вы освоитесь, вы сможете создавать ГИП очень быстро. Что касается дизайнера графического интер- фейса Glade, то он просто незаменим. Документация же всё ещё требует некоторых улучшений. GTK+ хорошо работает в GNU/Linux, но его порт на Windows пока не закончен. При помощи GTK+ можно создавать как свободные, так и проприетарные программы. Для начала прочитайте
Учебник по PyGTK
• PyQt
Это привязки Python к инструментарию Qt, на основе которого построена KDE. Qt чрезвычайно прост в использовании, особенно благодаря Qt Designer и изумитель- ной документации Qt. PyQt бесплатно, если используется для создания свободных программ (с лицензией GPL). Для создания закрытых проприетарных программ вам придётся его купить. Начиная с Qt 4.5, разрешается создавать при помощи него не только GPL’ные программы. Для начала прочитайте краткое пособие по PyQt или
Книгу PyQt
• wxPython
Это привязки Python к инструментарию wxWidgets. wxPython не так прост в освое- нии, но зато он переносим и работает на GNU/Linux, Windows, Mac и даже на встраи- ваемых платформах. Многие среды разработки для wxPython, такие как
SPE (Stani’s
Python Editor)
и wxGlade включают дизайнеры графического интерфейса. При по- мощи wxPython можно создавать как свободные, так и проприетарные программы.
Для начала прочитайте учебник по wxPython
19.9. Установка библиотек
146