Занятие № 2. Решение задач с использованием условного оператора

Цель: изучить синтаксис условного оператора; научиться применять оператор if-elif-else; уметь применять простые и составные условия.

Теория

Логические значения и выражения

В Python для хранения логических значений используется тип bool. Существует только два литерала для логических значений - True (истина) и False (ложь). Результатом вычисления логического выражения является одно из двух логических значений.

Операторы сравнения используются, чтобы узнать равны или не равны два логических выражения, какое из них больше или меньше.

Таблица 1: Операторы сравнения
Оператор Название Пример
< Меньше 6 < 10 – True; 52 < 5 – False.
> Больше 2 > 9 – False
<= Меньше или равно 5 <= 5– True; 5 <= 6– True.
>= Больше или равно 2 >= 3– False; 2 >= 2 – True.
== Равно "python" == "ruby" – False
!= Не равно 42 != 1 - True
±

Что из перечисленного является логическим выражением?


Результат сравнения с помощью == принимает значение True или False.

True и False - логические литералы. Их можно отнести к логическим выражениям.

Выражение 3+4 равно 7. 7 == 7 - логическое выражение.

Значение этого выражения число.

Значение в двойных кавычках, значит это строка.

Логические операторы

Для комбинирования логических выражений можно использовать логические операторы - not, and и or.

Значение следующего выражения True, если x больше 0 и меньше 10:

x = 5
print(x > 0 and x < 10)

      
x = 5
print(x > 0 and x < 10)

Следующие выражение истинно, если x делится на 2 или делится на 3:

x = 6
print(x % 2 == 0 or x % 3 == 0)

      
x = 6
print(x % 2 == 0 or x % 3 == 0)

Результат следующего логического выражения будет не истиной, если x > y и не ложью в обратном случае. Иными словами результат логического выражения инвертируется:

x = 10
y = 4
print(not x > y)

      
x = 10
y = 4
print(not x > y)

Попробуйте поменять значения переменных x и y в примерах, чтобы получить разные значения логических выражений.

±

Какие из логических выражений помогут определить, что значение переменной x лежит между 0 и 5?


Правильный вариант. Значение x одновременно больше 0 и меньше 5.

Не хватает x в правой части оператора and.

Значение этого логического выражения всегда будет равно True, так как любое число больше 0 или меньше 5.

Как не странно, такой вариант записи условия допустим в Python.

Приоритет операторов

Арифметические операторы имеют больший приоритет чем операторы сравнения и логические операторы. Затем вычисляется значение выражений с операторами сравнения. Самый низкий приоритет у логических операторов. Например в выражении x * 5 >= 10 and y - 6 <= 20 в первую очередь выполнятся операторы * и -, потом произойдёт сравнение (операторы >= и <=) и в самом конце выполниться логический оператор and. В этом примере, если x = 1 a y = 7, то значение всего выражения будет равно x ? .

Таблица 2: Приоритет выполнения операторов
Приоритет Операторы
7(высокий) **
6 *, /, //, %
5 +, -
4 ==, !=, <=, >=, >, <
3 not
2 and
1(низкий) or

Какой из вариантов расстановки скобок в следующем выражении отражает последовательность выполнения операторов:

5 * 3 > 10 and 4 + 6 == 11

Обратитесь к Таблица 2.

* и + выполняться в первую очередь, затем операторы сравнения и в конце логический оператор and.

У арифметических операторов приоритет выше чем у операторов сравнения.

Операторы не выполняются слева-направо, а выполняются согласно их приоритету.

and не обладает большим приоритетом, чем ==.

Инструкция “Ветвление”

Полная форма

Общая форма записи полной формы инструкции ветвления:

if <логическое выражение>:
    # если логическое выражение == True
    <блок инструкций 1>        
else:
    # если логическое выражение == False
    <блок инструкций 2>
graph TD    
    A([Начало]) --> B{Логическое<br>выражение<br>истино?}:::diamond
    B --> F(( ))
    F --> |Да| C[блок инструкций 1]
    F --> |Нет| D[блок инструкций 2]
    C --> E([Конец])
    D --> E
Рисунок 1

Обратите внимание, что после : набор инструкций записывается с отступом. С помощью отступа в Python обозначаются блоки инструкций. Конец строки считается концом инструкции, конец отступа считается концом блока инструкций. Рисунок 1 содержит диаграмму работы полной формы ветвления.

