Выбрать главу

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

age = 17

(1) if age >= 18:

print("You are old enough to vote!")

print("Have you registered to vote yet?")

(2)else:

. .print("Sorry, you are too young to vote.")

. .print("Please register to vote as soon as you turn 18!")

Если условие (1) истинно, то выполняется первый блок с командами print. Если же условие ложно, выполняется блок else в точке (2). Так как значение 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

(1) if age < 4:

. .print("Your admission cost is $0.")

(2)elif age < 18:

. .print("Your admission cost is $5.")

(3)else:

. .print("Your admission cost is $10.")

Условие if в точке (1) проверяет, что возраст посетителя меньше 4 лет. Если условие истинно, то программа выводит соответствующее сообщение, и Python пропускает остальные проверки. Строка elif в точке (2) в действительности является еще одной проверкой if, которая выполняется только в том случае, если предыдущая проверка завершилась неудачей. В этом месте цепочки известно, что возраст посетителя не меньше 4 лет, потому что первое условие было ложным. Если посетителю меньше 18 лет, программа выводит соответствующее сообщение, и Python пропускает блок else. Если ложны оба условия — if и elif, то Python выполняет код в блоке else в точке (3).

В данном примере условие (1) дает ложный результат, поэтому его блок не выполняется. Однако второе условие оказывается истинным (12 меньше 18), поэтому код будет выполнен. Вывод состоит из одного сообщения с ценой билета:

Your admission cost is $5.

При любом значении возраста больше 17 первые два условия ложны. В таких ситуациях блок else будет выполнен, и цена билета составит $10.

Вместо того чтобы выводить сообщение с ценой билета в блоках if-elif-else, лучше использовать другое, более компактное решение: присвоить цену в цепочке if-elif-else, а затем добавить одну команду print после выполнения цепочки:

age = 12

if age < 4:

(1) . .price = 0

elif age < 18:

(2) . .price = 5

else:

(3) . .price = 10

(4)print("Your admission cost is $" + str(price) + ".")

Строки (1) , (2) и (3) присваивают значение price в зависимости от значения age, как и в предыдущем примере. После присваивания цены в цепочке if-elif-else отдельная команда print без отступа (4) использует это значение для вывода сообщения с ценой билета.

Этот пример выводит тот же результат, что и предыдущий, но цепочка if-elif-else имеет более четкую специализацию. Вместо того чтобы определять цену и выводить сообщения, она просто определяет цену билета. Кроме повышения эффективности, у этого кода есть дополнительное преимущество: лучшая изменяемость. Чтобы изменить текст выходного сообщения, достаточно будет отредактировать всего одну команду print — вместо трех разных команд.

Серии блоков elif

Код может содержать сколько угодно блоков elif. Например, если парк аттракционов введет особую скидку для пожилых посетителей, вы можете добавить в свой код еще одну проверку для определения того, распространяется ли скидка на текущего посетителя. Допустим, посетители с возрастом 65 и выше платят половину от обычной цены билета, или $5: