Мэтиз. Изучаем Python. Crash course2 n d e d i t i o na h a n d s o n, p r o j e c t b a s e d i n t r o d u c t i o n t o p r o g r a m m i n g
Скачать 6.2 Mb.
|
toppings.py requested_toppings = ['mushrooms', 'green peppers', 'extra cheese'] for requested_topping in requested_toppings: print(f"Adding {requested_topping}.") print("\nFinished making your pizza!") Использование команд if со списками 101 Вывод достаточно тривиален, поэтому код сводится к простому циклу for : Adding mushrooms. Adding green peppers. Adding extra cheese. Finished making your pizza! А если в пиццерии вдруг закончится зеленый перец? Команда if в цикле for может правильно обработать эту ситуацию: requested_toppings = ['mushrooms', 'green peppers', 'extra cheese'] for requested_topping in requested_toppings: ❶ if requested_topping == 'green peppers': print("Sorry, we are out of green peppers right now.") ❷ else: print(f"Adding {requested_topping}.") print("\nFinished making your pizza!") На этот раз программа проверяет каждый заказанный элемент перед добавлением его к пицце. В точке программа проверяет, заказал ли клиент зеленый перец, и если заказал, выводит сообщение о том, что этого дополнения нет. Блок else в точке гарантирует, что все другие дополнения будут включены в заказ. Из выходных данных видно, что все заказанные топпинги обрабатываются пра- вильно: Adding mushrooms. Sorry, we are out of green peppers right now. Adding extra cheese. Finished making your pizza! Проверка наличия элементов в списке Для всех списков, с которыми мы работали до сих пор, действовало одно простое предположение: мы считали, что в каждом списке есть хотя бы один элемент. Скоро мы предоставим пользователю возможность вводить информацию, хранящуюся в списке, поэтому мы уже не можем предполагать, что при каждом выполнении цикла в списке есть хотя бы один элемент. В такой ситуации перед выполнением цикла for будет полезно проверить, есть ли в списке хотя бы один элемент. Проверим, есть ли элементы в списке заказанных топпингов, перед изготовлением пиццы. Если список пуст, программа предлагает пользователю подтвердить, что он хочет базовую пиццу без топпингов. Если список не пуст, пицца готовится так же, как в предыдущих примерах: 102 Глава 5 • Команды if ❶ requested_toppings = [] ❷ if requested_toppings: for requested_topping in requested_toppings: print(f"Adding {requested_topping}.") print("\nFinished making your pizza!") ❸ else: print("Are you sure you want a plain pizza?") На этот раз мы начинаем с пустого списка заказанных топпингов в точке . Вместо того чтобы сразу переходить к циклу for , программа выполняет проверку в точ- ке . Когда имя списка используется в условии if , Python возвращает True , если список содержит хотя бы один элемент; если список пуст, возвращается значение False . Если requested_toppings проходит проверку условия, выполняется тот же цикл for , который мы использовали в предыдущем примере. Если же условие ложно, то программа выводит сообщение, которое предлагает клиенту подтвердить, действительно ли он хочет получить базовую пиццу без дополнений . В данном примере список пуст, поэтому выводится сообщение: Are you sure you want a plain pizza? Если в списке есть хотя бы один элемент, то в выходные данные включается каж- дый заказанный топпинг. Множественные списки Посетители способны заказать что угодно, особенно когда речь заходит о топпингах к пицце. Что, если клиент захочет положить на пиццу картофель-фри? Списки и команды if позволят вам убедиться в том, что входные данные имеют смысл, прежде чем обрабатывать их. Давайте проверим наличие нестандартных дополнений перед тем, как готовить пиццу. В следующем примере определяются два списка. Первый список содержит перечень доступных топпингов, а второй — список топпингов, заказанных клиен- том. На этот раз каждый элемент из requested_toppings проверяется по списку доступных топпингов перед добавлением в пиццу: ❶ available_toppings = ['mushrooms', 'olives', 'green peppers', 'pepperoni', 'pineapple', 'extra cheese'] ❷ requested_toppings = ['mushrooms', 'french fries', 'extra cheese'] ❸ for requested_topping in requested_toppings: ❹ if requested_topping in available_toppings: print(f"Adding {requested_topping}.") ❺ else: print(f"Sorry, we don't have {requested_topping}.") print("\nFinished making your pizza!") Использование команд if со списками 103 В точке определяется список доступных топпингов к пицце. Стоит заметить, что если в пиццерии используется постоянный ассортимент топпингов, этот спи- сок можно реализовать в виде кортежа. В точке создается список топпингов, заказанных клиентом. Обратите внимание на необычный заказ 'french fries' В точке программа перебирает список заказанных топпингов. Внутри цикла про- грамма сначала проверяет, что каждый заказанный топпинг присутствует в списке доступных топпингов . Если топпинг доступен, он добавляется в пиццу. Если заказанный топпинг не входит в список, выполняется блок else . Блок else вы- водит сообщение о том, что топпинг недоступен. С этим синтаксисом программа выдает четкий, содержательный вывод: Adding mushrooms. Sorry, we don't have french fries. Adding extra cheese. Finished making your pizza! Всего в нескольких строках кода нам удалось эффективно решить вполне реальную проблему! УПРАЖНЕНИЯ 5.8. Hello Admin: создайте список из пяти и более имен пользователей, включающий имя 'admin' . Представьте, что вы пишете код, который выводит приветственное сообщение для каждого пользователя после его входа на сайт. Переберите элементы списка и выведите со- общение для каждого пользователя: • Для пользователя с именем 'admin’ выведите особое сообщение — например, «Hello admin, would you like to see a status report?». • В остальных случаях выводите универсальное приветствие — например, «Hello Jaden, thank you for logging in again». 5.9. Без пользователей: добавьте в hello_admin .py команду if , которая проверит, что список пользователей не пуст. • Если список пуст, выведите сообщение «We need to ind some users!». • Удалите из списка все имена пользователей и убедитесь в том, что программа выво- дит правильное сообщение. 5.10. Проверка имен пользователей: выполните следующие действия для создания про- граммы, моделирующей проверку уникальности имен пользователей. • Создайте список current_users , содержащий пять и более имен пользователей. • Создайте другой список, new_users , содержащий пять имен пользователей. Убеди- тесь в том, что одно или два новых имени также присутствуют в списке current_ users • Переберите список new_users и для каждого имени в этом списке проверьте, было ли оно использовано ранее. Если имя уже использовалось, выведите сообщение о том, что пользователь должен выбрать новое имя. Если имя не использовалось, выведите сообщение о его доступности. 104 Глава 5 • Команды if • Проследите за тем, чтобы сравнение выполнялось без учета регистра символов. Если имя 'John' уже используется, в регистрации имени 'JOHN' следует отказать. (Для этого необходимо создать копию current_users , содержащую версию всех су- ществующих имен пользователей в нижнем регистре.) 5.11. Порядковые числительные: порядковые числительные в английском языке заканчи- ваются суффиксом th (кроме 1st, 2nd и 3rd). • Сохраните числа от 1 до 9 в списке. • Переберите элементы списка. • Используйте цепочку if-elif-else в цикле для вывода правильного окончания чис- лительного для каждого числа. Программа должна выводить числительные "1st 2nd 3rd 4th 5th 6th 7th 8th 9th" , причем каждый результат должен располагаться в от- дельной строке. Оформление команд if Во всех примерах этой главы применялись правила стилевого оформления. В PEP 8 приведена только одна рекомендация, касающаяся проверки условий: заключать операторы сравнения (такие, как == , >= , <= и т. д.) в одиночные пробелы. Напри- мер, запись if age < 4: лучше, чем: if age<4: Пробелы не влияют на интерпретацию вашего кода Python; они только упрощают чтение кода вами и другими разработчиками. УПРАЖНЕНИЯ 5.12. Стиль оформления команд if: проанализируйте программы, написанные в этой главе, и проверьте, правильно ли вы оформляли условия. 5.13. Ваши идеи: к этому моменту вы уже стали более квалифицированным программи- стом, чем когда начинали читать книгу. Теперь вы лучше представляете, как в программах моделируются явления реального мира, и сможете сами придумать задачи, которые будут решаться в ваших программах. Запишите несколько задач, которые вам хотелось бы ре- шить по мере роста вашего профессионального мастерства. Может быть, это какие-то ком- пьютерные игры, задачи анализа наборов данных или веб-приложения? Итоги В этой главе вы научились писать условия, результатом которых всегда является логическое значение ( True или False ). Вы научились писать простые команды if , цепочки if - else и цепочки if - elif - else . Вы начали использовать эти структуры Итоги 105 для выявления конкретных условий, которые необходимо проверить, и проверки этих условий в ваших программах. Вы узнали, как обеспечить специальную обра- ботку некоторых элементов в списке, с сохранением эффективности циклов for Также мы вернулись к стилевым рекомендациям Python, с которыми более слож- ные программы становятся относительно простыми для чтения и понимания. В главе 6 рассматриваются словари Python. Словарь отчасти напоминает список, но он позволяет связывать разные виды информации. Вы научитесь создавать словари, перебирать их элементы, использовать их в сочетании со списками и командами if . Словари помогут вам моделировать еще более широкий спектр реальных ситуаций. 6 Словари В этой главе речь пойдет о словарях — структурах данных, предназначенных для объединения взаимосвязанной информации. Вы узнаете, как получить доступ к ин- формации, хранящейся в словаре, и как изменить эту информацию. Так как объем данных в словаре практически безграничен, мы рассмотрим средства перебора данных в словарях. Кроме того, вы научитесь использовать вложенные словари в списках, вложенные списки в словарях и даже словари в других словарях. Операции со словарями позволяют моделировать всевозможные реальные объекты с большей точностью. Вы узнаете, как создать словарь, описывающий человека, и сохранить в нем сколько угодно информации об этом человеке. В словаре может храниться имя, возраст, место жительства, профессия и любые другие атрибуты. Вы узнаете, как сохранить любые два вида информации, способные образовать пары: список слов и их значений, список имен людей и их любимых чисел, список гор и их высот и т. д. Простой словарь Возьмем игру с инопланетными пришельцами, которые имеют разные цвета и при- носят разное количество очков игроку. В следующем простом словаре хранится информация об одном конкретном пришельце: alien.py alien_0 = {'color': 'green', 'points': 5} print(alien_0['color']) print(alien_0['points']) В словаре alien_0 хранятся два атрибута: цвет ( color ) и количество очков ( points ). Следующие две команды print читают эту информацию из словаря и выводят ее на экран: green 5 Работа со словарями 107 Работа со словарями, как и большинство других новых концепций, требует опре- деленного опыта. Стоит вам немного поработать со словарями, и вы увидите, как эффективно они работают при моделировании реальных ситуаций. Работа со словарями Словарь в языке Python представляет собой совокупность пар «ключ-значение». Каждый ключ связывается с некоторым значением, и программа может получить значение, связанное с заданным ключом. Значением может быть число, строка, список и даже другой словарь. Собственно, любой объект, создаваемый в программе Python, может стать значением в словаре. В Python словарь заключается в фигурные скобки {} , в которых приводится по- следовательность пар «ключ-значение», как в предыдущем примере: alien_0 = {'color': 'green', 'points': 5} Пара «ключ-значение» представляет данные, связанные друг с другом. Если вы ука- жете ключ, то Python вернет значение, связанное с этим ключом. Ключ отделяется от значения двоеточием, а отдельные пары разделяются запятыми. В словаре может храниться любое количество пар «ключ-значение». Простейший словарь содержит ровно одну пару «ключ-значение», как в следующей измененной версии словаря alien_0 : alien_0 = {'color': 'green'} В этом словаре хранится ровно один фрагмент информации о пришельце alien_0 , а именно его цвет. Строка 'color' является ключом в словаре; с этим ключом свя- зано значение 'green' Обращение к значениям в словаре Чтобы получить значение, связанное с ключом, укажите имя словаря, а затем ключ в квадратных скобках: alien.py alien_0 = {'color': 'green'} print(alien_0['color']) Эта конструкция возвращает значение, связанное с ключом 'color' из словаря alien_0 : green Количество пар «ключ-значение» в словаре не ограничено. Например, вот как вы- глядит исходный словарь alien_0 с двумя парами «ключ-значение»: alien_0 = {'color': 'green', 'points': 5} 108 Глава 6 • Словари Теперь программа может получить значение, связанное с любым из ключей в alien_0 : color или points . Если игрок сбивает корабль пришельца, то для полу- чения количества заработанных им очков может использоваться код следующего вида: alien_0 = {'color': 'green', 'points': 5} ❶ new_points = alien_0['points'] ❷ print(f"You just earned {new_points} points!") После того как словарь будет определен, код извлекает значение, связанное с ключом 'points' , из словаря. Затем это значение сохраняется в переменной new_points . Строка преобразует целое значение в строку и выводит сообщение с количеством заработанных очков: You just earned 5 points! Если этот код будет выполняться каждый раз, когда игрок сбивает очередного при- шельца, программа будет получать правильное количество очков. Добавление новых пар «ключ-значение» Словари относятся к динамическим структурам данных: в словарь можно в любой момент добавлять новые пары «ключ-значение». Для этого указывается имя сло- варя, за которым в квадратных скобках следует новый ключ с новым значением. Добавим в словарь alien_0 еще два атрибута: координаты x и y для вывода изобра- жения пришельца в определенной позиции экрана. Допустим, пришелец должен отображаться у левого края экрана, в 25 пикселах от верхнего края. Так как система экранных координат обычно располагается в левом верхнем углу, для размещения пришельца у левого края координата x должна быть равна 0, а координата y — 25: alien.py alien_0 = {'color': 'green', 'points': 5} print(alien_0) ❶ alien_0['x_position'] = 0 ❷ alien_0['y_position'] = 25 print(alien_0) Программа начинается с определения того же словаря, с которым мы уже работали ранее. После этого выводится «снимок» текущего состояния словаря. В точке в словарь добавляется новая пара «ключ-значение»: ключ 'x_position' и значе- ние 0 . То же самое делается для ключа 'y_position' в точке . При выводе изме- ненного словаря мы видим две дополнительные пары «ключ-значение»: {'color': 'green', 'points': 5} {'color': 'green', 'points': 5, 'y_position': 25, 'x_position': 0} Работа со словарями 109 Окончательная версия словаря содержит четыре пары «ключ-значение». Первые две определяют цвет и количество очков, а другие две — координаты. ПРИМЕЧАНИЕ В версии Python 3 .7 словари сохраняют исходный порядок добавления пар «ключ-значение» . Когда вы выводите словарь или перебираете его элементы, вы будете получать элементы в том порядке, в каком они добавлялись в словарь . Создание пустого словаря В некоторых ситуациях бывает удобно (или даже необходимо) начать с пустого словаря, а затем добавлять в него новые элементы. Чтобы начать заполнение пу- стого словаря, определите словарь с пустой парой фигурных скобок, а затем добав- ляйте новые пары «ключ-значение» (каждая пара в отдельной строке). Например, вот как строится словарь alien_0 : alien.py alien_0 = {} alien_0['color'] = 'green' alien_0['points'] = 5 print(alien_0) Программа определяет пустой словарь alien_0 , после чего добавляет в него зна- чения для цвета и количества очков. В результате создается словарь, который ис- пользовался в предыдущих примерах: {'color': 'green', 'points': 5} Обычно пустые словари используются при хранении данных, введенных пользова- телем, или при написании кода, автоматически генерирующего большое количество пар «ключ-значение». Изменение значений в словаре Чтобы изменить значение в словаре, укажите имя словаря с ключом в квадратных скобках, а затем новое значение, которое должно быть связано с этим ключом. До- пустим, в процессе игры цвет пришельца меняется с зеленого на желтый: alien.py alien_0 = {'color': 'green'} print(f"The alien is {alien_0['color']}.") alien_0['color'] = 'yellow' print(f"The alien is now {alien_0['color']}.") 110 Глава 6 • Словари Сначала определяется словарь alien_0 , который содержит только цвет пришельца; затем значение, связанное с ключом 'color' , меняется на 'yellow' . Из выходных данных видно, что цвет пришельца действительно сменился с зеленого на желтый: The alien is green. The alien is now yellow. Рассмотрим более интересный пример: отслеживание позиции пришельца, который может двигаться с разной скоростью. Мы сохраним значение, представляющее текущую скорость пришельца, и используем его для определения величины гори- зонтального смещения: alien_0 = {'x_position': 0, 'y_position': 25, 'speed': 'medium'} print(f"Original position: {alien_0['x_position']}") # Пришелец перемещается вправо. # Вычисляем величину смещения на основании текущей скорости. ❶ if alien_0['speed'] == 'slow': x_increment = 1 elif alien_0['speed'] == 'medium': x_increment = 2 else: # Пришелец двигается быстро. x_increment = 3 # Новая позиция равна сумме старой позиции и приращения. ❷ alien_0['x_position'] = alien_0['x_position'] + x_increment print(f"New position: {alien_0['x_position']}") Сначала определяется словарь с исходной позицией (координаты x и y) и скоростью 'medium' . Значения цвета и количества очков для простоты опущены, но с ними этот пример работал бы точно так же. Аналогично выводится исходное значение x_position В точке цепочка if - elif - else определяет, на какое расстояние пришелец должен переместиться вправо; полученное значение сохраняется в переменной x_increment Если пришелец двигается медленно ( 'slow' ), то он перемещается на одну единицу вправо; при средней скорости ( 'medium' ) он перемещается на две единицы вправо; наконец, при высокой скорости ( 'fast' ) он перемещается на три единицы вправо. Вычисленное смещение прибавляется к значению x_position в , а результат со- храняется в словаре с ключом x_position Для пришельца со средней скоростью позиция смещается на две единицы: Original x-position: 0 New x-position: 2 Получается, что изменение одного значения в словаре изменяет все поведение при- шельца. Например, чтобы превратить пришельца со средней скоростью в быстрого, добавьте следующую строку: alien_0['speed'] = fast |