Книга «Изучаем Python: программирование игр, визуализация данных, веб-приложения. 3-е изд.»

image Привет, Хаброжители! Мы выпустили третью версию #1 Best Seller in Python Programming Amazon — популярного в мире руководства по языку Python.

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

Во второй части вы примените новые знания на практике и создадите три проекта: аркадную игру в стиле Space Invaders, визуализацию данных с удобными библиотеками Python и простое веб-приложение, которое можно быстро развернуть онлайн. Работая с книгой, вы научитесь: ∙ Использовать мощные библиотеки и инструменты Python: Pygame, Matplotlib, Plotly и Django ∙ Создавать 2D-игры разной сложности, которыми можно управлять с клавиатуры и мыши ∙ Создавать интерактивную визуализацию данных ∙ Разрабатывать, настраивать и развертывать веб-приложения ∙ Разбираться с багами и ошибками

Новое издание было тщательно переработано и отражает последние достижения в практиках программирования на Python. Первая часть книги была дополнена новой информацией о f-строках, константах и управлении данными. Во второй части был обновлен код проектов. Структура проектов и код стали более чистыми и понятными, теперь они используют всю мощь популярных библиотек и инструментов, таких как Plotly и Django.

Ниже приведена краткая сводка изменений в третьем издании:


В главе 1 инструкции по установке Python были упрощены для пользователей всех основных операционных систем. Теперь я рекомендую использовать текстовый редактор Sublime Text, который популярен как среди новичков, так и среди профессионалов и работает во всех операционных системах.

В главе 2 приведено более подробное описание того, как переменные реализованы в языке Python. Переменные описываются как текстовые метки для значений, что позволяет читателю лучше понять поведение переменных в Python. В книге широко используются f-строки, появившиеся в Python 3.6, — намного более простой и удобный механизм использования значений в строках. В Python 3.6 также появилась возможность использования символов подчеркивания для представления больших чисел (например, 1_000_000); она также включена в это издание. Множественное присваивание переменных было представлено в одном из проектов первого издания; описание было обобщено и перемещено в главу 2 для удобства читателей. Наконец, в эту главу также включена понятная система соглашений для представления констант в Python.

В главе 6 представлен метод get () для чтения значений из словаря, который может вернуть значение по умолчанию в случае отсутствия ключа.

Проект «Инопланетное вторжение» (главы 12–14) теперь полностью базируется на использовании классов. Сама игра представляет собой класс (вместо серии функций, как в предыдущем издании). Это сильно упрощает общую структуру игры, уменьшает число вызовов функций и необходимых параметров. Читатели, знакомые с первым изданием, оценят простоту нового подхода, основанного на классах. Pygame теперь может устанавливаться однострочной командой во всех системах, а читатель может выбрать между запуском игры в полноэкранном или оконном режиме.

В проектах визуализации данных инструкции по установке Matplotlib упростились для всех операционных систем. Визуализации, базирующиеся на Matplotlib, используют функцию subplots (), более удобную для обучения построению сложных визуализаций. В проекте Rolling Dice из главы 15 используется Plotly — библиотека визуализации с простым синтаксисом, качественным сопровождением и красивым выводом результатов с широкими возможностями настройки.

В главе 16 метеорологический проект переведен на данные NOAA, которые продемонстрировали большую стабильность за прошедшие годы, чем сайт, использованный в первом издании. Картографический проект теперь посвящен глобальной сейсмической активности; к моменту завершения проекта будет построена великолепная визуализация, наглядно изображающая границы тектонических плит по координатам всех землетрясений за заданный период времени. Вы научитесь наносить на карту любые наборы данных, содержащие географические координаты.

В главе 17 для визуализации активности, связанной с Python, в проектах с открытым кодом на GitHub используется библиотека Plotly.

Проект Learning Log (главы 18–20) построен на базе новейшей версии Django, а для его оформления используется новейшая версия Bootstrap. Процесс развертывания проекта в Heroku был упрощен за счет использования пакета django-heroku, и в нем используются переменные среды вместо редактирования файлов settings.py. Такое решение получается более простым и лучше соответствует тому, как профессиональные программисты развертывают современные проекты Django.

Приложение А было полностью переработано. В него были включены рекомендации по установке Python. В приложение Б включены подробные рекомендации по настройке Sublime Text и приведены краткие описания основных текстовых редакторов и интегрированных сред, используемых в наши дни. В приложении В приведены ссылки на более новые и популярные сетевые ресурсы для получения помощи, а приложение Г предлагает небольшой учебный курс по применению Git для контроля версий.

Мы понимаем, что многих удивляет то, что мы выпустили третье издание книги, а оригинальная книга 2ed. Причина такого казуса проста. Через полгода после выхода первого издания на русском языке автор внес в книгу значительные, но мелкие изменения, исправил многие коды. Посмотрев на количество изменений, мы приняли решение назвать новую книгу «второе издание». Так что второе русскоязычное издание вышло еще 30 мая 2017 года.

