Ветвление. Условный оператор

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

Однако чаще в программах бывает не так. При выполнении кода, в зависимости от тех или иных условий, некоторые его участки могут быть опущены, в то время как другие – выполнены. Иными словами, в программе может присутствовать ветвление, которое реализуется условным оператором – особой конструкцией языка программирования.

Проведем аналогию с реальностью. Человек живет по расписанию. Можно сказать, расписание – это алгоритм для человека, его программный код, подлежащий выполнению. В расписании на 18.00 стоит поход в бассейн. Однако экземпляр биоробота класса Homo sapiens через свои рецепторы-сенсоры получает информацию, что воду из бассейна слили. Разумно было бы отменить занятие по плаванию, т. е. изменить ход выполнения программы-расписания. Одним из условий посещения бассейна должно быть его функционирование, иначе должны выполняться другие действия.

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

if логическое_выражение {
    выражение 1;
    выражение 2;
    …
}

Перевести на человеческий язык можно так: если логическое выражение возвращает истину, то выполняются выражения внутри фигурных скобок; если логическое выражение возвращает ложь, то код внутри фигурных скобок не выполняется. С английского "if" переводится как "если".

Конструкция if логическое_выражение называется заголовком условного оператора. Выражения внутри фигурных скобок – телом условного оператора. Тело может содержать как множество выражений, так и всего одно или даже быть пустым.

Пример использования условного оператора в языке программирования Python:

if n < 100:
    b = n + a

В Питоне вместо фигурных скобок используется двоеточие. Обособление вложенного кода, т. е. тела оператора, достигается за счет отступов. В программировании принято делать отступ равным четырем пробелам. Однако также можно использовать клавишу табуляции (Tab) на клавиатуре. Большинство сред программирования автоматически делают отступ, как только вы поставите двоеточие и перейдете на новую строку. Однако при работе в интерактивном режиме надо делать отступы вручную.

Инструкция if в интерпретаторе Python: отступы

Нахождение в теле условного оператора здесь обозначается тремя точками. При создании файла со скриптом таких точек быть не должно, как и приглашения >>>.

Python считается языком с ясным синтаксисом и легко читаемым кодом. Это достигается сведением к минимуму таких вспомогательных элементов как скобок и точек с запятой. Для разделения выражений используется переход на новую строку, а для обозначения вложенных выражений – отступы от начала строки. В других языках данный стиль программирования также используется, но лишь для удобочитаемости кода человеком. В Питоне же он возведен в ранг синтаксического правила.

В примере выше логическим выражением является n < 100. Если оно возвращает истину, то выполнится строчка кода b = n + a. Если логическое выражение ложно, то выражение b = n + a не выполнится.

Данный пример вырван из контекста и сам по-себе не является рабочим. Полная версия программы могла бы выглядеть так:

b = 0
a = 50
n = 98
if n < 100:
    b = n + a
print(b)

Последняя строчка кода print(b) уже не относится к условному оператору, что обозначено отсутствием перед ней отступа. Она не является вложенной в условный оператор, значит, не принадлежит ему.

Поскольку переменная n равна 98, а это меньше 100, то b станет равной 148-ми. Это значение будет выведено на экран. Если переменная n изначально была бы связана, например, со значением 101, то на экран был бы выведен 0. При нуле логическое выражение в заголовке условного оператора вернуло бы ложь, значит, тело не было бы выполнено, и переменная b не изменилась бы.

Структуру программы можно изобразить следующим образом:

Основная ветка программы и вложенный код

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

Для небольших программ иногда чертят так называемые блок-схемы, отражающие алгоритм выполнения. В языке блок-схем определенные конструкции обозначаются своими фигурами. Так блок действий обозначается прямоугольником, а логическое выражение – ромбом. Для кода выше блок-схема может выглядеть так:

Блок-схема оператора if

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

Блок-схема конструкции if-else

