Программирование на Python

Оператор выбора if

Разбить на страницы
Показывать лекцию целиком

Оператор if позволяет организовать альтернативный выбор. Синтаксис оператора выдержан в минималистском стиле:

if <выражение>:
	<операторы>
else:
	<операторы>

Стиль Python предполагает, что заголовок оператора if, заканчивающийся двоеточием, находится на отдельной строке и не требует заключения логического выражения в скобки. Составные операторы if-ветви и else-ветви также не заключаются в скобки. В Python последовательность операторов с одинаковым отступом воспринимается как один составной оператор. Изменение отступа означает переход на другой уровень вложенности. Поскольку ключевые слова if и else располагаются с одинаковым отступом, то конец операторов if-ветви легко распознается. Нарушение отступов приводит к синтаксическим ошибкам.

Рассмотрим пример записи оператора if в стиле, классическом для Python:

def test1():
    #классический стиль
    #каждый оператор на отдельной строке
    #нет скобок
    a = b = 0 
    answer = input("Ваше слово - да или нет\n ")
    if answer == "да":
        a = 10
        b = 100
    else:
        a = -10
        b = -100
    print ("answer = ", answer )
    print ("a = ", a)
    print ("b = ", b)
test1()

Результаты работы:

Синтаксис допускает нарушение стиля. Логическое выражение может заключаться в скобки. Для сложных логических выражений это просто необходимо.

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

def test2():
    #нарушение классического стиля
    #несколько операторов на строке
    #есть скобки
    a = b = 0 
    answer = input("Ваше слово - да или нет\n ")
    if (answer == "да" or
        answer == "yes" or answer == 1):
        a = 10; b = 100
    else:
        a = -10; b = -100
    print ("answer = ", answer )
    print ("a = ", a)
    print ("b = ", b)
test2()

Результаты:

В простых ситуациях настоящие "питонисты" скобок не ставят и каждому оператору отводят отдельную строку.

Краткая форма оператора if

Конечно, допустима краткая форма оператора if, когда else ветвь опускается.

def test3():
    max = 0
    x = input('введите число\n')
    x = float(x)
    if x > max:
        max = x
    print ('max = ', max)
test3()

Результаты:

Условное выражение

Как и в других языках программирования, наряду с условным оператором if, существует похожая конструкция условного выражения. Синтаксически такое выражение имеет вид:

выражение_1 if логическое выражение else выражение_2

Семантика интуитивно понятна. Если логическое выражение имеет значение true, то результатом является выражение_1, в противном случае - выражение_2.

Приведу пример:

def test4():
    #условное выражение
    x = input('Введите два числа\n')
    y = input()
    x = float(x)
    y = float(y)
    max = x if x >= y else y
    print ('max = ', max)
    answer = input('Ваше слово - да или нет\n')
    a, b = [10, 100] if answer == 'да' else [-10, -100]
    print ("answer = ", answer)
    print ("a = ", a)
    print ("b = ", b)
test4()

Результаты:

Условное выражение позволяет заменить одной строкой многострочную последовательность в записи оператора if. Конечно, такая запись менее понятна в сравнении с записью оператора if. Однако в ней есть свои преимущества. Когда мы описываем некоторую функцию, то для ее восприятия число строк в ней не должно быть большим, как правило, - 10-15 строк, чтобы функция целиком помещалась на экране компьютера. Условное выражение и запись нескольких операторов на одной строке позволяют сжать текст функции.

Множественный выбор

В большинстве языков программирования наряду с оператором альтернативного выбора if существует и оператор множественного выбора. В языках C, C++, C#, Java таким оператором является оператор switch. Замечу, самый неудачный по синтаксису и семантике оператор.

В языке Python нет специального оператора множественного выбора. Множественный выбор реализуется оператором if, включающим ветви elif (else if) для разбора вариантов.

Синтаксис оператора if Python в случае множественного выбора имеет вид:

if логическое выражение:
	операторы if ветви
