Выбрать главу

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 <module>

. .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

По сравнению со списками структуры данных кортежей относительно просты. Используйте их для хранения наборов значений, которые не должны изменяться на протяжении жизненного цикла программы.

Упражнения

4-13. Шведский стол: меню «шведского стола» в ресторане состоит всего из пяти пунктов. Придумайте пять простых блюд и сохраните их в кортеже.

• Используйте цикл for для вывода всех блюд, предлагаемых рестораном.

• Попробуйте изменить один из элементов и убедитесь в том, что Python отказывается вносить изменения.

• Ресторан изменяет меню, заменяя два элемента другими блюдами. Добавьте блок кода, который заменяет кортеж, и используйте цикл for для вывода каждого элемента обновленного меню.