Книга «Изучаем Python»



Pdf көрінісі
бет73/266
Дата03.03.2023
өлшемі7,86 Mb.
#170986
түріКнига
1   ...   69   70   71   72   73   74   75   76   ...   266
Байланысты:
Изучаем Python. Программирование игр, визуализация данных, веб-приложения ( PDFDrive )


Глава 6 • Словари
 
aliens = [alien_0, alien_1, alien_2]
for alien in aliens:
print(alien)
Сначала создаются три словаря, каждый из которых представляет отдельного при-
шельца. В точке 

каждый словарь заносится в список с именем 
aliens
. Наконец, 
программа перебирает список и выводит каждого пришельца:
{'color': 'green', 'points': 5} 
{'color': 'yellow', 'points': 10} 
{'color': 'red', 'points': 15}
Конечно, в реалистичном примере будут использоваться более трех пришельцев, 
которые будут генерироваться автоматически. В следующем примере функция 
range()
создает флот из 30 пришельцев:
# Создание пустого списка для хранения пришельцев.
aliens = []
# Создание 30 зеленых пришельцев.
 
for alien_number in range(30):
 
new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'}
 
aliens.append(new_alien)
# Вывод первых 5 пришельцев:
 
for alien in aliens[:5]:
print(alien)
print("...")
# Вывод количества созданных пришельцев.
 
print("Total number of aliens: " + str(len(aliens)))
В начале примера список для хранения всех пришельцев, которые будут созданы, 
пуст. В точке 

функция 
range()
возвращает множество чисел, которое просто 
сообщает Python, сколько раз должен повторяться цикл. При каждом выполнении 
цикла создается новый пришелец 

, который затем добавляется в список 
aliens


В точке 

срез используется для вывода первых пяти пришельцев, а в точке 

выводится длина списка (для демонстрации того, что программа действительно 
сгенерировала весь флот из 30 пришельцев):
{'speed': 'slow', 'color': 'green', 'points': 5} 
{'speed': 'slow', 'color': 'green', 'points': 5} 
{'speed': 'slow', 'color': 'green', 'points': 5} 
{'speed': 'slow', 'color': 'green', 'points': 5} 
{'speed': 'slow', 'color': 'green', 'points': 5} 
...
Total number of aliens: 30
Все пришельцы обладают одинаковыми характеристиками, но Python рассматри-
вает каждого пришельца как отдельный объект, что позволяет изменять атрибуты 
каждого владельца по отдельности.
Как работать с таким множеством? Представьте, что в этой игре некоторые при-
шельцы изменяют цвет и начинают двигаться быстрее. Когда приходит время 


Вложение
115
смены цветов, мы можем воспользоваться циклом 
for
и командой 
if
для изме-
нения цвета. Например, чтобы превратить первых трех пришельцев в желтых, 
двигающихся со средней скоростью и приносящих игроку по 10 очков, можно 
действовать так:
# Создание пустого списка для хранения пришельцев.
aliens = []
# Создание 30 зеленых пришельцев.
for alien_number in range (0,30):
new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'}
aliens.append(new_alien)
for alien in aliens[0:3]:
if alien['color'] == 'green':
alien['color'] = 'yellow'
alien['speed'] = 'medium'
alien['points'] = 10
# Вывод первых 5 пришельцев:
for alien in aliens[0:5]:
print(alien)
print("...")
Чтобы изменить первых трех пришельцев, мы перебираем элементы среза, включа-
ющего только первых трех пришельцев. В данный момент все пришельцы зеленые 
(
'green'
), но так будет не всегда, поэтому мы пишем команду 
if
, которая гаранти-
рует, что изменяться будут только зеленые пришельцы. Если пришелец зеленый, 
то его цвет меняется на желтый (
'yellow'
), скорость на среднюю (
'medium'
), а на-
града увеличивается до 10 очков:
{'speed': 'medium', 'color': 'yellow', 'points': 10} 
{'speed': 'medium', 'color': 'yellow', 'points': 10} 
{'speed': 'medium', 'color': 'yellow', 'points': 10} 
{'speed': 'slow', 'color': 'green', 'points': 5} 
{'speed': 'slow', 'color': 'green', 'points': 5} 
...
Цикл можно расширить, добавив блок 
elif
для превращения желтых пришельцев 
в красных — быстрых и приносящих игроку по 15 очков. Мы не станем приводить 
весь код, а цикл выглядит так:
for alien in aliens[0:3]:
if alien['color'] == 'green':
alien['color'] = 'yellow'
alien['speed'] = 'medium'
alien['points'] = 10
elif alien['color'] == 'yellow':
alien['color'] = 'red'
alien['speed'] = 'fast'
alien['points'] = 15
Решение с хранением словарей в списке достаточно часто встречается тогда, когда 
каждый словарь содержит разные атрибуты одного объекта. Например, вы можете 