elif логическое выражение:
операторы elif ветви
else:
операторы else ветви

Ветвь elif может присутствовать многократно. Ветвь else - ветвь по умолчанию - может отсутствовать.

Приведем в качестве примера типичную для разбора вариантов задачу нахождения корней квадратного уравнения.

Пример - решение квадратного уравнения:

def test5():
    import math
    #оператор if
    #решение квадратного уравнения
    print("Введите a, b, c - коэффициенты уравнения")
    a = input("введите a\n")
    b = input("введите b\n")
    c = input("введите c\n")
    a = float(a); b = float(b); c = float(c);
    print("a = ", a); print("b = ", b); print("c = ", c); 
    d = b * b - 4 * a * c
    if d > 0:
        x1 = (-b + math.sqrt(d))/(2 * a)
        x2 = (-b - math.sqrt(d))/(2 * a)
        print('x1 =', x1, 'x2 = ', x2)
    elif d == 0:
        x1 = x2 = -b / (2 * a)
        print("корни совпадают", 'x1 = x2 = ', -b / (2 * a))
    else:
        x1 = x2 = "NAN"
        print('уравнение не имеет действительных корней')
test5()

Результаты работы:

Рассмотрим еще один типичный пример выбора с большим числом ветвей.

def test6():
    # выбор операции над операндами
    print("Введите операнды a, b, и операцию над ними - operation")
    a = input("введите a\n")
    b = input("введите b\n")
    operation = input("введите operation\n")
    a = float(a); b = float(b) 
    print("a = ", a); print("b = ", b); print("operation = ", operation); 
    
    if operation == '+' or operation == 'Plus' or operation == 'Add':
        result = a + b
        
    elif operation == '-' or operation == 'Minus' or operation == 'Sub':
        result = a - b
    elif operation == '*' or operation == 'Umn' or operation == 'Mult':
        result = a * b
    elif operation == '/' or operation == 'Del' or operation == 'Div':
        result = a / b 
    elif operation == '//':
        result = a // b
    elif operation == '%':
        result = a % b
    else:
        result = "NAN"
    if result == "NAN" :
        print('Операция неизвестна')
    else:
        print ('result = ', result)
test6()

Результаты:

Словарь как структура выбора

Словарь можно рассматривать как структуру выбора, интерпретируя ключи элементов как варианты выбора, а значения элементов, - как результат сделанного выбора. Это не дает универсального решения, как в случае использования оператора if, когда в результате выбора выполняется соответствующая группа операторов. Однако в случае, когда результатом выбора является некоторое значение, то словарь является достойной заменой оператора множественного выбора if. Рассмотрим пример, когда в зависимости от выбираемого типа авиабилета вычисляется цена билета.

def test7():
    #словарь как структура выбора
    dict_choice = {'econom' : 800, 'business' : 1400, 'first_class': 2000, 'lux' : 3000}
    your_choice = input("Введите Ваш выбор\n")
    price = dict_choice[your_choice]
    print("ticket = ", your_choice, 'price = ', price  )
test7() 

Результаты:

Оператор if помимо if-ветви и elif-ветвей может содержать и ветвь else - ветвь по умолчанию. При работе со словарем значение по умолчанию в словаре явно задать нельзя. Но эта проблема легко решается, как показано в следующем примере:

def test8():
    #словарь и значение по умолчанию
    lang = input('Ваш язык программирования\n')
    dict_choice = {'C#': 'отдел_А', 'C++': 'отдел_Б', 'Python': 'отдел_В'}
    if lang in dict_choice:
        otdel = dict_choice(lang)
    else:
        otdel = 'учебный отдел'
    print ('язык - ', lang, 'отдел - ', otdel)
test8()

Результаты:

В заключение следует сказать, что словарь как структура выбора может быть столь же универсален, как и оператор if, если использовать в качестве значений элементов словаря анонимные функции, - функции, заданные лямбда определением. Хотя такой вариант допустим, но он явно проигрывает оператору if в наглядности и простоте понимания.

