Книга Изучаем Python
Скачать 4.68 Mb.
|
89 условия. Результат логического выражения равен True или False , как и результат условного выражения после его вычисления. Логические выражения часто используются для проверки некоторых условий — например, запущена ли компьютерная игра или разрешено ли пользователю редак- тирование некоторой информации на сайте: game_active = True can_edit = False Логические выражения предоставляют эффективные средства для контроля со- стояния программы или определенного условия, играющего важную роль в вашей программе. УПРАЖНЕНИЯ 5-1 . Проверка условий: напишите последовательность условий . Выведите описание каждой проверки и ваш прогноз относительно ее результата . Код должен выглядеть примерно так: car = 'subaru' print("Is car == 'subaru'? I predict True.") print(car == 'subaru') print("\nIs car == 'audi'? I predict False.") print(car == 'audi') • Внимательно просмотрите результаты . Убедитесь в том, что вы понимаете, почему результат каждой строки равен True или False . • Создайте как минимум 10 условий . Не менее 5 должны давать результат True, а не менее 5 других — результат False . 5-2 . Больше условий: количество условий не ограничивается 10 . Попробуйте написать дру- гие условия и включить их в conditional_tests .py . Программа должна выдавать по крайней мере один истинный и один ложный результат для следующих видов проверок . • Проверка равенства и неравенства строк . • Проверки с использованием функции lower() . • Числовые проверки равенства и неравенства, условий «больше», «меньше», «больше или равно», «меньше или равно» . • Проверки с ключевым словом and и or . • Проверка вхождения элемента в список . • Проверка отсутствия элемента в списке . Команды if Когда вы поймете, как работают проверки условий, можно переходить к написанию команд if . Существуют несколько разновидностей команд if , и выбор варианта зависит от количества проверяемых условий. Примеры команд if уже встречались вам при обсуждении проверки условий, но сейчас эта тема будет рассмотрена более подробно. 90 Глава 5 • Команды if Простые команды if Простейшая форма команды if состоит из одного условия и одного действия: if условие: действие В первой строке размещается условие, а в блоке с отступом — практически любое действие. Если условие истинно, то Python выполняет код в блоке после команды if , а если ложно, этот код игнорируется. Допустим, имеется переменная, представляющая возраст человека. Следующий код проверяет, что этот возраст достаточен для голосования: voting.py age = 19 if age >= 18: print("You are old enough to vote!") В точке Python проверяет, что значение переменной age больше или равно 18. В таком случае выполняется команда print в строке с отступом: You are old enough to vote! Отступы в командах if играют ту же роль, что и в циклах for . Если условие истин- но, то все строки с отступом после команды if выполняются, а если ложно — весь блок с отступом игнорируется. Блок команды if может содержать сколько угодно строк. Добавим еще одну строку для вывода дополнительного сообщения в том случае, если возраст достаточен для голосования: age = 19 if age >= 18: print("You are old enough to vote!") print("Have you registered to vote yet?") Условие выполняется, а обе команды print снабжены отступом, поэтому выводятся оба сообщения: You are old enough to vote! Have you registered to vote yet? Если значение age меньше 18, программа ничего не выводит. Команды if-else Часто в программе необходимо выполнить одно действие в том случае, если ус- ловие истинно, и другое действие, если оно ложно. С синтаксисом if - else это возможно. Блок if - else в целом похож на команду if , но секция else определяет действие или набор действий, выполняемых при неудачной проверке. Команды if 91 В следующем примере выводится то же сообщение, которое выводилось ранее, если возраст достаточен для голосования, но на этот раз при любом другом возрасте выводится другое сообщение: age = 17 if age >= 18: print("You are old enough to vote!") print("Have you registered to vote yet?") else: print("Sorry, you are too young to vote.") print("Please register to vote as soon as you turn 18!") Если условие истинно, то выполняется первый блок с командами print . Если же условие ложно, выполняется блок else в точке . Так как значение age на этот раз меньше 18, условие оказывается ложным, и выполняется код в блоке else : Sorry, you are too young to vote. Please register to vote as soon as you turn 18! Этот код работает, потому что существуют всего две возможные ситуации: воз- раст либо достаточен для голосования, либо недостаточен. Структура if - else хорошо подходит для тех ситуаций, в которых Python всегда выполняет только одно из двух возможных действий. В подобных простых цепочках if - else всегда выполняется одно из двух возможных действий. Цепочки if-elif-else Нередко в программе требуется проверять более двух возможных ситуаций; для таких ситуаций в Python предусмотрен синтаксис if - elif - else . Python выполняет только один блок в цепочке if - elif - else . Все условия проверяются по порядку до тех пор, пока одно из них не даст истинный результат. Далее выполняется код, следующий за этим условием, а все остальные проверки Python пропускает. Во многих реальных ситуациях существуют более двух возможных результатов. Представьте себе парк аттракционов, который взимает разную плату за вход для разных возрастных групп: Для посетителей младше 4 лет вход бесплатный. Для посетителей от 4 до 18 лет билет стоит $5. Для посетителей от 18 лет и старше билет стоит $10. Как использовать команду if для определения платы за вход? Следующий код определяет, к какой возрастной категории относится посетитель, и выводит со- общение со стоимостью билета: amusement_park.py age = 12 if age < 4: print("Your admission cost is $0.") elif age < 18: print("Your admission cost is $5.") 92 Глава 5 • Команды if else: print("Your admission cost is $10.") Условие if в точке проверяет, что возраст посетителя меньше 4 лет. Если условие истинно, то программа выводит соответствующее сообщение, и Python пропускает остальные проверки. Строка elif в точке в действительности является еще одной проверкой if , которая выполняется только в том случае, если предыдущая проверка завершилась неудачей. В этом месте цепочки известно, что возраст посетителя не меньше 4 лет, потому что первое условие было ложным. Если посетителю меньше 18 лет, программа выводит соответствующее сообщение, и Python пропускает блок else . Если ложны оба условия — if и elif , то Python выполняет код в блоке else в точке . В данном примере условие дает ложный результат, поэтому его блок не выпол- няется. Однако второе условие оказывается истинным (12 меньше 18), поэтому код будет выполнен. Вывод состоит из одного сообщения с ценой билета: Your admission cost is $5. При любом значении возраста больше 17 первые два условия ложны. В таких си- туациях блок else будет выполнен, и цена билета составит $10. Вместо того чтобы выводить сообщение с ценой билета в блоках if - elif - else , лучше использовать другое, более компактное решение: присвоить цену в цепочке if - elif - else , а затем добавить одну команду print после выполнения цепочки: age = 12 if age < 4: price = 0 elif age < 18: price = 5 else: price = 10 print("Your admission cost is $" + str(price) + ".") Строки , и присваивают значение price в зависимости от значения age , как и в предыдущем примере. После присваивания цены в цепочке if - elif - else отдельная команда print без отступа использует это значение для вывода со- общения с ценой билета. Этот пример выводит тот же результат, что и предыдущий, но цепочка if - elif - else имеет более четкую специализацию. Вместо того чтобы определять цену и выво- дить сообщения, она просто определяет цену билета. Кроме повышения эффектив- ности, у этого кода есть дополнительное преимущество: лучшая изменяемость. Чтобы изменить текст выходного сообщения, достаточно будет отредактировать всего одну команду print — вместо трех разных команд. Серии блоков elif Код может содержать сколько угодно блоков elif . Например, если парк аттракци- онов введет особую скидку для пожилых посетителей, вы можете добавить в свой Команды if 93 код еще одну проверку для определения того, распространяется ли скидка на те- кущего посетителя. Допустим, посетители с возрастом 65 и выше платят половину от обычной цены билета, или $5: age = 12 if age < 4: price = 0 elif age < 18: price = 5 elif age < 65: price = 10 else: price = 5 print("Your admission cost is $" + str(price) + ".") Бульшая часть кода осталась неизменной. Второй блок elif в точке теперь убеждается в том, что посетителю меньше 65 лет, прежде чем назначить ему пол- ную цену билета $10. Обратите внимание: значение, присвоенное в блоке else , должно быть заменено на $5, потому что до этого блока доходят только посетители с возрастом 65 и выше. Отсутствие блока else Python не требует, чтобы цепочка if - elif непременно завершалась блоком else Иногда блок else удобен; в других случаях бывает нагляднее использовать допол- нительную секцию elif для обработки конкретного условия: age = 12 if age < 4: price = 0 elif age < 18: price = 5 elif age < 65: price = 10 elif age >= 65: price = 5 print("Your admission cost is $" + str(price) + ".") Блок elif в точке назначает цену $5, если возраст посетителя равен 65 и выше; смысл такого кода более понятен, чем у обобщенного блока else . С таким измене- нием выполнение каждого блока возможно только при истинности конкретного условия. Блок else «универсален»: он обрабатывает все условия, не подходящие ни под одну конкретную проверку if или elif , причем в эту категорию иногда могут попасть недействительные или даже вредоносные данные. Если у вас имеется завершающее конкретное условие, лучше используйте завершающий блок elif и опустите блок else . В этом случае вы можете быть уверены в том, что ваш код будет выполняться только в правильных условиях. 94 Глава 5 • Команды if Проверка нескольких условий Цепочки if - elif - else эффективны, но они подходят только в том случае, если ис- тинным должно быть только одно условие. Как только Python находит выполня- ющееся условие, все остальные проверки пропускаются. Такое поведение доста- точно эффективно, потому что оно позволяет проверить одно конкретное условие. Однако иногда бывает важно проверить все условия, представляющие интерес. В таких случаях следует применять серии простых команд if без блоков elif или else . Такое решение уместно, когда истинными могут быть сразу несколько усло- вий и вы хотите отреагировать на все истинные условия. Вернемся к примеру с пиццей. Если кто-то закажет пиццу с двумя дополнениями, программа должна обработать оба дополнения: toppings.py requested_toppings = ['mushrooms', 'extra cheese'] if 'mushrooms' in requested_toppings: print("Adding mushrooms.") if 'pepperoni' in requested_toppings: print("Adding pepperoni.") if 'extra cheese' in requested_toppings: print("Adding extra cheese.") print("\nFinished making your pizza!") Обработка начинается в точке со списка, содержащего заказанные дополнения. Команды if в точке и проверяют, включает ли заказ конкретные дополне- ния — грибы и пепперони, и если включает — выводят подтверждающее сообщение. Проверка в точке реализована простой командой if , а не elif или else , поэтому условие будет проверяться независимо от того, было ли предыдущее условие ис- тинным или ложным. Код в точке проверяет, была ли заказана дополнительная порция сыра, независимо от результата первых двух проверок. Эти три независи- мых условия проверяются при каждом выполнении программы. Так как в этом коде проверяются все возможные варианты дополнений, в заказ будут включены два дополнения из трех: Adding mushrooms. Adding extra cheese. Finished making your pizza! Если бы в программе использовался блок if - elif - else , код работал бы неправиль- но, потому что он прерывал работу после обнаружения первого истинного условия. Вот как это выглядело бы: requested_toppings = ['mushrooms', 'extra cheese'] if 'mushrooms' in requested_toppings: print("Adding mushrooms.") elif 'pepperoni' in requested_toppings: print("Adding pepperoni.") Команды if 95 elif 'extra cheese' in requested_toppings: print("Adding extra cheese.") print("\nFinished making your pizza!") Первое же проверяемое условие (для 'mushrooms' ) оказывается истинным. Од- нако значения 'extra cheese' и 'pepperoni' после этого не проверяются, потому что в цепочках if - elif - else после обнаружения первого истинного условия все остальные условия пропускаются. В результате в пиццу будет включено только первое из заказанных дополнений: Adding mushrooms. Finished making your pizza! Итак, если вы хотите, чтобы в программе выполнялся только один блок кода, — ис- пользуйте цепочку if - elif - else . Если же выполняться должны несколько блоков, используйте серию независимых команд if УПРАЖНЕНИЯ 5-3 . Цвета 1: представьте, что в вашей компьютерной игре только что был подбит корабль пришельцев . Создайте переменную с именем alien_color и присвойте ей значение ‘green’, ‘yellow’ или ‘red’ . • Напишите команду if для проверки того, что переменная содержит значение ‘green’ . Если условие истинно, выведите сообщение о том, что игрок только что заработал 5 очков . • Напишите одну версию программы, в которой условие if выполняется, и другую вер- сию, в которой оно не выполняется . (Во второй версии никакое сообщение выводить- ся не должно .) 5-4 . Цвета 2: выберите цвет, как это было сделано в упражнении 5-3, и напишите цепочку if-else . • Напишите команду if для проверки того, что переменная содержит значение ‘green’ . Если условие истинно, выведите сообщение о том, что игрок только что заработал 5 очков . • Если переменная содержит любое другое значение, выведите сообщение о том, что игрок только что заработал 10 очков . • Напишите одну версию программы, в которой выполняется блок if, и другую версию, в которой выполняется блок else . 5-5 . Цвета 3: преобразуйте цепочку if-else из упражнения 5-4 в цепочку if-elif-else . • Если переменная содержит значение 'green’, выведите сообщение о том, что игрок только что заработал 5 очков . • Если переменная содержит значение 'yellow’, выведите сообщение о том, что игрок только что заработал 10 очков . • Если переменная содержит значение 'red’, выведите сообщение о том, что игрок толь- ко что заработал 15 очков . • Напишите три версии программы и проследите за тем, чтобы для каждого цвета при- шельца выводилось соответствующее сообщение . 5-6 . Периоды жизни: напишите цепочку if-elif-else для определения периода жизни челове- ка . Присвойте значение переменной age, а затем выведите сообщение . • Если значение меньше 2 — младенец . 96 Глава 5 • Команды if • Если значение больше или равно 2, но меньше 4 — малыш . • Если значение больше или равно 4, но меньше 13 — ребенок . • Если значение больше или равно 13, но меньше 20 — подросток . • Если значение больше или равно 20, но меньше 65 — взрослый . • Если значение больше или равно 65 — пожилой человек . 5-7 . Любимый фрукт: составьте список своих любимых фруктов . Напишите серию независи- мых команд if для проверки того, присутствуют ли некоторые фрукты в списке . • Создайте список трех своих любимых фруктов и назовите его favorite_fruits . • Напишите пять команд if . Каждая команда должна проверять, входит ли определен- ный тип фрукта в список . Если фрукт входит в список, блок if должен выводить со- общение вида «You really like bananas!» . Использование команд if со списками Объединение команд 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 со списками 97 А если в пиццерии вдруг кончится зеленый перец? Команда 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("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 будет полезно проверить, есть ли в списке хотя бы один элемент. Проверим, есть ли элементы в списке заказанных дополнений, перед изготовлением пиццы. Если список пуст, программа предлагает пользователю подтвердить, что он хочет базовую пиццу без дополнений. Если список не пуст, пицца готовится так же, как в предыдущих примерах: requested_toppings = [] if requested_toppings: for requested_topping in requested_toppings: print("Adding " + requested_topping + ".") print("\nFinished making your pizza!") else: print("Are you sure you want a plain pizza?") На этот раз мы начинаем с пустого списка заказанных дополнений в точке . Вместо того чтобы сразу переходить к циклу for , программа выполняет проверку |