Инструкция if-elif-else, проверка истинности, трехместное выражение if/else
Условная инструкция if-elif-else (её ещё иногда называют оператором ветвления) — основной инструмент выбора в Python. Проще говоря, она выбирает, какое действие следует выполнить, в зависимости от значения переменных в момент проверки условия.
Синтаксис инструкции if
Сначала записывается часть if с условным выражением, далее могут следовать одна или более необязательных частей elif, и, наконец, необязательная часть else. Общая форма записи условной инструкции if выглядит следующим образом:
Простой пример (напечатает 'true', так как 1 - истина):
Чуть более сложный пример (его результат будет зависеть от того, что ввёл пользователь):
Конструкция с несколькими elif может также служить отличной заменой конструкции switch - case в других языках программирования.
Проверка истинности в Python
- Любое число, не равное 0, или непустой объект — истина.
- Числа, равные 0, пустые объекты и значение None — ложь
- Операции сравнения применяются к структурам данных рекурсивно
- Операции сравнения возвращают True или False
- Логические операторы and и or возвращают истинный или ложный объект-операнд
Истина, если оба значения X и Y истинны.
Истина, если хотя бы одно из значений X или Y истинно.
Истина, если X ложно.
Трехместное выражение if/else
довольно короткая, но, тем не менее, занимает целых 4 строки. Специально для таких случаев и было придумано выражение if/else:
В данной инструкции интерпретатор выполнит выражение Y, если X истинно, в противном случае выполнится выражение Z.
Для вставки кода на Python в комментарий заключайте его в теги
- Модуль csv - чтение и запись CSV файлов
- Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
- Онлайн-обучение Python: сравнение популярных программ
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте
if-then-else
Оператор if-then-else является основным оператором управления выполнением программы, который выполняет один фрагмент кода, если заданное условие выполняется, и другой фрагмент — если нет.
У оператора есть две формы, краткая:
if( ) else
Например, следующий фрагмент кода присваивает клиента менеджеру продаж, только если последний занимается в данный момент времени делами менее, чем 10 клиентов:
if ( salesman.clients.size() < 10 ) salesman.assign( client );
А этот код проверяет, есть ли задачи в определенной очереди, и если да, то присваивает первую задачу грузовику, иначе же отсылает грузовик в парк:
if( tasks.isEmpty() ) truck.setDestination( truck.parking ); else truck.assignTask( tasks.removeFirst() );
Если раздел кода then или else содержит более одной команды, то такой раздел должен быть заключен в фигурные скобки < … >, тогда он будет интерпретироваться как блок и рассматриваться как одна команда, см. код ниже. Мы однако же рекомендуем всегда заключать команды разделов then и else в фигурные скобки, чтобы избежать неоднозначно выглядящего кода. Скобки особенно важны тогда, когда есть несколько вложенных операторов if , или когда строки кода по соседству с оператором if добавляются или удаляются во время редактирования или отладки.
if( friends == null ) < friends = new ArrayList< Person >(); friends.add( john ); > else
Всё ли вы знаете про if?
Как вы расставляете скобки, что вы включаете в блоки, как вы записываете логические выражения. Задумываетесь ли вы о том, что следуя простым правилам, вы можете не только сделать код более читабельным, но и облегчить отладку, улучшить диагностику, повысить производительность.
Предлагаю 5К мыслей и ссылки на style guide-ы (далее SG). Надеюсь, что эта статья станет приятным и лёгким чтивом. И я уверен, что она затрагивает далеко не все вопросы и надеюсь на содержательное обсуждение.
Строго говоря, подобные вещи можно написать не только про if. Именно if выбран почти случайно (в конце концов, а почему бы и нет?). Идею этой статьи подкинул f0b0s. Её (идею) поддержали сразу несколько человек, я тоже начал ждать статью; но так и не дождавшись, решил сам поднять это знамя. f0b0s, спасибо за идею, извиняюсь, если опередил, жду комментариев.
Для полноты уделим секунду банальным вещам.
Фигурные скобки
Идеальный вариант писать фигурные скобки везде, а каждое выражение if/else/else_if
// ХОРОШО if (a == b) < foo(); >else
причём некоторые SGы рекомендуют писать else на новой строке
// Не > else < // а >else < // или >elseТогда else получается с таким же отступом, что и соответствующий if. Но в этом вопросе нет единства.
Если вы всё же опускаете скобки (в чём нет никакого криминала), то надо учитывать два аспекта. Во-первых, придерживаться одинаковой тактики для блоков if и else:
// ПОХУЖЕ if (a == b) < foo(); bar(); >else bazzz();И, во-вторых, не записывать весь if в одну строку
// СОВСЕМ ПЛОХО if (cond()) act(); else err();Смешение стилей в пределах одного if/else затрудняет его чтение, а размещение нескольких выражений в одной строке ещё и затрудняет отладку; в последнем примере cond() и act() расположены в одной строке; это затрудняет поиск ошибок по номером срок и отладку.
И ещё два замечания о блоках
Создавайте переменные только при необходимости
Используйте преимущества С++. Если переменная нужна только в блоке, то и создавайте её только в блоке.
// ПЛОХО SomeClass p; // нужен только в блоке if (x == y)
// ХОРОШО if (x == y) < SomeClass p; // нужен только в блоке p.moveTo(x, y); p.logResultsOfMovement(); >Это сбережёт процессорное время, память… в общем всё, что так дорого каждому человеку, исповедующему гуманистические идеалы 🙂
Описывайте сперва нормальный ход событий
В выражениях if/else сперва описывайте нормальный ход событий, а в блок else выносите обработку нештатных ситуаций. Это упрощает чтение программы:
// ХОРОШО bool errorFlag = openConnection(); if (!errorFlag) < doJob(); >else
Логические выражения
C++ не С
Прежде всего, в C++ не стоит следовать стилю C писать
// ПЛОХО if (float_num) <> if (int_num) <>Стандарт С++ не гарантирует, что float(0) и даже int(0) реализуются как «все биты 0» (хотя, конечно, это работает, но это чисто случайно :-)).
Если вам нужно проверить на равенство 0, то лучше написать именно это:
// ХОРОШО if (float_num != .0) <> if (int_num != 0) <>В качестве условия следует использовать только логические величины. Это же, кстати относится и к циклам:
// ХОРОШО while (true) <> // ПЛОХО while (1) <> for (;;) <>Разделяйте логические выражения на части
Если логическое выражение состоит из нескольких частей, то самой плохой практикой является запись их всех в кучу. Можно ли быстро понять, что тут написано?
// ПЛОХО if (figureX > leftLimit && figureX < fightLimit && figureColor == GREEN)Подсветка, конечно, помогла бы, но и без подсветки следующее выражение читается на много проще:
// ХОРОШО if (figureX > leftLimit && figureX < fightLimit && figureColor == GREEN)Но совсем идеально, ввести в программу дополнительные переменные
// ОЧЕНЬ МИЛО bool isInside = figureX > leftLimit && figureX < fightLimit; bool isGreen = figureColor == GREEN; if (isInside && isGreen)Такую программу на много проще читать, и кроме того, переменные isInside и isGreen могут пригодиться в дальнейшем.
А для пущей читабельности, можно поставить скобки вокруг логических выражений в первых двух строчках.
Выражения в условиях
Выражения лучше выносить из условий
// ХОРОШО bool dataReaded = readDdata(fileName); if (dataReaded) <>Это делает код на много читабельный, чем
// ПЛОХО if (readDdata(fileName)) <>Кроме того, это перекликается с общей идеей по-возможности разгружать логическое выражение, которая уже была высказана выше.
Ну и, конечно, «каждому выражению своя строка!».
// СОВСЕМ ПЛОХО if (readDdata(getFileNameFromArray(getEnvAsArray()))) <>Опять же, сложно читать, сложно отлаживать, сложно локализовать ошибки.
Присвоения в условиях
По уже изложенным причинам, в логических выражениях лучше не выполнять присвоения:
// ПЛОХО if (lid = getLabel() == curentLabel())SG от Google. Стоит изучить, так как она не во всём солидарна с вышеупомянутой SG.
upd Спасибо всем прокомментировавшим! Обсуждение (как я и ожидал) получилось интересней статьи 🙂 Я не вношу замечания в статью по двум причинам. Многие замечания (равносправедливые) противоречат друг другу (что не удивительно, при обсуждении подобных тем). И второе, если я внесу все правки, то обсуждение станет совершенно непонятным и статья утратит свою лучшую часть 🙂 Пусть уж всё остаётся как есть и «ошибки»(?) допущенные в статье станут иллюстрацией к обсуждению.
Что такое функции if elif else в Python?
Это скорее не функции, а условные конструкции. Они необходимы для того, чтобы выполнять различные блоки кода при определенных условиях. Сама конструкция начинается с условного оператора if (если. ), за ним следует само условие, при соблюдении которого будет выполнен расположенный ниже код. А также с помощью необязательного оператора else (иначе. ) можно указать код, который будет выполнен, если расположенное выше условие не соблюдено (для того, чтобы интерпретатор понимал, что указанный код относится к конкретному условию необходим отступ в 4 пробела):
# данный код выведет сообщение о том, что # число четное, если при делении его на 2 # остаток будет равен нулю. # если условие не будет выполнено (число нечетное), # то будет выведено другое сообщение def odd_or_even(number): if number % 2 == 0: print('The number is even!') else: print('The number is odd!') odd_or_even(4) # => The number is even! odd_or_even(83) # => The number is odd!Может быть ситуация, когда условий больше, чем 2. Тогда на помощь придет оператор elif (а если. ), с помощью которого можно задать другие условия и выполняемый код при их соблюдении:
# создадим функцию, которая определяет # тип данных переданного ей объекта: # строка это, целое число или цисло с плавающей точкой # или функции этот тип объекта неизвестен def get_object_type(object): if isinstance(object, int): print('This is an integer') elif isinstance(object, str): print('This is a string') elif isinstance(object, float): print('This is a float') else: print('''I don't know what type this object is''') get_object_type(4) # => This is an integer get_object_type('Hello, world!') # => This is a string get_object_type(3.1415926) # => This is a float get_object_type(2, 4, 'foo'>) # => I don't know what type this object is