В случае возврата логическим выражением False поток выполнения программы не возвращается сразу в основную ветку. На случай False существует другой вложенный код, отличный от случая True. Другими словами, встретившись с расширенной версией условного оператора, поток выполнения программы не вернется в основную ветку, не выполнив хоть какой-нибудь вложенный код.

В языках программирования разделение на две ветви достигается с помощью добавления блока else, получается так называемое if–else (если-иначе). Синтаксис выглядит примерно так:

if логическое_выражение {
    выражение 1;
    выражение 2;
    …
}
else {
    выражение 3;
    …
}

Если условие при инструкции if оказывается ложным, то выполняется блок кода при инструкции else. Ситуация, при которой бы выполнились обе ветви, невозможна. Либо код, принадлежащий if, либо код, принадлежащий еlse. Никак иначе. В заголовке else никогда не бывает логического выражения.

Пример кода с веткой else на языке программирования Python:

tovar1 = 50
tovar2 = 32
if tovar1+ tovar2 > 99 :
    print("99 рублей недостаточно")
else:
    print("Чек оплачен")

Следует иметь в виду, что логическое выражение при if может выглядеть "нестандартно", т. е. не так просто, как a > b и тому подобное. Там может стоять просто одна переменная, число, слово True или False, а также сложное логическое выражение, когда два простых соединяются через логически И или ИЛИ.

a = ?
if a:
    a = 1

Если вместо знака вопроса будет стоять 0, то с логической точки зрения это False, значит выражение в if не будет выполнено. Если a будет связано с любым другим числом, то оно будет расцениваться как True, и тело условного оператора выполнится. Другой пример:

a = 5 > 0
if a:
    print(a)

Здесь a уже связана с булевым значением. В данном случае это True. Отметим, что в выражении a = 5 > 0 присваивание выполняется после оператора сравнения, так что подвыражение 5 > 0 выполнится первым, после чего его результат будет присвоен переменной a. На будущее, если вы сомневаетесь в последовательности выполнения операторов, используйте скобки, например так: a = (5 > 0).

Третий пример:

if a > 0 and a < b:
    print(b - a)

Тут, чтобы вложенный код выполнился, a должно быть больше нуля и одновременно меньше b. Также в Питоне, в отличие от других языков программирования, позволительна такая сокращенная запись сложного логического выражения:

if 0 < a < b:
    print(b - a)

Практическая работа

  1. Напишите программу (файл TakeInput.py), которая просит пользователя что-нибудь ввести с клавиатуры. Если он вводит какие-нибудь данные, то на экране должно выводиться сообщение "ОК". Если он не вводит данные, а просто нажимает Enter, то программа ничего не выводит на экран.

  2. Напишите программу (файл PosNeg.py), которая запрашивает у пользователя число. Если оно больше нуля, то в ответ на экран выводится число 1. Если введенное число не является положительным, то на экран должно выводиться -1.

Примеры решения в android-приложении и pdf-версии курса.

Создано

Обновлено

Комментарии

можно как то уменьшить код

print ('что одеть')
Temp=int(input("введите значение температуры"))
pogoda=input("дождь-1, снег-2, ветер-3, ясно-4"))
if Temp>20 and pogoda=='дождь':
    print('можете одеть шорты с футболкои, но возьмите зонт')
elif Temp>20 and pogoda=="ясно":
    print ('одеваитесь легко на улице жарко')
elif Temp<=20 and Temp>1 and pogoda=="дождь":
    print('одеваитесь теплее и возмите зонт')
elif Temp<=0 and Temp>=-15 and pogoda=='снег':
    print ('одеваите зимние вещи и бегом на улицу, погода класс!!!')
else:
    print ('сиди дома и молись, возможно конец близок))')

Решил заняться изучением Python, хотел спросить как сделать код цикличным и можно ли его упростить? Хочется сделать цикличным до тех пор пока пользователь не введёт хотя бы 2 буквы

print("Для продолжения работы введите ваше имя!")
uanswer_s = ''
while not uanswer_s.isalpha():
    if uanswer_s: print (u'Введите только буквенные символы')
    uanswer_s = input('Как Вас зовут?')
 
