Главная страница

Книга Изучаем Python


Скачать 4.68 Mb.
НазваниеКнига Изучаем Python
Дата10.12.2022
Размер4.68 Mb.
Формат файлаpdf
Имя файлаErik_Metiz_Izuchaem_Python_Programmirovanie_igr_vizualizatsia_da.pdf
ТипКнига
#837531
страница11 из 53
1   ...   7   8   9   10   11   12   13   14   ...   53
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
, программа выполняет проверку

1   ...   7   8   9   10   11   12   13   14   ...   53


написать администратору сайта