Глава 5. Контейнеры
Где дурак удивленно размышляет, мудрец спрашивает.
Бенджамин Дизраэли
В главе 3 вы узнали, как сохранять объекты в переменных, в этой главе вы узнае- те, как сохранять их в контейнерах . Контейнеры подобны картотекам — они ор- ганизовывают хранение ваших данных определенным образом. Вы изучите три наиболее часто используемых контейнера: списки, кортежи и словари.
59
Введение в программирование
Методы
В главе 4 вы изучили функции. В Python есть схожее понятие — методы . Мето- ды — это функции, тесно связанные с определенным типом данных. Они могут выполнять код и возвращать результат как функции, но, в отличие от последних, методы вызываются с объектами. Вы также можете передавать им параметры.
Ниже приведен пример вызова методов upper и replace у строки.
Python_ex114.py
1
"".upper()
>> ''
Python_ex115.py
1
"".replace("", "@")
>> '@'
Боль ше информации о методах вы найдете в части II.
Списки
Список — это контейнер , хранящий объекты в определенном порядке.
Для представления списков используются квадратные скобки. Создать спи- сок можно двумя способами. Во-первых, пустой список создается при помощи функции list.
Python_ex116.py
1
fruit
= list()
2
fruit
>> []
Или можно просто использовать квадратные скобки.
Python_ex117.py
1
fruit
= []
2
fruit
>> []
список hello
60
Часть I
Вы можете создавать списки сразу с элементами в них, используя синтаксис
[]
и помещая внутрь скобок каждый желаемый элемент через запятую.
Python_ex118.py
1
fruit = ["Q ", " ", ""]
2
fruit
>> ['Q ', ' ', '']
В вашем списке три элемента: "Q ", " " и "". Спи- ски хранят элементы в определенном порядке. Если только вы не измените по- рядок списка, "Q " всегда будет первым элементом, " " — вто- рым и "" — третьим. "Q " представляет собой начало списка, а ""
— конец. Добавление в список нового элемента осуществляется с по- мощью метода append
Python_ex119.py
1
fruit
= ["Q ", " ", ""]
2
fruit.append(" ")
3
fruit.append(" ")
4
fruit
>> ['Q ', ' ', '', ' ', ' ']
Каждый объект, который вы передали методу append, теперь является эле- ментом в вашем списке. Метод append всегда добавляет новый элемент в конец списка.
В списках можно хранить любой тип данных, не только строки.
Python_ex120.py
1
random
= []
2
random.append(
True
)
3
random.append(100)
4
random.append(1.1)
5
random.append("")
6
random
>> [True, 100, 1.1, '']
Строки, списки и кортежи поддерживают итерирование (программа может их перебирать, значение за значением), то есть к каждому их элементу можно получить доступ через цикл — такие объекты называются итерируемыми . Каж- дый элемент в итерируемом объекте имеет индекс — число, представляющее по- зицию элемента в этом объекте. Индекс первого элемента в списке — 0, а не 1.
В следующем примере элемент "Q " записан в списке с индексом 0,
" "
— с индексом 1, а "" — с индексом 2.
61
Введение в программирование
Python_ex121.py
1
fruit
= ["Q ", " ", ""]
Вы можете обратиться к элементу при помощи его индекса, используя син- таксис _ [ ].
Python_ex122.py
1
fruit
= ["Q ", " ", ""]
2
fruit[0]
3
fruit[1]
4
fruit[2]
>> 'Q '
>> ' '
>> ''
Если вы попытаетесь получить доступ к несуществующему индексу, Python сгенерирует исключение .
Python_ex123.py
1
colors
= [" ", "B ", "&"]
2
colors[4]
>> IndexError: list index out of range
Списки изменяемы . Когда контейнер является изменяемым, это значит, что вы можете добавлять в него объекты или удалять их. Изменить объект в списке можно, присвоив его индекс новому объекту.
Python_ex124.py
1
colors
= [" ", "B ", "&"]
2
colors
3
colors[2]
= " "
4
colors
>> [' ', 'B
', '&']
>> [' ', 'B ', ' ']
С помощью метода pop можно удалить последний элемент в списке.
Python_ex125.py
1
colors
= [" ", "B ", "&"]
2
colors
3
item
= colors.pop()
4
item
5
colors
62
Часть I
>> [' ', 'B ', '&']
>> '&'
>> [' ', 'B ']
Нельзя использовать pop с пустым списком. В этом случае Python сгенериру- ет исключение.
При помощи оператора сложения можно соединять два списка.
Python_ex126.py
1
colors1
= [" ", "B ", "&"]
2
colors2
= [" &", " B ", " "]
3
colors1
+ colors2
>>
[' ', 'B ', '&', ' &', ' B ',
' ']
Проверить, есть ли элемент в списке, можно с помощью ключевого слова in.
Python_ex127.py
1
colors
= [" ", "B ", "&"]
2
"B "
in colors
>> True
Для проверки отсутствия элемента в списке используйте ключевое слово not.
Python_ex128.py
1
colors
= [" ", "B ", "&"]
2
" "
not in colors
>> True
С помощью функции len можно узнать длину списка, то есть количе ство его элементов.
Python_ex129.py
1
len(colors)
>> 3
Ниже приведен пример использования списка на практике.
Python_ex130.py
1
colors
= [" ",
2
" &",
3
"B "]
63Введение в программирование
4
guess
= input("| Y:")
5
if guess
in colors:
6
print(" !")
7
else:
8
print("$ ! X.")
>> | Y:
Список colors содержит различные строки, представляющие цвета. При помощи встроенной функции input программа предлагает пользователю уга- дать цвет и сохраняет его ответ в переменной. Если этот ответ содержится в спи- ске colors, программа сообщает пользователю, что его догадка была верной.
В противном с лучае, программа предлагает попытаться угадать еще раз.
КортежиКортеж — это контейнер , хранящий объекты в определенном порядке. В отли- чие от списков, кортежи
неизменяемы , то есть их содержимое нельзя изменить.
Как только вы создали кортеж, значение какого-либо его элемента уже нельзя из- менить, как нельзя добавлять и удалять элементы. Кортежи объявляются с по- мощью круглых скобок . Элементы в кортеже должны быть разделены запятыми.
Для создания кортежей используют один из двух вариантов синтаксиса . Первый:
Python_ex131.py1
my_tuple
= tuple()
2
my_tuple
>> ()
Второй:
Python_ex132.py1
my_tuple
= ()
2
my_tuple
>> ()
Чтобы добавить в кортеж новые объекты,
создайте его вторым способом, указав через запятую каждый желаемый элемент.
Python_ex133.py1
rndm
= ("V. & ", 1958,
True
)
2
rndm
>> ('V. & ', 1958, True)
64
Часть I
Даже если кортеж содержит только один элемент, после этого элемента все равно нужно поставить запятую. Таким образом Python отличает кортеж от чис- ла в скобках, определяющих порядок выполнения операций.
Python_ex134.py
1
# &
2
("self_taught",)
3
# &
4
(9)
+ 1
>> ('self_taught',)
>> 10
После создания кортежа в него нельзя добавлять новые элементы или изме- нять существующие. При попытке изменить элемент в кортеже после его созда- ния Python сгенерирует исключение.
Python_ex135.py
1
dys
= ("1984",
2
" ",
3
"451 ")
4
dys[1]
= "A B & "
>> TypeError: 'tuple' object does not support item assignment
Получить элементы кортежа можно тем же способом, что и элементы списка указывая индекс элемента.
Python_ex136.py
1
dys
= ("1984",
2
" ",
3
"451 ")
4
dys[2]
>> '451 '
Проверить, содержится ли элемент в кортеже, можно с помощью ключевого слова in.
Python_ex137.py
1
dys
= ("1984",
65Введение в программирование
2
" ",
3
"451 ")
4
"1984"
in dys
>> True
Поместите перед in ключевое слово not для проверки отсутствия элемента в кортеже.
Python_ex138.py1
dys
= ("1984",
2
" ",
3
"451 ")
4
"A B & "
not in dys
>> True
Вам, наверное, интересно, зачем использовать структуру данных, которая кажется менее гибкой, чем список. Кортежи удобно использовать, когда вы име- ете дело со значениями, которые никогда не изменятся, и вы хотите быть уве- ренными, что их не изменят другие части вашей программы. Примером данных, которые удобно хранить в кортеже, могут быть географические координаты.
Долготу и широту города следует сохранить в кортеже,
поскольку эти значения никогда не изменятся, и сохранение в кортеже будет гарантировать, что другие части программы случайно их не изменят. Кортежи, в отличие от списков, могут использоваться в качестве ключей в сло варях, о которых пойдет речь в следую- щем разделе этой главы.
СловариСловари — еще один встроенный контейнер для хранения объектов. Они ис- пользуются для связывания одного объекта, называемого
ключом, с другим, называемым
значением. Такое связывание называется
отображением. Резуль- татом будет
пара ключ-значение. Пары ключ-значение добавляются в словарь.
Затем вы можете найти в словаре ключ и получить соответствующее ему значе- ние. Однако нельзя использовать значение для нахождения ключа.
Словари являются изменяемыми , так что в них можно добавлять новые пары ключ-значение. В отличие от списков и кортежей, словари не хранят объекты в определенном порядке. Их полезность заключается в связях между ключами и значениями — существует множество ситуаций, в которых вам нужно будет со- хранять данные попарно. Например, в словаре можно сохранить информацию о ком-либо, связав ключ, представляющий рост, со значением роста человека, ключ, представляющий цвет глаз, со значением цвета глаз человека, и ключ,
представляющий национальность, с соответствующим значением.
66
Часть I
Словари объявляются с помощью фигурных скобок. Для создания словарей существуют два варианта синтаксиса. Первый:
Python_ex139.py
1 my_dict
= dict()
2 my_dict
>> {}
Второй:
Python_ex140.py
1 my_dict
= {}
2 my_dict
>> {}
При создании словарей в них можно добавлять пары ключ-значение. Оба варианта синтаксиса предполагают отделение ключа от значения двоеточием.
Пары ключ-значение отделяются запятыми. В отличие от кортежей, если у вас есть только одна пара ключ-значение, запятая после нее не нужна. Ниже показа- но, как при создании словаря в него добавляются пары ключ-значение.
Python_ex141.py
1
fruits
= {"Q ":
2
" ",
3
" ":
4
"&"}
5
fruits
>> {'Q ': ' ', ' ': '&'}
'альфа'
'а'
'о'
'г'
'омега'
'гамма'
Ключи
Значения
67
Введение в программирование
Ваш вывод может содержать элементы словаря в порядке, отличном от мо- его, поскольку словари не хранят объекты в определенном порядке – и Python выводит их в произвольном порядке (это касается всех примеров в данном раз- деле).
Словари изменяемы. Как только вы создали словарь, можете добавлять в него пары ключ-значение, используя синтаксис _ [ ] = -
, а также искать значение при помощи ключа, используя синтаксис _
[ ].
Python_ex142.py
1
facts
= dict()
2
# add a value
3
facts[" "]
= "* "
4
# look up a key
5
facts[" "]
6
# add a value
7
facts[""]
= ""
8
# look up a key
9
facts[""]
10
# add a value
11
facts[" "]
= 1776 12
# look up a key
13
facts[" "]
>> '* '
>>
>> 1776
Значением в словаре может быть любой объект. В предыдущем примере пер- вые два значения были строками, а последнее значение, 1776, – целым числом.
В отличие от значения словаря, ключ словаря должен быть неизменяемым.
Ключом словаря может быть строка или кортеж, но не список или словарь.
Для определения наличия ключа в словаре используйте ключевое слово in.
Слово in нельзя использовать для проверки наличия в словаре значения.
Python_ex143.py
1
bill
= dict({" ":
2
"X"})
3
" "
in bill
>> True
68Часть I
Если вы
попытаетесь получить доступ к ключу, отсутствующему в словаре,
Python сгенерирует исключение.
Чтобы определить отсутствие ключа в словаре, перед in добавьте ключевое слово not.
Python_ex144.py1
bill
= dict({" ":
2
"X"})
3
" B"
not in bill
>> True
Из словаря можно удалить пару ключ-значение с помощью ключевого слова del
Python_ex145.py1
books
= {" ": "% ",
2
"1984": " ",
3
" Y": " "}
4
del books[" Y"]
5
books
>> {' ': '% ', '1984': ' '}
Ниже приведен пример программы, использующей словарь.
Python_ex146.py1
rhymes
= {"1": "G",
2
"2": " ",
3
"3": "",
4
"4": " &",
5
"5": "&B "
6
}
7
n = input(" :")
8
if n
in rhymes:
9
rhyme
= rhymes[n]
10
print(rhyme)
11
else:
12
print("$ .")
>> :
69
Введение в программирование
Ваш словарь (rhymes) содержит шесть названий песен (ключей), связанных с шестью музыкантами (значениями). Вы просите пользователя ввести название пес- ни и сохраняете его ответ в переменной. Прежде чем искать этот ответ в словаре, проверьте, существует ли ключ с помощью ключевого слова in. Если ключ существу- ет, тогда вы ищете название песни в словаре и выводите имя ее исполнителя. В про- тивном случае пользователю выводится сообщение об отсутствии названия песни.
Контейнеры внутри контейнеров
Вы можете сохранять контейнеры в других контейнерах . Например, можно хра- нить списки внутри списка.
Python_ex147.py
1
lists
= []
2
rap
= [" ",
3
" Y",
4
" G",
5
"25-17"]
6
rock
= ["$ ",
7
" ",
8
""]
9
djs
= ["Paul Oakenfold",
10
"Tiesto"]
11
lists.append(rap)
12
lists.append(rock)
13
lists.append(djs)
14
print(lists)
>>
[[' ', ' Y', ' G', '25-17'], ['$
', ' ', ''], ['Paul Oakenfold', 'Tiesto']]
В этом примере список lists имеет три индекса, каждый из которых является списком: первый индекс — список рэперов, второй — рокеров, третий — диджеев.
К этим спискам можно получить доступ с помощью их соответствующих индексов.
Python_ex148.py
1
# &
2
# X
3
rap
= lists[0]
4
print(rap
>> [' ', ' Y', ' G', '25-17']
70
Часть I
Если вы добавите новый элемент в список rap, то увидите разницу при вы- воде.
Python_ex149.py
1
# &
2
# X
3
rap
= lists[0]
4
rap.append("$ * ")
5
print(rap)
6
print(lists)
>> [' ', ' Y', ' G', '25-17', '$ * ']
>>
[[' ', ' Y', ' G', '25-17', '$ * '],
['$ ', ' ', ''], ['Paul Oakenfold›',
'Tiesto']]
Можно хранить кортеж внутри списка, список внутри кортежа и словарь вну- три списка или кортежа.
Python_ex150.py
1
locations
= []
2
tula
= (54.1960, 37.6182)
3
moscow
= (55.7522, 37.6155)
4
locations.append(tula)
5
locations.append(moscow)
6
print(locations)
>> [(54.196, 37.6182), (55.7522, 37.6155)]
Python_ex151.py
1
eights
= [" ",
2
"H B "]
3
nines
= [" ",
4
"Y& ",
5
" "]
6
authors
= (eights, nines)
7
print(authors)
>>
([' ', 'H B '], [' ',
'Y& ', ' '])
71
Введение в программирование
Python_ex152.py
1
bday
= {" ":
2
"21.07.1899",
3
"Y& ":
4
"24.09.1896"}
5
my_list
= [bday]
6
print(my_list)
7 my_tuple
= (bday,)
8
print(my_tuple)
>> [{' ': '21.07.1899', 'Y& ': '24.09.1896'}]
>> ({' ': '21.07.1899', 'Y& ': '24.09.1896'},)
Список , кортеж или словарь могут быть значениями в словаре.
Python_ex153.py
1
ru
= {" & ":
2
(55.7522,
3 37.6155),
4
"B ":
5
[" Y",
6
" ",
7
" "],
8
" ":
9
{" ":
10
"V ",
11
" ":
12
"A "}
13
}
В данном примере ваш словарь, ru, имеет три ключа: « & »,
«B »
и « ». Значением первого ключа выступает кортеж, поскольку географические координаты никогда не меняются. Значением вто- рого ключа является список знаменитостей, живущих в Москве, — это список, поскольку данные могут измениться. Значением третьего ключа является сло- варь, поскольку пары ключ-значение — лучший способ представить факты о
Москве.
72Часть I
Словарь терминовЗначение: значение, связанное в словаре с ключом.
Изменяемый: когда контейнер является изменяемым, это значит, что его содер- жимое можно изменить.
Индекс: число, представляющее позицию элемента в итерируемом объекте.
Итерирование: объект поддерживает итерирование, если к каждому его эле- менту можно получить доступ через цикл.
Итерируемые объекты: объекты, поддерживающие итерирование, например строки, списки и кортежи.
Ключ: значение, при помощи которого находят значение в словаре.
Метод: функция, тесно связанная с определенным типом данных.
Неизменяемый: если контейнер является изменяемым, это значит, что его со- держимое нельзя изменить.
Отображение: связывание одного объекта с другим.
Пара ключ-значение: ключ, связанный в словаре со значением.
Словарь: встроенный контейнер для хранения объектов. Связывает один объ- ект, называемый ключом, с другим объектом — значением.
Список: контейнер, хранящий объекты в определенном порядке.
Практикум1. Создайте список ваших любимых музыкантов.
2. Создайте список кортежей, где каждый кортеж содержит долготу и широту любого места, в котором вы жили или которое посещали.
3. Создайте словарь, содержащий различные данные о вас: рост, любимый цвет, любимый актер и т.д.
4. Напишите программу, которая запрашивает у пользователя его вес, люби- мый цвет или актер, и возвращает результат из словаря, созданного в преды- дущем задании.
5. Создайте словарь, связывающий ваших любимых музыкантов со списком ва- ших любимых песен, написанных ими.
6. Списки, кортежи и словари — лишь некоторые из встроенных в Python кон- тейнеров. Самостоятельно изучите множества (тип контейнеров). В каком случае бы вы использовали множество?
Решения:
chap5_challenge1.py — chap5_challenge5.py.