Файл: Книга на вашем родном языке 6 2 Переводы 7 1 Доступные переводы переводы 7 3 Предисловие 16.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.01.2024
Просмотров: 240
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Как это работает:
Переменная zoo обозначает кортеж элементов. Как мы видим, функция len позволяет получить длину кортежа. Это также указывает на то, что кортеж является
последовательностью
Теперь мы перемещаем этих животных в новый зоопарк, поскольку старый зоопарк закрывается. Поэтому кортеж new_zoo содержит тех животных, ко- торые уже там, наряду с привезёнными из старого зоопарка. Возвращаясь к реальности, обратите внимание на то, что кортеж внутри кортежа не теряет своей индивидуальности.
12.3. Кортеж
88
A Byte of Python (Russian), Версия 2.02
Доступ к элементам кортежа осуществляется указанием позиции элемента,
заключённой в квадратные скобки – точно так же, как мы это делали для спис- ков. Это называется оператором индексирования. Доступ к третьему элементу в
new_zoo мы получаем, указывая new_zoo[2]
, а доступ к третьему элементу внутри третьего элемента в кортеже new_zoo
– указывая new_zoo[2][2]
. Это достаточно просто, как только вы поймёте принцип.
Скобки
Хотя скобки и не являются обязательными, я предпочитаю всегда указывать их, чтобы было очевидно, что это кортеж, особенно в двусмысленных случаях. Например,
print(1,
2,3)
и print( (1,2,3) )
делают разные вещи: первое выражение выводит три числа,
тогда как второе – кортеж, содержащий эти три числа.
Кортеж, содержащий 0 или 1 элемент
Пустой кортеж создаётся при помощи пустой пары скобок – «
myempty = ()
». Однако,
с кортежем из одного элемента не всё так просто. Его нужно указывать при помощи за- пятой после первого (и единственного) элемента, чтобы Python мог отличить кортеж от скобок, окружающих объект в выражении. Таким образом, чтобы получить кортеж, со- держащий элемент
2
, вам потребуется указать «
singleton = (2,)
».
Замечание для программистов на Perl
Список внутри списка не теряет своей индивидуальности, т.е. списки не развёртываются,
как в Perl. Это же относится к кортежу внутри кортежа, или кортежу внутри списка, или списку внутри кортежа и т.д. В Python все они рассматриваются как объекты, хранящиеся внутри другого объекта – только и всего.
12.4 Словарь
Словарь – это некий аналог адресной книги, в которой можно найти адрес или контакт- ную информацию о человеке, зная лишь его имя; т.е. некоторые ключи (имена) связаны со значениями (информацией). Заметьте, что ключ должен быть уникальным – вы ведь не сможете получить корректную информацию, если у вас записаны два человека с пол- ностью одинаковыми именами.
Обратите также внимание на то, что в словарях в качестве ключей могут использоваться только неизменяемые объекты (как строки), а в качестве значений можно использовать как неизменяемые, так и изменяемые объекты. Точнее говоря, в качестве ключей должны использоваться только простые объекты.
12.4. Словарь
89
A Byte of Python (Russian), Версия 2.02
Пары ключ-значение указываются в словаре следующим образом: «
d = {key1 :
value1, key2 : value2 }
». Обратите внимание, что ключ и значение разделяются двоеточием, а пары друг от друга отделяются запятыми, а затем всё это заключается в фигурные скобки.
Помните, что пары ключ-значение никоим образом не упорядочены в словаре. Если вам необходим некоторый порядок, вам придётся отдельно отсортировать словарь перед об- ращением к нему.
Словари являются экземплярами/объектами класса dict
Пример: (сохраните как using_dict.py
)
# 'ab' - сокращение от 'a'ddress'b'ook
ab
=
{
'Swaroop'
:
'swaroop@swaroopch.com'
,
'Larry'
:
'larry@wall.org'
,
'Matsumoto'
:
'matz@ruby-lang.org'
,
'Spammer'
:
'spammer@hotmail.com'
}
print
(
"Адрес Swaroop'а:"
, ab[
'Swaroop'
])
# Удаление пары ключ-значение
del
ab[
'Spammer'
]
print
(
'
\nВ адресной книге
{0}
контакта
\n'
format(
len
(ab)))
for
name, address
in
ab items():
print
(
'Контакт
{0}
с адресом
{1}
'
format(name, address))
# Добавление пары ключ-значение
ab[
'Guido'
]
=
'guido@python.org'
if
'Guido'
in
ab:
print
(
"
\nАдрес Guido:"
, ab[
'Guido'
])
Вывод:
$ python3 using_dict.py
Адрес Swaroop'а: swaroop@swaroopch.com
В адресной книге 3 контакта
Контакт Swaroop с адресом swaroop@swaroopch.com
Контакт Matsumoto с адресом matz@ruby-lang.org
Контакт Larry с адресом larry@wall.org
(продолжение на следующей странице)
12.4. Словарь
90
A Byte of Python (Russian), Версия 2.02
(продолжение с предыдущей страницы)
Адрес Guido: guido@python.org
Как это работает:
Мы создаём словарь ab
2
при помощи обозначений, описанных ранее. Затем мы обращаемся к парам ключ-значение, указывая ключ в операторе индек- сирования, которым мы пользовались для списков и кортежей. Как видите,
синтаксис прост.
Удалять пары ключ-значение можно при помощи нашего старого доброго оператора del
. Мы просто указываем имя словаря и оператор индексирования для удаляемого ключа, после чего передаём это оператору del
. Для этой опе- рации нет необходимости знать, какое значение соответствует данному клю- чу.
Далее мы обращаемся ко всем парам ключ-значение нашего словаря, исполь- зуя метод items
, который возвращает список кортежей, каждый из которых содержит пару элементов: ключ и значение. Мы получаем эту пару и при- сваиваем её значение переменным name и
address соответственно в цикле for..in
, а затем выводим эти значения на экран в блоке for.
Новые пары ключ-значение добавляются простым обращением к нужному ключу при помощи оператора индексирования и присваиванием ему неко- торого значения, как мы сделали для Guido в примере выше.
Проверить, существует ли пара ключ-значение, можно при помощи оператора in
Чтобы просмотреть список всех методов класса dict смотрите help(dict)
Ключевые Аргументы и Словари
К слову, если вы использовали ключевые аргументы в ваших функциях, вы уже исполь- зовали словари! Только подумайте: вы указали пару ключ-значение среди параметров функции при её определении, а когда обращаетесь к переменным внутри функции, то это, фактически, обращение по ключу к словарю (который в терминах разработчиков ком- пиляторов называется таблицей имён).
2
address book – англ. «адресная книга» (прим. перев.)
12.4. Словарь
91
A Byte of Python (Russian), Версия 2.02 12.5 Последовательности
Списки, кортежи и строки являются примерами последовательностей. Но что такое по- следовательности и что в них такого особенного?
Основные возможности – это проверка принадлежности (т.е. выражения «
in
» и «
not in
») и оператор индексирования, позволяющий получить напрямую некоторый эле- мент последовательности.
Все три типа последовательностей, упоминавшиеся выше (списки, кортежи и строки),
также предоставляют операцию получения вырезки, которая позволяет получить вырез- ку последовательности, т.е. её фрагмент.
Пример: (сохраните как seq.py
)
shoplist
=
[
'яблоки'
,
'манго'
,
'морковь'
,
'бананы'
]
name
=
'swaroop'
# Операция индексирования
print
(
'Элемент 0 -'
, shoplist[
0
])
print
(
'Элемент 1 -'
, shoplist[
1
])
print
(
'Элемент 2 -'
, shoplist[
2
])
print
(
'Элемент 3 -'
, shoplist[
3
])
print
(
'Элемент -1 -'
, shoplist[
-
1
])
print
(
'Элемент -2 -'
, shoplist[
-
2
])
print
(
'Символ 0 -'
, name[
0
])
# Вырезка из списка
print
(
'Элементы с 1 по 3:'
, shoplist[
1
:
3
])
print
(
'Элементы с 2 до конца:'
, shoplist[
2
:])
print
(
'Элементы с 1 по -1:'
, shoplist[
1
:
-
1
])
print
(
'Элементы от начала до конца:'
, shoplist[:])
# Вырезка из строки
print
(
'Символы с 1 по 3:'
, name[
1
:
3
])
print
(
'Символы с 2 до конца:'
, name[
2
:])
print
(
'Символы с 1 до -1:'
, name[
1
:
-
1
])
print
(
'Символы от начала до конца:'
, name[:])
Вывод:
$ python3 seq.py
Элемент 0 - яблоки
Элемент 1 - манго
Элемент 2 - морковь
Элемент 3 - бананы
Элемент -1 - бананы
(продолжение на следующей странице)
12.5. Последовательности
92
A Byte of Python (Russian), Версия 2.02
(продолжение с предыдущей страницы)
Элемент -2 - морковь
Символ 0 - s
Элементы с 1 по 3: ['манго', 'морковь']
Элементы с 2 до конца: ['морковь', 'бананы']
Элементы с 1 по -1: ['манго', 'морковь']
Элементы от начала до конца: ['яблоки', 'манго', 'морковь', 'бананы']
Символы с 1 по 3: wa
Символы с 2 до конца: aroop
Символы с 1 до -1: waroo
Символы от начала до конца: swaroop
Как это работает:
Прежде всего, мы видим, как использовать индексы для получения отдельных элементов последовательности. Это ещё называют приписыванием индекса. Ко- гда мы указываем число в квадратных скобках после последовательности, как показано выше, Python извлекает элемент, соответствующий указанной пози- ции в последовательности. Помните, что Python начинает отсчёт с 0. Поэтому shoplist[0]
извлекает первый элемент, а shoplist[3]
– четвёртый элемент последовательности shoplist
Индекс также может быть отрицательным числом. В этом случае позиция от- считывается от конца последовательности. Поэтому shoplist[-1]
указывает на последний элемент последовательности shoplist
, а shoplist[-2]
– на предпоследний.
Операция вырезки производится при помощи указания имени последова- тельности, за которым может следовать пара чисел, разделённых двоеточием и заключённых в квадратные скобки. Заметьте, как это похоже на операцию индексирования, которой мы пользовались до сих пор. Помните, что числа в скобках необязательны, тогда как двоеточие – обязательно.
Первое число (перед двоеточием) в операции вырезки указывает позицию, с которой вырезка должна начинаться, а второе число (после двоеточия) указы- вает, где вырезка должна закончиться. Если первое число не указано, Python начнёт вырезку с начала последовательности. Если пропущено второе число,
Python закончит вырезку у конца последовательности. Обратите внимание,
что полученная вырезка будет начинаться с указанной начальной позиции,
а заканчиваться прямо перед указанной конечной позицией, т.е. начальная позиция будет включена в вырезку, а конечная – нет.
Таким образом,
shoplist[1:3]
возвращает вырезку из последовательности,
начинающуюся с позиции 1, включает позицию 2, но останавливается на позиции 3, и поэтому возвращает вырезку из двух элементов. Аналогично,
shoplist[:]
возвращает копию всей последовательности.
Вырезка может осуществляться и с отрицательными значениями. Отрица-
12.5. Последовательности
93
A Byte of Python (Russian), Версия 2.02
тельные числа обозначают позицию с конца последовательности. Например,
shoplist[:-1]
вернёт вырезку из последовательности, исключающую по- следний элемент, но содержащую все остальные.
Кроме того, можно также указать третий аргумент для вырезки, который будет обозначать шаг вырезки (по умолчанию шаг вырезки равен 1):
>>>
shoplist
=
[
'яблоки'
,
'манго'
,
'морковь'
,
'бананы'
]
>>>
shoplist[::
1
]
['яблоки', 'манго', 'морковь', 'бананы']
>>>
shoplist[::
2
]
['яблоки', 'морковь']
>>>
shoplist[::
3
]
['яблоки', 'бананы']
>>>
shoplist[::
-
1
]
['бананы', 'морковь', 'манго', 'яблоки']
Обратите внимание на то, что когда шаг равен 2, мы получаем элементы, на- ходящиеся на позициях 0, 2, … Когда шаг равен 3, мы получаем элементы с позиций 0, 3, … и т.д.
Попробуйте разные комбинации параметров вырезки, используя интерактивную оболоч- ку интерпретатора Python, т.е. его командную строку, чтобы сразу видеть результат. По- следовательности замечательны тем, что они дают возможность обращаться к кортежам,
спискам и строкам одним и тем же способом!
12.6 Множество
Множества – это неупорядоченные наборы простых объектов. Они необходимы тогда, ко- гда присутствие объекта в наборе важнее порядка или того, сколько раз данный объект там встречается.
Используя множества, можно осуществлять проверку принадлежности, определять, яв- ляется ли данное множество подмножеством другого множества, находить пересечения множеств и так далее.
>>>
bri
=
set
([
'Бразилия'
,
'Россия'
,
'Индия'
])
>>>
'Индия'
in
bri
True
>>>
'США'
in
bri
False
>>>
bric
=
bri copy()
>>>
bric add(
'Китай'
)
>>>
bric issuperset(bri)
True
(продолжение на следующей странице)
12.6. Множество
94
A Byte of Python (Russian), Версия 2.02
(продолжение с предыдущей страницы)
>>>
bri remove(
'Россия'
)
>>>
bri
&
bric
# OR bri.intersection(bric)
{'Бразилия', 'Индия'}
Как это работает:
Этот пример достаточно нагляден, так как использует основы теории мно- жеств из школьного курса математики.
12.7 Ссылки
Когда мы создаём объект и присваиваем его переменной, переменная только ссылается
на объект, а не представляет собой этот объект! То есть имя переменной указывает на ту часть памяти компьютера, где хранится объект. Это называется привязкой имени к объекту.
Обычно вам не следует об этом беспокоиться, однако есть некоторый неочевидный эф- фект, о котором нужно помнить:
Пример: (сохраните как reference.py
)
print
(
'Простое присваивание'
)
shoplist
=
[
'яблоки'
,
'манго'
,
'морковь'
,
'бананы'
]
mylist
=
shoplist
# mylist - лишь ещё одно имя, указывающее на тот же объект!
del
shoplist[
0
]
# Я сделал первую покупку, поэтому удаляю её из списка
print
(
'shoplist:'
, shoplist)
print
(
'mylist:'
, mylist)
# Обратите внимание, что и shoplist, и mylist выводят один и тот же список
# без пункта "яблоко", подтверждая тем самым, что они указывают на один
# объект.
print
(
'Копирование при помощи полной вырезки'
)
mylist
=
shoplist[:]
# создаём копию путём полной вырезки
del
mylist[
0
]
# удаляем первый элемент
print
(
'shoplist:'
, shoplist)
print
(
'mylist:'
, mylist)
# Обратите внимание, что теперь списки разные
Вывод:_12.7._Ссылки'>Вывод:
12.7. Ссылки
95
A Byte of Python (Russian), Версия 2.02
$ python3 reference.py
Простое присваивание shoplist: ['манго', 'морковь', 'бананы']
mylist: ['манго', 'морковь', 'бананы']
Копирование при помощи полной вырезки shoplist: ['манго', 'морковь', 'бананы']
mylist: ['морковь', 'бананы']
Как это работает:
Большая часть объяснения содержится в комментариях.
Помните, что если вам нужно сделать копию списка или подобной последо- вательности, или другого сложного объекта (не такого простого объекта, как целое число), вам следует воспользоваться операцией вырезки. Если вы про- сто присвоите имя переменной другому имени, оба они будут ссылаться на один и тот же объект, а это может привести к проблемам, если вы не осторож- ны.
12.8 Ещё о строках
Мы уже детально обсуждали строки ранее. Что же ещё можно о них узнать? Что ж, вы знали, например, что строки также являются объектами и имеют методы, при помощи которых можно делать практически всё: от проверки части строки до удаления краевых пробелов?
Все строки, используемые вами в программах, являются объектами класса str
. Некоторые полезные методы этого класса продемонстрированы на примере ниже. Чтобы посмотреть весь список методов, выполните help(str)
Пример: (сохраните как str_methods.py
)
name
=
'Swaroop'
# Это объект строки
if
name startswith(
'Swa'
):
print
(
'Да, строка начинается на "Swa"'
)
if
'a'
in
name:
print
(
'Да, она содержит строку "a"'
)
if
name find(
'war'
)
!= -
1
:
print
(
'Да, она содержит строку "war"'
)
delimiter
=
'_*_'
(продолжение на следующей странице)
12.8. Ещё о строках
96
A Byte of Python (Russian), Версия 2.02
(продолжение с предыдущей страницы)
mylist
=
[
'Бразилия'
,
'Россия'
,
'Индия'
,
'Китай'
]
print
(delimiter join(mylist))
Вывод:
$ python3 str_methods.py
Да, строка начинается на "Swa"
Да, она содержит строку "a"
Да, она содержит строку "war"
Бразилия_*_Россия_*_Индия_*_Китай
Как это работает:
Здесь мы видим сразу несколько методов строк в действии. Метод startswith служит для того, чтобы определять, начинается ли строка с некоторой заданной подстроки. Опе- ратор in используется для проверки, является ли некоторая строка частью данной строки.
Метод find используется для определения позиции данной подстроки в строке;
find воз- вращает -1, если подстрока не обнаружена. В классе str также имеется отличный метод для объединения (
join
)
3
элементов последовательности с указанной строкой в качестве разделителя между элементами, возвращающий большую строку, сгенерированную та- ким образом.
12.9 Резюме
Мы детально рассмотрели различные встроенные структуры данных Python. Эти струк- туры данных будут крайне важны для написания программ существенного размера.
Теперь, когда мы накопили достаточно базовых знаний о Python, далее посмотрим, как проектировать и писать настоящую программу на Python.
3
join – англ. «объединять» (прим.перев.)
Переменная zoo обозначает кортеж элементов. Как мы видим, функция len позволяет получить длину кортежа. Это также указывает на то, что кортеж является
последовательностью
Теперь мы перемещаем этих животных в новый зоопарк, поскольку старый зоопарк закрывается. Поэтому кортеж new_zoo содержит тех животных, ко- торые уже там, наряду с привезёнными из старого зоопарка. Возвращаясь к реальности, обратите внимание на то, что кортеж внутри кортежа не теряет своей индивидуальности.
12.3. Кортеж
88
A Byte of Python (Russian), Версия 2.02
Доступ к элементам кортежа осуществляется указанием позиции элемента,
заключённой в квадратные скобки – точно так же, как мы это делали для спис- ков. Это называется оператором индексирования. Доступ к третьему элементу в
new_zoo мы получаем, указывая new_zoo[2]
, а доступ к третьему элементу внутри третьего элемента в кортеже new_zoo
– указывая new_zoo[2][2]
. Это достаточно просто, как только вы поймёте принцип.
Скобки
Хотя скобки и не являются обязательными, я предпочитаю всегда указывать их, чтобы было очевидно, что это кортеж, особенно в двусмысленных случаях. Например,
print(1,
2,3)
и print( (1,2,3) )
делают разные вещи: первое выражение выводит три числа,
тогда как второе – кортеж, содержащий эти три числа.
Кортеж, содержащий 0 или 1 элемент
Пустой кортеж создаётся при помощи пустой пары скобок – «
myempty = ()
». Однако,
с кортежем из одного элемента не всё так просто. Его нужно указывать при помощи за- пятой после первого (и единственного) элемента, чтобы Python мог отличить кортеж от скобок, окружающих объект в выражении. Таким образом, чтобы получить кортеж, со- держащий элемент
2
, вам потребуется указать «
singleton = (2,)
».
Замечание для программистов на Perl
Список внутри списка не теряет своей индивидуальности, т.е. списки не развёртываются,
как в Perl. Это же относится к кортежу внутри кортежа, или кортежу внутри списка, или списку внутри кортежа и т.д. В Python все они рассматриваются как объекты, хранящиеся внутри другого объекта – только и всего.
12.4 Словарь
Словарь – это некий аналог адресной книги, в которой можно найти адрес или контакт- ную информацию о человеке, зная лишь его имя; т.е. некоторые ключи (имена) связаны со значениями (информацией). Заметьте, что ключ должен быть уникальным – вы ведь не сможете получить корректную информацию, если у вас записаны два человека с пол- ностью одинаковыми именами.
Обратите также внимание на то, что в словарях в качестве ключей могут использоваться только неизменяемые объекты (как строки), а в качестве значений можно использовать как неизменяемые, так и изменяемые объекты. Точнее говоря, в качестве ключей должны использоваться только простые объекты.
12.4. Словарь
89
A Byte of Python (Russian), Версия 2.02
Пары ключ-значение указываются в словаре следующим образом: «
d = {key1 :
value1, key2 : value2 }
». Обратите внимание, что ключ и значение разделяются двоеточием, а пары друг от друга отделяются запятыми, а затем всё это заключается в фигурные скобки.
Помните, что пары ключ-значение никоим образом не упорядочены в словаре. Если вам необходим некоторый порядок, вам придётся отдельно отсортировать словарь перед об- ращением к нему.
Словари являются экземплярами/объектами класса dict
Пример: (сохраните как using_dict.py
)
# 'ab' - сокращение от 'a'ddress'b'ook
ab
=
{
'Swaroop'
:
'swaroop@swaroopch.com'
,
'Larry'
:
'larry@wall.org'
,
'Matsumoto'
:
'matz@ruby-lang.org'
,
'Spammer'
:
'spammer@hotmail.com'
}
(
"Адрес Swaroop'а:"
, ab[
'Swaroop'
])
# Удаление пары ключ-значение
del
ab[
'Spammer'
]
(
'
\nВ адресной книге
{0}
контакта
\n'
format(
len
(ab)))
for
name, address
in
ab items():
(
'Контакт
{0}
с адресом
{1}
'
format(name, address))
# Добавление пары ключ-значение
ab[
'Guido'
]
=
'guido@python.org'
if
'Guido'
in
ab:
(
"
\nАдрес Guido:"
, ab[
'Guido'
])
Вывод:
$ python3 using_dict.py
Адрес Swaroop'а: swaroop@swaroopch.com
В адресной книге 3 контакта
Контакт Swaroop с адресом swaroop@swaroopch.com
Контакт Matsumoto с адресом matz@ruby-lang.org
Контакт Larry с адресом larry@wall.org
(продолжение на следующей странице)
12.4. Словарь
90
A Byte of Python (Russian), Версия 2.02
(продолжение с предыдущей страницы)
Адрес Guido: guido@python.org
Как это работает:
Мы создаём словарь ab
2
при помощи обозначений, описанных ранее. Затем мы обращаемся к парам ключ-значение, указывая ключ в операторе индек- сирования, которым мы пользовались для списков и кортежей. Как видите,
синтаксис прост.
Удалять пары ключ-значение можно при помощи нашего старого доброго оператора del
. Мы просто указываем имя словаря и оператор индексирования для удаляемого ключа, после чего передаём это оператору del
. Для этой опе- рации нет необходимости знать, какое значение соответствует данному клю- чу.
Далее мы обращаемся ко всем парам ключ-значение нашего словаря, исполь- зуя метод items
, который возвращает список кортежей, каждый из которых содержит пару элементов: ключ и значение. Мы получаем эту пару и при- сваиваем её значение переменным name и
address соответственно в цикле for..in
, а затем выводим эти значения на экран в блоке for.
Новые пары ключ-значение добавляются простым обращением к нужному ключу при помощи оператора индексирования и присваиванием ему неко- торого значения, как мы сделали для Guido в примере выше.
Проверить, существует ли пара ключ-значение, можно при помощи оператора in
Чтобы просмотреть список всех методов класса dict смотрите help(dict)
Ключевые Аргументы и Словари
К слову, если вы использовали ключевые аргументы в ваших функциях, вы уже исполь- зовали словари! Только подумайте: вы указали пару ключ-значение среди параметров функции при её определении, а когда обращаетесь к переменным внутри функции, то это, фактически, обращение по ключу к словарю (который в терминах разработчиков ком- пиляторов называется таблицей имён).
2
address book – англ. «адресная книга» (прим. перев.)
12.4. Словарь
91
A Byte of Python (Russian), Версия 2.02 12.5 Последовательности
Списки, кортежи и строки являются примерами последовательностей. Но что такое по- следовательности и что в них такого особенного?
Основные возможности – это проверка принадлежности (т.е. выражения «
in
» и «
not in
») и оператор индексирования, позволяющий получить напрямую некоторый эле- мент последовательности.
Все три типа последовательностей, упоминавшиеся выше (списки, кортежи и строки),
также предоставляют операцию получения вырезки, которая позволяет получить вырез- ку последовательности, т.е. её фрагмент.
Пример: (сохраните как seq.py
)
shoplist
=
[
'яблоки'
,
'манго'
,
'морковь'
,
'бананы'
]
name
=
'swaroop'
# Операция индексирования
(
'Элемент 0 -'
, shoplist[
0
])
(
'Элемент 1 -'
, shoplist[
1
])
(
'Элемент 2 -'
, shoplist[
2
])
(
'Элемент 3 -'
, shoplist[
3
])
(
'Элемент -1 -'
, shoplist[
-
1
])
(
'Элемент -2 -'
, shoplist[
-
2
])
(
'Символ 0 -'
, name[
0
])
# Вырезка из списка
(
'Элементы с 1 по 3:'
, shoplist[
1
:
3
])
(
'Элементы с 2 до конца:'
, shoplist[
2
:])
(
'Элементы с 1 по -1:'
, shoplist[
1
:
-
1
])
(
'Элементы от начала до конца:'
, shoplist[:])
# Вырезка из строки
(
'Символы с 1 по 3:'
, name[
1
:
3
])
(
'Символы с 2 до конца:'
, name[
2
:])
(
'Символы с 1 до -1:'
, name[
1
:
-
1
])
(
'Символы от начала до конца:'
, name[:])
Вывод:
$ python3 seq.py
Элемент 0 - яблоки
Элемент 1 - манго
Элемент 2 - морковь
Элемент 3 - бананы
Элемент -1 - бананы
(продолжение на следующей странице)
12.5. Последовательности
92
A Byte of Python (Russian), Версия 2.02
(продолжение с предыдущей страницы)
Элемент -2 - морковь
Символ 0 - s
Элементы с 1 по 3: ['манго', 'морковь']
Элементы с 2 до конца: ['морковь', 'бананы']
Элементы с 1 по -1: ['манго', 'морковь']
Элементы от начала до конца: ['яблоки', 'манго', 'морковь', 'бананы']
Символы с 1 по 3: wa
Символы с 2 до конца: aroop
Символы с 1 до -1: waroo
Символы от начала до конца: swaroop
Как это работает:
Прежде всего, мы видим, как использовать индексы для получения отдельных элементов последовательности. Это ещё называют приписыванием индекса. Ко- гда мы указываем число в квадратных скобках после последовательности, как показано выше, Python извлекает элемент, соответствующий указанной пози- ции в последовательности. Помните, что Python начинает отсчёт с 0. Поэтому shoplist[0]
извлекает первый элемент, а shoplist[3]
– четвёртый элемент последовательности shoplist
Индекс также может быть отрицательным числом. В этом случае позиция от- считывается от конца последовательности. Поэтому shoplist[-1]
указывает на последний элемент последовательности shoplist
, а shoplist[-2]
– на предпоследний.
Операция вырезки производится при помощи указания имени последова- тельности, за которым может следовать пара чисел, разделённых двоеточием и заключённых в квадратные скобки. Заметьте, как это похоже на операцию индексирования, которой мы пользовались до сих пор. Помните, что числа в скобках необязательны, тогда как двоеточие – обязательно.
Первое число (перед двоеточием) в операции вырезки указывает позицию, с которой вырезка должна начинаться, а второе число (после двоеточия) указы- вает, где вырезка должна закончиться. Если первое число не указано, Python начнёт вырезку с начала последовательности. Если пропущено второе число,
Python закончит вырезку у конца последовательности. Обратите внимание,
что полученная вырезка будет начинаться с указанной начальной позиции,
а заканчиваться прямо перед указанной конечной позицией, т.е. начальная позиция будет включена в вырезку, а конечная – нет.
Таким образом,
shoplist[1:3]
возвращает вырезку из последовательности,
начинающуюся с позиции 1, включает позицию 2, но останавливается на позиции 3, и поэтому возвращает вырезку из двух элементов. Аналогично,
shoplist[:]
возвращает копию всей последовательности.
Вырезка может осуществляться и с отрицательными значениями. Отрица-
12.5. Последовательности
93
A Byte of Python (Russian), Версия 2.02
тельные числа обозначают позицию с конца последовательности. Например,
shoplist[:-1]
вернёт вырезку из последовательности, исключающую по- следний элемент, но содержащую все остальные.
Кроме того, можно также указать третий аргумент для вырезки, который будет обозначать шаг вырезки (по умолчанию шаг вырезки равен 1):
>>>
shoplist
=
[
'яблоки'
,
'манго'
,
'морковь'
,
'бананы'
]
>>>
shoplist[::
1
]
['яблоки', 'манго', 'морковь', 'бананы']
>>>
shoplist[::
2
]
['яблоки', 'морковь']
>>>
shoplist[::
3
]
['яблоки', 'бананы']
>>>
shoplist[::
-
1
]
['бананы', 'морковь', 'манго', 'яблоки']
Обратите внимание на то, что когда шаг равен 2, мы получаем элементы, на- ходящиеся на позициях 0, 2, … Когда шаг равен 3, мы получаем элементы с позиций 0, 3, … и т.д.
Попробуйте разные комбинации параметров вырезки, используя интерактивную оболоч- ку интерпретатора Python, т.е. его командную строку, чтобы сразу видеть результат. По- следовательности замечательны тем, что они дают возможность обращаться к кортежам,
спискам и строкам одним и тем же способом!
12.6 Множество
Множества – это неупорядоченные наборы простых объектов. Они необходимы тогда, ко- гда присутствие объекта в наборе важнее порядка или того, сколько раз данный объект там встречается.
Используя множества, можно осуществлять проверку принадлежности, определять, яв- ляется ли данное множество подмножеством другого множества, находить пересечения множеств и так далее.
>>>
bri
=
set
([
'Бразилия'
,
'Россия'
,
'Индия'
])
>>>
'Индия'
in
bri
True
>>>
'США'
in
bri
False
>>>
bric
=
bri copy()
>>>
bric add(
'Китай'
)
>>>
bric issuperset(bri)
True
(продолжение на следующей странице)
12.6. Множество
94
A Byte of Python (Russian), Версия 2.02
(продолжение с предыдущей страницы)
>>>
bri remove(
'Россия'
)
>>>
bri
&
bric
# OR bri.intersection(bric)
{'Бразилия', 'Индия'}
Как это работает:
Этот пример достаточно нагляден, так как использует основы теории мно- жеств из школьного курса математики.
12.7 Ссылки
Когда мы создаём объект и присваиваем его переменной, переменная только ссылается
на объект, а не представляет собой этот объект! То есть имя переменной указывает на ту часть памяти компьютера, где хранится объект. Это называется привязкой имени к объекту.
Обычно вам не следует об этом беспокоиться, однако есть некоторый неочевидный эф- фект, о котором нужно помнить:
Пример: (сохраните как reference.py
)
(
'Простое присваивание'
)
shoplist
=
[
'яблоки'
,
'манго'
,
'морковь'
,
'бананы'
]
mylist
=
shoplist
# mylist - лишь ещё одно имя, указывающее на тот же объект!
del
shoplist[
0
]
# Я сделал первую покупку, поэтому удаляю её из списка
(
'shoplist:'
, shoplist)
(
'mylist:'
, mylist)
# Обратите внимание, что и shoplist, и mylist выводят один и тот же список
# без пункта "яблоко", подтверждая тем самым, что они указывают на один
# объект.
(
'Копирование при помощи полной вырезки'
)
mylist
=
shoplist[:]
# создаём копию путём полной вырезки
del
mylist[
0
]
# удаляем первый элемент
(
'shoplist:'
, shoplist)
(
'mylist:'
, mylist)
# Обратите внимание, что теперь списки разные
Вывод:_12.7._Ссылки'>Вывод:
12.7. Ссылки
95
A Byte of Python (Russian), Версия 2.02
$ python3 reference.py
Простое присваивание shoplist: ['манго', 'морковь', 'бананы']
mylist: ['манго', 'морковь', 'бананы']
Копирование при помощи полной вырезки shoplist: ['манго', 'морковь', 'бананы']
mylist: ['морковь', 'бананы']
Как это работает:
Большая часть объяснения содержится в комментариях.
Помните, что если вам нужно сделать копию списка или подобной последо- вательности, или другого сложного объекта (не такого простого объекта, как целое число), вам следует воспользоваться операцией вырезки. Если вы про- сто присвоите имя переменной другому имени, оба они будут ссылаться на один и тот же объект, а это может привести к проблемам, если вы не осторож- ны.
12.8 Ещё о строках
Мы уже детально обсуждали строки ранее. Что же ещё можно о них узнать? Что ж, вы знали, например, что строки также являются объектами и имеют методы, при помощи которых можно делать практически всё: от проверки части строки до удаления краевых пробелов?
Все строки, используемые вами в программах, являются объектами класса str
. Некоторые полезные методы этого класса продемонстрированы на примере ниже. Чтобы посмотреть весь список методов, выполните help(str)
Пример: (сохраните как str_methods.py
)
name
=
'Swaroop'
# Это объект строки
if
name startswith(
'Swa'
):
(
'Да, строка начинается на "Swa"'
)
if
'a'
in
name:
(
'Да, она содержит строку "a"'
)
if
name find(
'war'
)
!= -
1
:
(
'Да, она содержит строку "war"'
)
delimiter
=
'_*_'
(продолжение на следующей странице)
12.8. Ещё о строках
96
A Byte of Python (Russian), Версия 2.02
(продолжение с предыдущей страницы)
mylist
=
[
'Бразилия'
,
'Россия'
,
'Индия'
,
'Китай'
]
(delimiter join(mylist))
Вывод:
$ python3 str_methods.py
Да, строка начинается на "Swa"
Да, она содержит строку "a"
Да, она содержит строку "war"
Бразилия_*_Россия_*_Индия_*_Китай
Как это работает:
Здесь мы видим сразу несколько методов строк в действии. Метод startswith служит для того, чтобы определять, начинается ли строка с некоторой заданной подстроки. Опе- ратор in используется для проверки, является ли некоторая строка частью данной строки.
Метод find используется для определения позиции данной подстроки в строке;
find воз- вращает -1, если подстрока не обнаружена. В классе str также имеется отличный метод для объединения (
join
)
3
элементов последовательности с указанной строкой в качестве разделителя между элементами, возвращающий большую строку, сгенерированную та- ким образом.
12.9 Резюме
Мы детально рассмотрели различные встроенные структуры данных Python. Эти струк- туры данных будут крайне важны для написания программ существенного размера.
Теперь, когда мы накопили достаточно базовых знаний о Python, далее посмотрим, как проектировать и писать настоящую программу на Python.
3
join – англ. «объединять» (прим.перев.)
1 ... 4 5 6 7 8 9 10 11 ... 14