Оформление отступов

Обратите внимание на правила оформления блоков инструкций. Это важно, так как в Python вложенность инструкций определяется именно отступами.

  • Блок связанных инструкций должен иметь одинаковый отступ.
  • Размер отступа может быть произвольным (рекомендовано 4 пробела).
  • Для создания отступов можно использовать пробелы или табуляцию.
  • Нельзя смешивать пробелы и символы табуляции при оформлении одного блока.

В следующем примере определим чётность или нечётность значения в переменной x:

x = 15
if x % 2 == 0:
    print(x, "чётное")
else:
    print(x, "нечётное")

      
x = 15
if x % 2 == 0:
    print(x, "чётное")
else:
    print(x, "нечётное")

Сокращённая форма

Ветвление можно записать в сокращённой форме без оператора else:

x = 10
if x < 0:
    print(x, "отрицательное число")
print("Конец программы")

      
x = 10
if x < 0:
    print(x, "отрицательное число")
print("Конец программы")

Попробуйте поменять значение x на отрицательное число и запустить программу ещё раз.

Есть ли синтаксические ошибки в следующем коде:

x = -10
if x < 0:
    print("Отрицательное число ",  x, " не подойдёт")
else:
    print(x, " положительное число")
else:
    print("Конец программы")

Последний блок else не привязан ни к одному if. В коде есть ошибка.

У каждого блока else должен быть соответствующий ему блок if. В коде есть ошибка.

Иногда бывает необходимо обозначить пустой блок инструкций, чтобы реализовать его позже. В таком случае пригодится инструкция pass (пропустить):

if x < 0:
    pass   # TODO: придумать как обработать отрицательные значения

Запись без инструкции pass вызовет синтаксическую ошибку:

if x < 0:
    # Ошибка! Пустой блок инструкций
# следующие инструкции

Каскадное ветвление

Инструкции ветвления могут быть вложены друг в друга.

x = 1.6
y = 3.1
if x < y:
    print("x меньше y")
else:
    if x > y:
        print("x больше y")
    else:
        print("x равно y")

      
x = 1.6
y = 3.1
if x < y:
    print("x меньше y")
else:
    if x > y:
        print("x больше y")
    else:
        print("x равно y")

Рисунок 2 содержит диаграмму с ходом выполнения алгоритма.

graph TD
    A([Начало]) --> B[x = 1.6<br>y = 3.1]
    B --> C{x < y?}
    C --> D(( ))
    D -->|Да| E[/x меньше y/]
    D -->|Нет| F{x > y?}
    F --> G(( ))
    G -->|Да| H[/x больше y/]
    G -->|Нет| I[/x равно y/]
    E --> J(( ))
    H --> J
    I --> J
    J --> K([Конец])
Рисунок 2

В Python такую последовательность условий можно записать иначе с помощью инструкции elif:

x = 1.6
y = 3.1
if x < y:
    print("x меньше y")
elif x > y:
    print("x больше y")
else:
    print("x равно y")

      
x = 1.6
y = 3.1
if x < y:
    print("x меньше y")
elif x > y:
    print("x больше y")
else:
    print("x равно y")

В обоих случаях будет выполнена только одна из ветвей алгоритма.

К примеру следующий код:

if x < y and x < z:
    print(1)
elif y < x and y < z:
    print(2)
else:
    print(3)

При x = 3, y = 5 и z = 2 выведет на экран цифру x .

Примеры

Познакомьтесь с готовыми решениями задач. Ответьте на вопросы после кода решения каждой задачи.

Пример № 1 (ex01.py)

Напишите программу, которая бы получала на вход температуру воздуха из прогноза погоды и выводила на экран краткую характеристику. Если температура меньше 5 градусов вывести сообщение «Холодно, оденьтесь теплее»; если температура больше либо равна 5, но меньше 20 градусов вывести сообщение «На улице прохладно»; если температура больше либо равна 20 градусов – «На улице тепло».

print("Погода на сегодня")

t = float(input("Введите температуру в градусах Цельсия: "))
#не забывайте про отступы в условном операторе
if t < 5:
    print("Холодно, оденьтесь теплее.")

if t >= 5 and t < 20:
    print("На улице прохладно.")

if t >= 20:
    print("На улице тепло.")

      
print("Погода на сегодня")