Страницы:

Оператор if позволяет организовать альтернативный выбор. Синтаксис оператора выдержан в минималистском стиле:

if <выражение>:
	<операторы>
else:
	<операторы>

Стиль Python предполагает, что заголовок оператора if, заканчивающийся двоеточием, находится на отдельной строке и не требует заключения логического выражения в скобки. Составные операторы if-ветви и else-ветви также не заключаются в скобки. В Python последовательность операторов с одинаковым отступом воспринимается как один составной оператор. Изменение отступа означает переход на другой уровень вложенности. Поскольку ключевые слова if и else располагаются с одинаковым отступом, то конец операторов if-ветви легко распознается. Нарушение отступов приводит к синтаксическим ошибкам.

Рассмотрим пример записи оператора if в стиле, классическом для Python:

def test1():
    #классический стиль
    #каждый оператор на отдельной строке
    #нет скобок
    a = b = 0 
    answer = input("Ваше слово - да или нет\n ")
    if answer == "да":
        a = 10
        b = 100
    else:
        a = -10
        b = -100
    print ("answer = ", answer )
    print ("a = ", a)
    print ("b = ", b)
test1()

Результаты работы:

Синтаксис допускает нарушение стиля. Логическое выражение может заключаться в скобки. Для сложных логических выражений это просто необходимо.

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

def test2():
    #нарушение классического стиля
    #несколько операторов на строке
    #есть скобки
    a = b = 0 
    answer = input("Ваше слово - да или нет\n ")
    if (answer == "да" or
        answer == "yes" or answer == 1):
        a = 10; b = 100
    else:
        a = -10; b = -100
    print ("answer = ", answer )
    print ("a = ", a)
    print ("b = ", b)
test2()

Результаты:

В простых ситуациях настоящие "питонисты" скобок не ставят и каждому оператору отводят отдельную строку.

Краткая форма оператора if

Конечно, допустима краткая форма оператора if, когда else ветвь опускается.

def test3():
    max = 0
    x = input('введите число\n')
    x = float(x)
    if x > max:
        max = x
    print ('max = ', max)
test3()

Результаты:

Условное выражение

Как и в других языках программирования, наряду с условным оператором if, существует похожая конструкция условного выражения. Синтаксически такое выражение имеет вид:

выражение_1 if логическое выражение else выражение_2

Семантика интуитивно понятна. Если логическое выражение имеет значение true, то результатом является выражение_1, в противном случае - выражение_2.

Приведу пример:

def test4():
    #условное выражение
    x = input('Введите два числа\n')
    y = input()
    x = float(x)
    y = float(y)
    max = x if x >= y else y
    print ('max = ', max)
    answer = input('Ваше слово - да или нет\n')
    a, b = [10, 100] if answer == 'да' else [-10, -100]
    print ("answer = ", answer)
    print ("a = ", a)
    print ("b = ", b)
test4()

Результаты:

Условное выражение позволяет заменить одной строкой многострочную последовательность в записи оператора if. Конечно, такая запись менее понятна в сравнении с записью оператора if. Однако в ней есть свои преимущества. Когда мы описываем некоторую функцию, то для ее восприятия число строк в ней не должно быть большим, как правило, - 10-15 строк, чтобы функция целиком помещалась на экране компьютера. Условное выражение и запись нескольких операторов на одной строке позволяют сжать текст функции.

Множественный выбор

В большинстве языков программирования наряду с оператором альтернативного выбора if существует и оператор множественного выбора. В языках C, C++, C#, Java таким оператором является оператор switch. Замечу, самый неудачный по синтаксису и семантике оператор.

В языке Python нет специального оператора множественного выбора. Множественный выбор реализуется оператором if, включающим ветви elif (else if) для разбора вариантов.

Синтаксис оператора if Python в случае множественного выбора имеет вид:

if логическое выражение:
	операторы if ветви
elif логическое выражение:
операторы elif ветви
else:
операторы else ветви

