Изучаем Python — страница 13 из 61


Объединение команд if со списками открывает ряд интересных возможностей. Например, вы можете отслеживать специальные значения, для которых необходима особая обработка по сравнению с другими значениями в списке, или эффективно управлять изменяющимися условиями — например, наличием некоторых блюд в ресторане. Также объединение команд if со списками помогает продемонстрировать, что ваш код корректно работает во всех возможных ситуациях.

Проверка специальных значений


Эта глава началась с простого примера, показывающего, как обрабатывать особые значения (такие, как 'bmw'), которые должны выводиться в другом формате по сравнению с другими значениями в списке. Теперь, когда вы лучше разбираетесь в проверках условий и командах if, давайте повнимательнее рассмотрим процесс поиска и обработки особых значений в списке.

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

toppings.py

requested_toppings = ['mushrooms', 'green peppers', 'extra cheese']


for requested_topping in requested_toppings:

. .print("Adding " + requested_topping + ".")


print("\nFinished making your pizza!")

Вывод достаточно тривиален, поэтому код сводится к простому циклу 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:

(1) if requested_topping == 'green peppers':

. . . .print("Sorry, we are out of green peppers right now.")

(2) else:

print("Adding " + requested_topping + ".")


print("\nFinished making your pizza!")

На этот раз программа проверяет каждый заказанный элемент перед добавлением его к пицце. В точке (1) программа проверяет, заказал ли клиент зеленый перец, и если заказал — выводит сообщение о том, что этого дополнения нет. Блок else в точке (2) гарантирует, что все другие дополнения будут включены в заказ.

Из выходных данных видно, что все заказанные дополнения обрабатываются правильно:

Adding mushrooms.

Sorry, we are out of green peppers right now.

Adding extra cheese.


Finished making your pizza!

Проверка наличия элементов в списке


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

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

(1) requested_toppings = []


(2)if requested_toppings:

for requested_topping in requested_toppings:

print("Adding " + requested_topping + ".")

print("\nFinished making your pizza!")

(3)else:

. .print("Are you sure you want a plain pizza?")

На этот раз мы начинаем с пустого списка заказанных дополнений в точке (1) . Вместо того чтобы сразу переходить к циклу for, программа выполняет проверку в точке (2). Когда имя списка используется в условии if, Python возвращает True, если список содержит хотя бы один элемент; если список пуст, возвращается значение False. Если requested_toppings проходит проверку условия, выполняется тот же цикл for, который мы использовали в предыдущем примере. Если же условие ложно, то программа выводит сообщение, которое предлагает клиенту подтвердить, действительно ли он хочет получить базовую пиццу без дополнений (3).

В данном примере список пуст, поэтому выводится сообщение:

Are you sure you want a plain pizza?

Если в списке есть хотя бы один элемент, в выходные данные включается каждое заказанное дополнение.

Множественные списки


Посетители способны заказать что угодно, особенно когда речь заходит о дополнениях к пицце. Что если клиент захочет положить на пиццу картофель фри? Списки и команды if позволят вам убедиться в том, что входные данные имеют смысл, прежде чем обрабатывать их.

Давайте проверим наличие нестандартных дополнений перед тем, как готовить пиццу. В следующем примере определяются два списка. Первый список содержит перечень доступных дополнений, а второй — список дополнений, заказанных клиентом. На этот раз каждый элемент из requested_toppings проверяется по списку доступных дополнений перед добавлением в пиццу:

(1) available_toppings = ['mushrooms', 'olives', 'green peppers',

. . . . . . . . . . 'pepperoni', 'pineapple', 'extra cheese']


(2)requested_toppings = ['mushrooms', 'french fries', 'extra cheese']


(3)for requested_topping in requested_toppings:

(4) . .if requested_topping in available_toppings:

. . . .print("Adding " + requested_topping + ".")

(5) . .else:

. . . .print("Sorry, we don't have " + requested_topping + ".")

. . . .

print("\nFinished making your pizza!")

В точке (1) определяется список доступных дополнений к пицце. Стоит заметить, что если в пиццерии используется постоянный ассортимент дополнений, этот список можно реализовать в виде кортежа. В точке (2) создается список дополнений, заказанных клиентом. Обратите внимание на необычный заказ 'french fries'. В точке (3) программа перебирает список заказанных дополнений. Внутри цикла программа сначала проверяет, что каждое заказанное дополнение присутствует в списке доступных дополнений (4). Если дополнение доступно, оно добавляется в пиццу. Если заказанное дополнение не входит в список, выполняется блок else (5). Блок 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 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 приведена только одна рекомендация, касающаяся проверки условий: заключать операторы сравнения (такие, как ==, >=, <= и т.д.) в одиночные пробелы. Например, запись

if age < 4:

лучше, чем:

if age<4:

Пробелы не влияют на интерпретацию вашего кода Python; они только упрощают чтение кода вами и другими разработчиками.

Упражнения

5-12. Стиль оформления команд if: проанализируйте программы, написанные в этой главе, и проверьте, правильно ли вы оформляли условия.

5-13. Ваши идеи: к этому моменту вы уже стали более квалифицированным программистом, чем в начале книги. Теперь вы лучше представляете, как в программах моделируются явления реального мира, и сможете сами придумать задачи, которые будут решаться в ваших программах. Запишите несколько задач, которые вам хотелось бы решить с ростом вашего профессионального мастерства. Может быть, это какие-то компьютерные игры, задачи анализа наборов данных или веб-приложения?