t = float(input("Введите температуру в градусах Цельсия: "))
#не забывайте про отступы в условном операторе
if t < 5:
    print("Холодно, оденьтесь теплее.")

if t >= 5 and t < 20:
    print("На улице прохладно.")

if t >= 20:
    print("На улице тепло.")

В строке номер x ? пользователь вводит сегодняшнюю температуру воздуха. В строке номер x ? используется логический оператор x and. Значение всего логического выражения будет равно True, если значения x обоих логических выражений будет равно True.

В программе встречается только x сокращённая форма инструкции if.

Пример № 2 (ex02.py)

Напишите программу вычисляющую корни квадратного уравнения по заданным коэффициентам a, b и c. В случае если корень один – вывести на экран один корень. Если корней нет – вывести соответствующее сообщение.

#загрузка модуля содержащего математические функции
import math

print("Вычисление корней квадратного уравнения")
a = float(input("введите коэффициент a "))
b = float(input("введите коэффициент b "))
c = float(input("введите коэффициент c "))

D = b ** 2 - 4 * a * c
print("дискриминант: ", D)

if D > 0:
    root1 = (-b + math.sqrt(D)) / (2 * a)
    root2 = (-b - math.sqrt(D)) / (2 * a)
    print("Корни уравнения: ", root1, root2)
elif D == 0:
    root = (-b + math.sqrt(D)) / (2 * a)
    print("Корень уравнения: ", root)
else:
    print("Корней нет")

      
#загрузка модуля содержащего математические функции
import math

print("Вычисление корней квадратного уравнения")
a = float(input("введите коэффициент a "))
b = float(input("введите коэффициент b "))
c = float(input("введите коэффициент c "))

D = b ** 2 - 4 * a * c
print("дискриминант: ", D)

if D > 0:
    root1 = (-b + math.sqrt(D)) / (2 * a)
    root2 = (-b - math.sqrt(D)) / (2 * a)
    print("Корни уравнения: ", root1, root2)
elif D == 0:
    root = (-b + math.sqrt(D)) / (2 * a)
    print("Корень уравнения: ", root)
else:
    print("Корней нет")

В программе используется x каскадная форма записи инструкции if.

В строке x ? проверяется, равен ли дискриминант нулю. В этом случае значение корня уравнения сохраняется в переменную с именем x . Инструкции после оператора x else выполнятся, если уравнение не имеет корней.

Задания для самостоятельной работы

Задание № 1 (sam01.py)

Дано целое число. Если оно является положительным, то прибавьте к нему 1; в противном случае оставьте значение числа без изменений. Выведите полученное число на экран.

Задание № 2 (sam02.py)

Даны две переменные A и B. Если их значения равны, то присвоить каждой переменной сумму этих значений, а если не равны, то присвоить переменным нулевые значения. Значения переменных A и B вводятся с клавиатуры. Выведите новые значения переменных на экран.

Задание № 3 (sam03.py)

С клавиатуры вводится номер месяца. Нумерация месяцев начинается с 1. Выведите на экран пору года к которой принадлежит этот месяц - зима, весна, лето или осень.


Используйте каскадную форму записи инструкции ветвления.

Учтите, что к зимним относятся месяцы с номерами 1, 2 и 12.

Достаточно прописать логические выражения для трёх пор года. Если ни одно из трёх условий не выполнится, значит выполнится ветвь else для оставшейся последней поры года. Так получится сократить код.

month = int(input("Введите номер месяца (от 1 до 12): "))

if month == 1 or month == 2 or month == 12:
    print("Зима")
elif month >=3 and month <=5:
    print("Весна")
elif month >= 6 and month <= 8:
    print("Лето")
else:
    print("Осень")

Задание № 4 (sam04.py)

Индекс массы тела – это величина, которая позволяет оценить степень соответствия массы человека и его роста и рассчитывается по формуле

\[ I=\frac{m}{h^2} \]

где m – масса тела в килограммах, h – рост в метрах. Нормой считается значение индекса в диапазоне от 18 до 25. Напишите программу рассчитывающую индекс массы тела по введённым данным и выводящее сообщение в трёх случаях: значение индекса в норме, индекс меньше нормы, индекс больше нормы.

Задание № 5 (sam05.py)

Високосным является год, значение которого делится на 4, но при этом не делится на 100, либо делится на 400. Напишите программу, которая определяет, является ли введённый год високосным или нет, и выводит соответствующее сообщение.