Ветвь elif может присутствовать многократно. Ветвь else - ветвь по умолчанию - может отсутствовать.

Приведем в качестве примера типичную для разбора вариантов задачу нахождения корней квадратного уравнения.

Пример - решение квадратного уравнения:

def test5():
    import math
    #оператор if
    #решение квадратного уравнения
    print("Введите a, b, c - коэффициенты уравнения")
    a = input("введите a\n")
    b = input("введите b\n")
    c = input("введите c\n")
    a = float(a); b = float(b); c = float(c);
    print("a = ", a); print("b = ", b); print("c = ", c); 
    d = b * b - 4 * a * c
    if d > 0:
        x1 = (-b + math.sqrt(d))/(2 * a)
        x2 = (-b - math.sqrt(d))/(2 * a)
        print('x1 =', x1, 'x2 = ', x2)
    elif d == 0:
        x1 = x2 = -b / (2 * a)
        print("корни совпадают", 'x1 = x2 = ', -b / (2 * a))
    else:
        x1 = x2 = "NAN"
        print('уравнение не имеет действительных корней')
test5()

Результаты работы:

Рассмотрим еще один типичный пример выбора с большим числом ветвей.

def test6():
    # выбор операции над операндами
    print("Введите операнды a, b, и операцию над ними - operation")
    a = input("введите a\n")
    b = input("введите b\n")
    operation = input("введите operation\n")
    a = float(a); b = float(b) 
    print("a = ", a); print("b = ", b); print("operation = ", operation); 
    
    if operation == '+' or operation == 'Plus' or operation == 'Add':
        result = a + b
        
    elif operation == '-' or operation == 'Minus' or operation == 'Sub':
        result = a - b
    elif operation == '*' or operation == 'Umn' or operation == 'Mult':
        result = a * b
    elif operation == '/' or operation == 'Del' or operation == 'Div':
        result = a / b 
    elif operation == '//':
        result = a // b
    elif operation == '%':
        result = a % b
    else:
        result = "NAN"
    if result == "NAN" :
        print('Операция неизвестна')
    else:
        print ('result = ', result)
test6()

Результаты:

Словарь как структура выбора

Словарь можно рассматривать как структуру выбора, интерпретируя ключи элементов как варианты выбора, а значения элементов, - как результат сделанного выбора. Это не дает универсального решения, как в случае использования оператора if, когда в результате выбора выполняется соответствующая группа операторов. Однако в случае, когда результатом выбора является некоторое значение, то словарь является достойной заменой оператора множественного выбора if. Рассмотрим пример, когда в зависимости от выбираемого типа авиабилета вычисляется цена билета.

def test7():
    #словарь как структура выбора
    dict_choice = {'econom' : 800, 'business' : 1400, 'first_class': 2000, 'lux' : 3000}
    your_choice = input("Введите Ваш выбор\n")
    price = dict_choice[your_choice]
    print("ticket = ", your_choice, 'price = ', price  )
test7() 

Результаты:

Оператор if помимо if-ветви и elif-ветвей может содержать и ветвь else - ветвь по умолчанию. При работе со словарем значение по умолчанию в словаре явно задать нельзя. Но эта проблема легко решается, как показано в следующем примере:

def test8():
    #словарь и значение по умолчанию
    lang = input('Ваш язык программирования\n')
    dict_choice = {'C#': 'отдел_А', 'C++': 'отдел_Б', 'Python': 'отдел_В'}
    if lang in dict_choice:
        otdel = dict_choice(lang)
    else:
        otdel = 'учебный отдел'
    print ('язык - ', lang, 'отдел - ', otdel)
test8()

Результаты:

В заключение следует сказать, что словарь как структура выбора может быть столь же универсален, как и оператор if, если использовать в качестве значений элементов словаря анонимные функции, - функции, заданные лямбда определением. Хотя такой вариант допустим, но он явно проигрывает оператору if в наглядности и простоте понимания.

Вернуться к учебному плану