Если какие-то подробности в этом примере кажутся непонятными, не огорчайтесь. В двух словах, если при работе с копией списка происходит что-то непредвиденное, убедитесь в том, что список копируется с использованием среза, как это делается в нашем первом примере.
Упражнения
4-10. Срезы: добавьте в конец одной из программ, написанных в этой главе, фрагмент, который делает следующее.
• Выводит сообщение «The first three items in the list are:», а затем использует срез для вывода первых трех элементов из списка.
• Выводит сообщение «Three items from the middle of the list are:», а затем использует срез для вывода первых трех элементов из середины списка.
• Выводит сообщение «The last three items in the list are:», а затем использует срез для вывода последних трех элементов из списка.
4-11. Моя пицца, твоя пицца: начните с программы из упражнения 4-1. Создайте копию списка с видами пиццы, присвойте ему имя friend_pizzas. Затем сделайте следующее.
• Добавьте новую пиццу в исходный список.
• Добавьте другую пиццу в список friend_pizzas.
• Докажите, что в программе существуют два разных списка. Выведите сообщение «My favorite pizzas are:», а затем первый список в цикле for. Выведите сообщение «My friend’s favorite pizzas are:», а затем второй список в цикле for. Убедитесь в том, что каждая новая пицца находится в соответствующем списке.
4-12. Больше циклов: во всех версиях foods.py из этого раздела мы избегали использования цикла for при выводе для экономии места. Выберите версию foods.py и напишите два цикла for для вывода каждого списка.
Кортежи
Списки хорошо подходят для хранения наборов элементов, которые могут изменяться на протяжении жизненного цикла программы. Например, возможность модификации списков жизненно необходима при работе со списками пользователей сайта или списками персонажей игры. Однако в некоторых ситуациях требуется создать список элементов, который не может изменяться. Кортежи (tuples) предоставляют именно такую возможность. В языке Python значения, которые не могут изменяться, называются неизменяемыми (immutable), а неизменяемый список называется кортежем.
Определение кортежа
Кортеж выглядит как список, не считая того, что вместо квадратных скобок используются круглые скобки. После определения кортежа вы можете обращаться к его отдельным элементам по индексам точно так же, как это делается при работе со списком.
Допустим, имеется прямоугольник, который в программе всегда должен иметь строго определенные размеры. Чтобы гарантировать неизменность размеров, можно объединить размеры в кортеж:
dimensions.py
(1) dimensions = (200, 50)
(2)print(dimensions[0])
print(dimensions[1])
В точке (1) определяется кортеж dimensions, при этом вместо квадратных скобок используются круглые. В точке (2) каждый элемент кортежа выводится по отдельности с использованием того же синтаксиса, который использовался для обращения к элементу списка:
200
50
Посмотрим, что произойдет при попытке изменения одного из элементов в кортеже dimensions:
dimensions = (200, 50)
(1) dimensions[0] = 250
Код в точке (1) пытается изменить первое значение, но Python возвращает ошибку типа. По сути, так как мы пытаемся изменить кортеж, а эта операция недопустима для объектов этого типа, Python сообщает о невозможности присваивания нового значения элементу в кортеже:
Traceback (most recent call last):
File "dimensions.py", line 3, in
. .dimensions[0] = 250
TypeError: 'tuple' object does not support item assignment
И это хорошо, потому что мы хотим, чтобы Python сообщал о попытке изменения размеров прямоугольника в программе, выдавая сообщение об ошибке.
Перебор всех значений в кортеже
Для перебора всех значений в кортеже используется цикл for, как и при работе со списками:
dimensions = (200, 50)
for dimension in dimensions:
. .print(dimension)
Python возвращает все элементы кортежа по аналогии с тем, как это делается со списком:
200
50
Замена кортежа
Элементы кортежа не могут изменяться, но вы можете присвоить новое значение переменной, в которой хранится кортеж. Таким образом, для изменения размеров прямоугольника следует переопределить весь кортеж:
(1) dimensions = (200, 50)
print("Original dimensions:")
for dimension in dimensions:
. .print(dimension)
. .
(2)dimensions = (400, 100)
(3)print("\nModified dimensions:")
for dimension in dimensions:
. .print(dimension)
Блок в точке (1) определяет исходный кортеж и выводит исходные размеры. В точке (2) в переменной dimensions сохраняется новый кортеж, после чего в точке (3) выводятся новые размеры. На этот раз Python не выдает сообщений об ошибках, потому что замена значения переменной является допустимой операцией:
Original dimensions:
200
50
Modified dimensions:
400
100
По сравнению со списками структуры данных кортежей относительно просты. Используйте их для хранения наборов значений, которые не должны изменяться на протяжении жизненного цикла программы.
Упражнения