А теперь 2-е международное издание пришлось выпустить как
«Изучаем Python: программирование игр, визуализация данных, веб-приложения. 3-е изд.»

Отрывок. Словари


Иногда бывает нужно сохранить множество словарей в списке или сохранить список как значение элемента словаря. Создание сложных структур такого рода называется вложением. Вы можете вложить множество словарей в список, список элементов в словарь или даже словарь внутрь другого словаря. Как наглядно показывают следующие примеры, вложение — чрезвычайно мощный механизм.

Список словарей


Словарь alien_0 содержит разнообразную информацию об одном пришельце, но в нем нет места для хранения информации о втором пришельце, не говоря уже о целом экране, забитом пришельцами. Как смоделировать флот вторжения? Например, можно создать список пришельцев, в котором каждый элемент представляет собой словарь с информацией о пришельце. Например, следующий код строит список из трех пришельцев:

aliens.py
   alien_0 = {'color': 'green', 'points': 5}
   alien_1 = {'color': 'yellow', 'points': 10}
   alien_2 = {'color': 'red', 'points': 15}
❶ 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(f"Total number of aliens: {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 рассматривает каждого пришельца как отдельный объект, что позволяет изменять атрибуты каждого владельца по отдельности.

Как работать с таким множеством? Представьте, что в этой игре некоторые пришельцы изменяют цвет и начинают двигаться быстрее. Когда приходит время смены цветов, мы можем воспользоваться циклом 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


Решение с хранением словарей в списке достаточно часто встречается тогда, когда каждый словарь содержит разные атрибуты одного объекта. Например, вы можете создать словарь для каждого пользователя сайта, как это было сделано в программе user.py на с. 114, и сохранить отдельные словари в списке с именем users. Все словари в списке должны иметь одинаковую структуру, чтобы вы могли перебрать список и выполнить с каждым объектом словаря одни и те же операции.

Список в словаре


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

В следующем примере для каждой пиццы сохраняются два вида информации: основа и список топпингов. Список топпингов представляет собой значение, связанное с ключом 'toppings'. Чтобы использовать элементы в списке, нужно указать имя словаря и ключ 'toppings', как и для любого другого значения в словаре. Вместо одного значения будет получен список топпингов:

pizza.py
   # Сохранение информации о заказанной пицце.
❶ pizza = {
         'crust': 'thick',
         'toppings': ['mushrooms', 'extra cheese'],
         }

   # Описание заказа.
❷ print(f"You ordered a {pizza['crust']}-crust pizza "
        "with the following toppings:")

❸ for topping in pizza['toppings']:
print("\t" + topping)


Работа начинается в точке ❶ со словаря с информацией о заказанной пицце. С ключом в словаре 'crust' связано строковое значение 'thick'. С другим ключом 'toppings' связано значение-список, в котором хранятся все заказанные топпинги. В точке ❷ выводится описание заказа перед созданием пиццы. Если вам нужно разбить длинную строку в вызове print (), выберите точку для разбиения выводимой строки и закончите строку кавычкой. Снабдите следующую строку отступом, добавьте открывающую кавычку и продолжите строку. Python автоматически объединяет все строки, обнаруженные в круглых скобках. Для вывода дополнений пишется цикл for ❸. Чтобы вывести список топпингов, мы используем ключ 'toppings', а Python берет список топпингов из словаря.

Следующее сообщение описывает пиццу, которую мы собираемся создать:

You ordered a thick-crust pizza with the following toppings:
      mushrooms
      extra cheese


Вложение списка в словарь может применяться каждый раз, когда с одним ключом словаря должно быть связано более одного значения. Если бы в предыдущем примере с языками программирования ответы сохранялись в списке, один участник опроса мог бы выбрать сразу несколько любимых языков. При переборе словаря значение, связанное с каждым человеком, представляло бы собой список языков (вместо одного языка). В цикле 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(f"\n{name.title()}'s favorite languages are:")
❸      for language in languages:
             print(f"\t{language.title()}")


Вы видите в точке ❶, что значение, связанное с каждым именем, теперь представляет собой список. У некоторых участников один любимый язык программирования, у других таких языков несколько. При переборе словаря в точке ❷ переменная с именем languages используется для хранения каждого значения из словаря, потому что мы знаем, что каждое значение будет представлять собой список. В основном цикле по элементам словаря другой цикл ❸ перебирает элементы списка любимых языков каждого участника. Теперь каждый участник опроса может указать сколько угодно любимых языков программирования:

Jen's favorite languages are:
      Python
      Ruby

Sarah's favorite languages are:
      C

Phil's favorite languages are:
      Python
      Haskell

Edward's favorite languages are:
      Ruby
      Go


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

» Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок

Для Хаброжителей скидка 25% по купону — Python

По факту оплаты бумажной версии книги на e-mail высылается электронная книга.

© Habrahabr.ru