uanswer = str(uanswer_s)
def vvod():
    if len(uanswer) >= 2:
        print ("Вас зовут " + str(uanswer))
    else:
        print("Имя не может состоять из одной буквы")
uanswer=input("И всё же как вас зовут?")
vvod()

Кажется я где то очень запутался.

Ответ на от Олег(olegvolko…

Можно не усложнять:

>>> u = ''
>>> while len(u) < 2:
...   u = input('Имя: ')
... else:
...   print(u)
... 
Имя: 3
Имя: u
Имя: i
Имя: rc
rc

else можно убрать, выводить имя в основной ветке программы. Просто в интерактивном режиме так наглядней.
Если нужно предупреждать, то можно в тело while после ввода имени вставить

...   if len(u) < 2:
...     print('это не имя')

Ответ на от plustilino

u = ''
while len(u) < 2 or not u.isalpha():
	u = input('Имя: ')
	if len(u) < 2:
		print ('Имя жолжно содержать не менее двух символов.')
	if not u.isalpha():
		print ('Имя должно содержать только буквы.')
print('Ваше имя: ', '"', u,'". ', 'Сочувствую.', sep='')

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

print ("Приветствую!")
rastoyanie = float (input("сколько км вы хотите проехать на автомобиле? "))
rashod = float (input("сколько л топлива расходует машина на 100км? "))
bak_l = float (input("сколько литров топлива в вашем баке? "))
if (bak_l/rashod)*100>=rastoyanie:
    print("Вы проедете желаемое расстояние")
else:
    print ("Вы не проедете желаемое расстояние, вы проедете - ")
    print (bak_l/rashod)*100

Замечание относительно этики программирования: Отступы предпочтительней делать четырьмя пробелами, отступы Tab'ом желательно избегать. Подобные нюансы оговариваются в PEP8.

Вывод кириллицы -- хочу подсказать, как в Питонах, версии которых менее 3.0, безболезненно выводить кириллицу.

Питон 3.0 сразу работает с UTF-8, но его предыдущие версии -- нет. Отсюда проблемы в версиях 2.6, 2.7, ...

Для того, чтобы программы на Питоне могли выводить русские буквочки, нужно в первой строке указать "заклинание":

# coding: utf-8

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

Если получается так, что в вашей программе первой строкой идет:

#! /usr/bin/env python

, то пишите это "заклинание" сразу в следующей после нее строке, то есть -- во второй:

#! /usr/bin/env python
# coding: utf-8

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

Дорогие учителя! Я еще хочу опросить вас -- пожалуйста, не учите детей одиозному виндозно-турбо-паскалевского подходу в написании программ!

В среде Шindows это действительно проблема -- одна кодировка используется для GUI (Graphical User Interface), другая -- для CUI (Command-Line Interface), и преподавателям Паскаля не остается ничего другого, как с молодых ногтей учить детей пользоваться костылями. Красивое решение. Спасибо M$ за ее мудрость!

Поэтому можно понять безвыходность учительского положения при таком обучении будущих программистов и допустить вот такой страшный вывод русских слов:

Vvedite znachenie X ...
 
Spasibo chto vam nravitsja takoy sposob napisanija russkikh slov!

Но, господа! Имейте совесть! В Linux-е единая кодировка для консольных программ и для GUI-шных!

Пожалуйста, не учите детей дурному стилю написания программ. Тем более Linux -- это не Виндовз, и здесь нет таких прибабахов.

Очень жаль, что в уроке не рассмотрели условный заголовок elif. Он позволяет очень упростить код, что соответствует дзену python'a. В случае если переменная может соответствовать любому из нескольких вариантов не придется писать оператор многоуровневой вложенности. Например, необходимо переменную (А) сравнить с нулем, если (А) больше нуля программа выводит ('положительное'), если меньше ('отрицательное'), а если (А) равно нулю ('ноль'). При использовании только if и else программа будет двух уровней вложенности. А если состояние переменной 10 то и вложенность будет 9 уровней. Такой подход затрудняет читаемость кода.