Книга Изучаем Python
Скачать 4.68 Mb.
|
98 Глава 5 • Команды if в точке . Когда имя списка используется в условии 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("Adding " + requested_topping + ".") else: print("Sorry, we don't have " + requested_topping + ".") print("\nFinished making your pizza!") В точке определяется список доступных дополнений к пицце. Стоит заметить, что если в пиццерии используется постоянный ассортимент дополнений, этот спи- сок можно реализовать в виде кортежа. В точке создается список дополнений, заказанных клиентом. Обратите внимание на необычный заказ 'french fries' В точке программа перебирает список заказанных дополнений. Внутри цикла программа сначала проверяет, что каждое заказанное дополнение присутствует в списке доступных дополнений . Если дополнение доступно, оно добавляется в пиццу. Если заказанное дополнение не входит в список, выполняется блок else . Блок else выводит сообщение о том, что дополнение недоступно. С этим синтаксисом программа выдает четкий, содержательный вывод: Оформление команд if 99 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 Eric, thank you for logging in again» . 5-9 . Без пользователей: добавьте в hello_admin .py команду if, которая проверит, что список пользователей не пуст . • Если список пуст, выведите сообщение: «We need to find some users!» • Удалите из списка все имена пользователей и убедитесь в том, что программа выво- дит правильное сообщение . 5-10 . Проверка имен пользователей: выполните следующие действия для создания про- граммы, моделирующей проверку уникальности имен пользователей . • Создайте список current_users, содержащий пять и более имен пользователей . • Создайте другой список new_users, содержащий пять и более имен пользователей . Убедитесь в том, что одно или два новых имени также присутствуют в списке current_ users . • Переберите список new_users и для каждого имени в этом списке проверьте, было ли оно использовано ранее . Если имя уже использовалось, выведите сообщение о том, что пользователь должен выбрать новое имя . Если имя не использовалось, выведите сообщение о его доступности . • Проследите за тем, чтобы сравнение выполнялось без учета регистра символов . Если имя 'John’ уже используется, в регистрации имени ‘JOHN’ следует отказать . 5-11 . Порядковые числительные: порядковые числительные в английском языке заканчива- ются суффиксом th (кроме 1st, 2nd и 3rd) . • Сохраните числа от 1 до 9 в списке . • Переберите элементы списка . • Используйте цепочку if-elif-else в цикле для вывода правильного окончания числи- тельного для каждого числа . Программа должна выводить числительные «1st 2nd 3rd 4th 5th 6th 7th 8th 9th», причем каждый результат должен располагаться в отдельной строке . Оформление команд if Во всех примерах этой главы применялись правила стилевого оформления. В PEP 8 приведена только одна рекомендация, касающаяся проверки условий: заключать 100 Глава 5 • Команды if операторы сравнения (такие, как == , >= , <= и т. д.) в одиночные пробелы. Напри- мер, запись if age < 4: лучше, чем: if age<4: Пробелы не влияют на интерпретацию вашего кода Python; они только упрощают чтение кода вами и другими разработчиками. УПРАЖНЕНИЯ 5-12 . Стиль оформления команд if: проанализируйте программы, написанные в этой главе, и проверьте, правильно ли вы оформляли условия . 5-13 . Ваши идеи: к этому моменту вы уже стали более квалифицированным программистом, чем в начале книги . Теперь вы лучше представляете, как в программах моделируются яв- ления реального мира, и сможете сами придумать задачи, которые будут решаться в ваших программах . Запишите несколько задач, которые вам хотелось бы решить с ростом вашего профессионального мастерства . Может быть, это какие-то компьютерные игры, задачи ана- лиза наборов данных или веб-приложения? Итоги В этой главе вы научились писать условия, результатом которых всегда яв- ляется логическое значение ( True или False .) Вы научились писать простые команды if , цепочки if - else и цепочки if - elif - else . Вы начали использовать эти структуры для выявления конкретных условий, которые необходимо про- верить, и проверки этих условий в ваших программах. Вы узнали, как обес- печить специальную обработку некоторых элементов в списке с сохранением эффективности циклов 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 Работа со словарями, как и большинство других новых концепций, требует опре- деленного опыта. Стоит вам немного поработать со словарями, и вы увидите, как эффективно они работают при моделировании реальных ситуаций. 102 Глава 6 • Словари Работа со словарями Словарь в языке Python представляет собой совокупность пар «ключ—значение». Каждый ключ связывается с некоторым значением, и программа может получить значение, связанное с заданным ключом. Значением может быть число, строка, список и даже другой словарь. Собственно, любой объект, создаваемый в программе Python, может стать значением в словаре. В Python словарь заключается в фигурные скобки {} , в которых приводится по- следовательность пар «ключ—значение», как в предыдущем примере: alien_0 = {'color': 'green', 'points': 5} Пара «ключ—значение» представляет собой данные, связанные друг с другом. Если вы укажете ключ, то Python вернет значение, связанное с этим ключом. Ключ отде- ляется от значения двоеточием, а отдельные пары разделяются запятыми. В словаре может храниться любое количество пар «ключ—значение». Простейший словарь содержит ровно одну пару «ключ—значение», как в следу- ющей измененной версии словаря alien_0 : alien_0 = {'color': 'green'} В этом словаре хранится ровно один фрагмент информации о пришельце alien_0 , а именно — его цвет. Строка 'color' является ключом в словаре; с этим ключом связано значение 'green' Обращение к значениям в словаре Чтобы получить значение, связанное с ключом, укажите имя словаря, а затем ключ в квадратных скобках: alien_0 = {'color': 'green'} print(alien_0['color']) Эта конструкция возвращает значение, связанное с ключом 'color' , из словаря alien_0 : green Количество пар «ключ—значение» в словаре не ограничено. Например, вот как выглядит исходный словарь alien_0 с двумя парами «ключ—значение»: alien_0 = {'color': 'green', 'points': 5} Теперь программа может получить значение, связанное с любым из ключей в alien_0 : color или points . Если игрок сбивает корабль пришельца, для получения заработанных им очков может использоваться код следующего вида: alien_0 = {'color': 'green', 'points': 5} new_points = alien_0['points'] print("You just earned " + str(new_points) + " points!") Работа со словарями 103 После того как словарь будет определен, код извлекает значение, связанное с ключом 'points' , из словаря. Затем это значение сохраняется в переменной new_points . Строка преобразует целое значение в строку и выводит сообщение с количеством заработанных очков: You just earned 5 points! Если этот код будет выполняться каждый раз, когда игрок сбивает очередного при- шельца, программа будет получать правильное количество очков. Добавление новых пар «ключ—значение» Словари относятся к динамическим структурам данных: в словарь можно в любой момент добавлять новые пары «ключ—значение». Для этого указывается имя сло- варя, за которым в квадратных скобках следует новый ключ с новым значением. Добавим в словарь alien_0 еще два атрибута: координаты x и y для вывода изобра- жения пришельца в определенной позиции экрана. Допустим, пришелец должен отображаться у левого края экрана, в 25 пикселах от верхнего края. Так как система экранных координат обычно располагается в левом верхнем углу, для размещения пришельца у левого края координата x должна быть равна 0, а координата y — 25: 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} Окончательная версия словаря содержит четыре пары «ключ—значение». Первые две определяют цвет и количество очков, а другие две — координаты. Обратите внимание: порядок пар «ключ—значение» не соответствует порядку их добавления. Python не интересует, в каком порядке добавлялись пары; важна лишь связь между каждым ключом и его значением. Создание пустого словаря В некоторых ситуациях бывает удобно (или даже необходимо) начать с пустого словаря, а затем добавлять в него новые элементы. Чтобы начать заполнение пу- стого словаря, определите словарь с пустой парой фигурных скобок, а затем добав- ляйте новые пары «ключ—значение» (каждая пара в отдельной строке). Например, вот как строится словарь alien_0: 104 Глава 6 • Словари alien_0 = {} alien_0['color'] = 'green' alien_0['points'] = 5 print(alien_0) Программа определяет пустой словарь alien_0 , после чего добавляет в него зна- чения для цвета и количества очков. В результате создается словарь, который ис- пользовался в предыдущих примерах: {'color': 'green', 'points': 5} Обычно пустые словари используются при хранении данных, введенных пользова- телем, или при написании кода, автоматически генерирующего большое количество пар «ключ—значение». Изменение значений в словаре Чтобы изменить значение в словаре, укажите имя словаря с ключом в квадратных скобках, а затем новое значение, которое должно быть связано с этим ключом. До- пустим, в процессе игры цвет пришельца меняется с зеленого на желтый: alien_0 = {'color': 'green'} print("The alien is " + alien_0['color'] + ".") alien_0['color'] = 'yellow' print("The alien is now " + alien_0['color'] + ".") Сначала определяется словарь alien_0 , который содержит только цвет пришельца; затем значение, связанное с ключом 'color' , меняется на 'yellow' . Из выходных данных видно, что цвет пришельца действительно сменился с зеленого на желтый: The alien is green. The alien is now yellow. Рассмотрим более интересный пример: отслеживание позиции пришельца, который может двигаться с разной скоростью. Мы сохраним значение, представляющее текущую скорость пришельца, и используем его для определения величины гори- зонтального смещения: alien_0 = {'x_position': 0, 'y_position': 25, 'speed': 'medium'} print("Original x-position: " + str(alien_0['x_position'])) # Пришелец перемещается вправо. # Вычисляем величину смещения на основании текущей скорости. if alien_0['speed'] == 'slow': x_increment = 1 elif alien_0['speed'] == 'medium': x_increment = 2 else: # Пришелец двигается быстро. x_increment = 3 # Новая позиция равна сумме старой позиции и приращения. Работа со словарями 105 alien_0['x_position'] = alien_0['x_position'] + x_increment print("New x-position: " + str(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 При следующем выполнении кода блок if - elif - else присвоит x_increment большее значение. Удаление пар «ключ—значение» Когда информация, хранящаяся в словаре, перестает быть ненужной, пару «ключ— значение» можно полностью удалить при помощи команды del . При вызове до- статочно передать имя словаря и удаляемый ключ. Например, в следующем примере из словаря alien_0 удаляется ключ 'points' вместе со значением: alien_0 = {'color': 'green', 'points': 5} print(alien_0) del alien_0['points'] print(alien_0) Строка приказывает Python удалить ключ 'points' из словаря alien_0 , а также удалить значение, связанное с этим ключом. Из вывода видно, что ключ 'points' и его значение 5 исчезли из словаря, но остальные данные остались без измене- ний: {'color': 'green', 'points': 5} {'color': 'green'} 106 Глава 6 • Словари ПРИМЕЧАНИЕ Учтите, что удаление пары «ключ—значение» отменить уже не удастся . Словарь с однотипными объектами В предыдущем примере в словаре сохранялась разнообразная информация об одном объекте (пришельце из компьютерной игры). Словарь также может ис- пользоваться для хранения одного вида информации о многих объектах. Допустим, вы хотите провести опрос среди коллег и узнать их любимый язык программиро- вания. Результаты простого опроса удобно сохранить в словаре: favorite_languages = { 'jen': 'python', 'sarah': 'c', 'edward': 'ruby', 'phil': 'python', } Пары в словаре в этой записи разбиты по строкам. Ключами являются имена участ- ников опроса, а значениями — выбранные ими языки. Если вы знаете, что для определения словаря потребуется более одной строки, нажмите клавишу Enter по- сле ввода открывающей фигурной скобки. Снабдите следующую строку отступом на один уровень (четыре пробела) и запишите первую пару «ключ—значение», по- ставив за ней запятую. После этого при нажатии Enter ваш текстовый редактор будет автоматически снабжать все последующие пары таким же отступом, как у первой. Завершив определение словаря, добавьте закрывающую фигурную скобку в новой строке после последней пары «ключ—значение» и снабдите ее отступом на один уровень, чтобы она была выровнена по ключам. За последней парой также рекомен- дуется включить запятую, чтобы при необходимости все было готово к добавлению новой пары «ключ—значение» в следующей строке. |