116
Глава 6 • Словари
создать словарь для каждого пользователя сайта, как это было сделано в програм-
ме 
user .py
на с. 108, и сохранить отдельные словари в списке с именем 
users
. Все 
словари в списке должны иметь одинаковую структуру, чтобы вы могли перебрать 
список и выполнить с каждым объектом словаря одни и те же операции.
Список в словаре
Иногда бывает удобно поместить список в словарь, вместо того чтобы помещать 
словарь в список. Представьте, как бы вы описали в программе заказанную пиццу. 
Если ограничиться только списком, сохранить удастся разве что список дополне-
ний к пицце. При использовании словаря список дополнений может быть всего 
лишь одним аспектом описания пиццы.
В следующем примере для каждой пиццы сохраняются два вида информации: тип 
теста и список дополнений. Список дополнений представляет собой значение, 
связанное с ключом 
'toppings'
. Чтобы использовать элементы в списке, нужно 
указать имя словаря и ключ 
'toppings'
, как и для любого другого значения в сло-
варе. Вместо одного значения будет получен список дополнений:
pizza.py
# Сохранение информации о заказанной пицце.
 
pizza = {
'crust': 'thick',
'toppings': ['mushrooms', 'extra cheese'],
}
# Описание заказа.
 
print("You ordered a " + pizza['crust'] + "-crust pizza " +
"with the following toppings:")
 
for topping in pizza['toppings']:
print("\t" + topping)
Работа начинается в точке 

со словаря с информацией о заказанной пицце. 
С ключом в словаре 
'crust'
связано строковое значение 
'thick'
. С другим ключом 
'toppings'
связано значение-список, в котором хранятся все заказанные допол-
нения. В точке 

выводится описание заказа перед созданием пиццы. Чтобы вы-
вести список дополнений, мы используем ключ 
'toppings'
, а Python берет список 
дополнений из словаря.
Следующее сообщение описывает пиццу, которую мы собираемся создать:
You ordered a thick-crust pizza with the following toppings: 
mushrooms 
extra cheese
Вложение списка в словарь может применяться каждый раз, когда с одним ключом 
словаря должно быть связано более одного значения. Если бы в предыдущем при-
мере с языками программирования ответы сохранялись в списке, один участник 
опроса мог бы выбрать сразу несколько любимых языков. При переборе словаря 
значение, связанное с каждым человеком, представляло бы собой список языков 


Вложение
117
(вместо одного языка.) В цикле 
for
словаря создается другой цикл для перебора 
списка языков, связанных с каждым участником:
favorite_languages.py
 
favorite_languages = {
'jen': ['python', 'ruby'],
'sarah': ['c'],
'edward': ['ruby', 'go'],
'phil': ['python', 'haskell'],
}
 
for name, languages in favorite_languages.items():
print("\n" + name.title() + "'s favorite languages are:")
 
for language in languages:
print("\t" + language.title())
Вы видите в точке 

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

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

перебирает эле-
менты списка любимых языков каждого участника.
Теперь каждый участник опроса может указать сколько угодно любимых языков 
программирования:
Jen's favorite languages are: 
Python 
Ruby 
Sarah's favorite languages are: 

Phil's favorite languages are: 
Python 
Haskell 
Edward's favorite languages are: 
Ruby 
Go
Чтобы дополнительно усовершенствовать программу, включите в начало цикла 
for
словаря команду 
if
для проверки того, выбрал ли данный участник более одного 
языка программирования (проверка основана на значении 
len(languages)
). Если 
у участника только один любимый язык, текст сообщения изменяется для един-
ственного числа (например, «Sarah’s favorite language is C»).


Достарыңызбен бөлісу:
1   ...   69   70   71   72   73   74   75   76   ...   266




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет