Периодически нам в редакцию приходят письма с вопросом будет ли новый тираж книги «Программируем на Python» М.Доусона. Несмотря на то, что оригинал «Python Programming for the Absolute Beginner, 3rd Edition» вышел в 2010г., он до сих пор в бестах на amazon.com. Содержание книги построено на практических примерах программирования простых игр. Нам очень интересно узнать мнение профессионалов, что позволит принять решение издавать ли книгу.
Полное оглавление можно посмотреть здесь.
Отрывок из Главы 5. Списки и словари. Игра «Виселица»/
Кортежи — хороший способ манипулировать элементами разных типов в составе одной последовательности. Но от того, что кортеж неизменяем, иногда возникают неудобства. К счастью, есть последовательности другого вида, так называемые списки (lists), которые умеют все то же самое, что и кортежи, и даже больше — просто потому, что список изменяем. Его элементы можно удалять, а также добавлять новые. Можно даже подвергать список сортировке. Я познакомлю вас с еще одной разновидностью последовательностей — словарями (dictionaries). Если список организован как набор значений, то словарь — как набор пар значений. Подобно своему тезке с книжной полки, словарь позволяет находить то значение, которое соответствует какому-либо другому. Говоря более детально, в этой главе вы научитесь делать следующее:
• создавать списки, индексировать их и делать срезы;
• добавлять и удалять элементы списка;
• применять списковые методы, которые позволяют сортировать список и добавлять значение в конец;
• применять вложенные последовательности, которыми можно представить данные любой сложности;
• пользоваться словарями для работы с парами значений;
• добавлять и удалять элементы словаря.
Знакомство с игрой «Виселица»
В центре внимания этой главы — проект, посвященный игре «Виселица». Втайне от пользователя компьютер выбирает какое-либо слово, и игрок должен попробовать отгадать его, высказывая свои предположения побуквенно. Каждый раз, когда игрок ошибается, компьютер дорисовывает на экране изображение фигурки под виселицей. Если в отведенное количество попыток игроку не удается отгадать слово, то «повешенный» гибнет. На рис. 5.1–5.3 показан игровой процесс во всем его страшном великолепии.
Игра интересна не только сама по себе. Замечательно также и то, что к концу изучения этой главы вы узнаете, как создать собственную версию игры. Вы сможете, например, обзавестись своим личным списком «секретных» слов или заменить мои примитивные рисунки более внушительными.
Рис. 5.1. Играем в «Виселицу». Гм… Что же за слово он загадал?
Рис. 5.2. В этой игре я победил!
Рис. 5.3. А эта игра закончилась не лучшим образом, особенно для псевдографического человечка
Использование списков
Списки, как и кортежи, — это последовательности. Но списки изменяемы. Их элементы поддаются модификации. Вот почему списки обладают той же функциональностью, что и кортежи, и могут кое-что еще. То, что вы уже знаете о работе с кортежами, применимо и к спискам, а значит, научиться ими пользоваться для вас не составит труда.
Знакомство с программой «Арсенал героя 3.0»
Эта программа основана на более ранней игре «Арсенал героя 2.0», с которой мы познакомились в главе 4. Здесь для хранения данных об арсенале героя использованы не кортежи, а списки. Начальная часть «Арсенала героя 3.0» выдает такие же результаты, как и более ранняя версия. Да и код в ней практически тот же самый; разница лишь в том, что вместо кортежей везде использованы списки. На рис. 5.4 показано окно программы после выполнения этой первой части. Следующий за ней код демонстрирует полезные следствия изменяемости списков и некоторые новые приемы работы с последовательностями. Выполнение этой части программы отражено
на рис. 5.5.
Рис. 5.4. Теперь арсенал героя представлен списком. В окне программы все выглядит почти так же, как выглядело в версии 2.0, где использовался кортеж
Создание списка
В первых строках кода создается новый список, который становится значением переменной inventory; система выводит элементы списка на экран. Единственное отличие от «Арсенала героя 2.0» состоит в том, что я заключил элементы списка в квадратные, а не в круглые скобки и получил список, а не кортеж. Код этой программы вы можете найти на сайте-помощнике (courseptr.com/downloads) в папке Chapter 5. Файл называется hero's_inventory3.py.
Рис. 5.5. Поскольку арсенал героя — это список, то его элементы можно добавлять, изменять и удалять
# Арсенал героя 3.0
# Демонстрирует работу со списками
# создадим список с несколькими элементами и выведем его с помощью for-цикла
inventory = [“меч”, “кольчуга”, “щит”, “целебное снадобье”]
print(“nИтак, в вашем арсенале:”)
for item in inventory:
print(item)
input(“nНажмите Enter, чтобы продолжить.”)
Применение функции len() к спискам
Следующий код побуквенно совпадает с аналогичным кодом в «Арсенале героя 2.0». Функция len() работает со списками так же, как и с кортежами.
# найдем длину списка
print(“Сейчас в вашем распоряжении”, len(inventory), “предмета/-ов.”)
input(“nНажмите Enter, чтобы продолжить.”)
Применение оператора in к спискам
Этот код тоже без изменений позаимствован из предыдущей версии. Оператор in не видит разницы между кортежем и списком.
# проверка на принадлежность списку с помощью in
if “целебное снадобье” in inventory:
print(“Вы еще поживете и повоюете.”)
Индексация списков
Опять ничего нового по сравнению с версией 2.0. Для доступа к элементу списка, как прежде, надо заключить в квадратные скобки номер позиции, в которой находится элемент.
# вывод одного элемента с определенным индексом
index = int(input(“nВведите индекс одного из предметов арсенала: “))
print(“Под индексом”, index, “в арсенале находится”, inventory[index])
Срезы списков
Готовы ли вы поверить в то, что срезы списков представляют собой то же самое, что и срезы кортежей? Опять же указываем начальную и конечную позиции через двоеточие в квадратных скобках:
# отобразим срез
start = int(input(“nВведите начальный индекс среза: “))
finish = int(input(“Введите конечный индекс среза: “))
print(“Срез inventory[“, start, “:”, finish, “] – это”, end=” “)
print(inventory[start:finish])
input(“nНажмите Enter, чтобы продолжить.”)
Сцепление списков
Сцепление списков ничем не отличается от сцепления кортежей. Разница здесь будет только в том, что присвоить переменной chest я решил список, а не кортеж. Это небольшое, но существенное отличие, потому что конкатенации можно подвергнуть лишь однотипные последовательности.
# соединим два списка
chest = [“золото”, “драгоценные камни”]
print(“Вы нашли ларец. Вот что в нем есть:”)
print(chest)
print(“Вы приобщили содержимое ларца к своему арсеналу.”)
inventory += chest
print(“Теперь в вашем распоряжении:”)
print(inventory)
input(“nnНажмите Enter, чтобы продолжить.”)
Изменяемость списков
Надо полагать, вас уже утомили бесчисленные фразы, общий смысл которых заключается в том, что список функционирует так же, как кортеж. До сих пор, если не считать замены круглых скобок квадратными, списки не проявили себя ничем новым по сравнению с кортежами. Но разница все же есть, и она огромна. Повторю: списки изменяемы. Отсюда следует, что со списками можно проделывать множество трюков, для которых кортежи непригодны.
Присвоение нового значения элементу, выбранному по индексу
Поскольку список изменяем, то любому его элементу можно присвоить новое значение:
# присваиваем значение элементу по индексу
print(“Вы обменяли меч на арбалет.”)
inventory[0] = “арбалет”
print(“Теперь ваш арсенал содержит следующие предметы:”)
print(inventory)
input(“nНажмите Enter, чтобы продолжить.”)
В этом коде элементу списка inventory, имеющему индекс 0, присваивается значение
“арбалет”:
inventory[0] = “арбалет”
Это новое строковое значение замещает прежнее (“меч”). Как стал выглядеть список, показывает функция print, с помощью которой на экран выводится новая версия inventory.
ЛОВУШКА
Можно приписать новое значение существующему элементу списка, выбрав его по индексу, но создать этим способом новый элемент нельзя. Попытка приписать какое-либо значение элементу, которого ранее не существовало, вызовет ошибку.
Присвоение новых значений срезу списка
Разрешается присвоить новое значение не только отдельному элементу списка, но и срезу. Я присвоил срезу inventory[4:6] значение списка из одного элемента [“магический кристалл”]:
# приписываем значение элементам по срезу индексов
print(“За золото и драгоценные камни вы купили магический кристалл, способный предсказывать будущее.”)
inventory[4:6] = [“магический кристалл”]
print(“Теперь в вашем распоряжении:”)
print(inventory)
input(“nНажмите Enter, чтобы продолжить.”)
Двум элементам списка — inventory[4] и inventory[5] — присваивается единое строковое значение “магический кристалл”. Поскольку одноэлементный список стал значением двухэлементного среза, длина последовательности inventory уменьшилась на единицу.
Автор: ph_piter