Ветвление, условные операторы if elif else для начинающих
Довольно часто в программах бывает нужно выполнить часть кода только тогда, когда выполняется определенное условие. Например, если пользователь введет некорректные данные, нужно вывести сообщение об ошибке.
В случае, если мы хотим сделать что‑то, только если выполняется какое‑либо условие, нам придется использовать оператор if.
Проще всего будет показать, как этот оператор работает на примере. Для этого попробуем написать программу «Угадай число». Если вы начинающий программист, обязательно попробуйте именно написать эту программу, чтобы прочувствовать на практике, как это работает. Компьютер выбирает случайное число, игрок пытается угадать, программа сообщает пользователю, верен ли его ответ.
import random num = random.randint(1,10) guess = int(input('Введите число от 1 до 10: ')) if guess == num : print('Угадали!')
Синтаксис оператора if прост — сначала надо написать ключевое слово if, после него — условие, а в самом конце строки должно быть двоеточие.
Все строки кода, которые должны выполнится при срабатывании условия, должны быть написаны с отступом в четыре пробела относительно ключевого слова if. По отступам Python понимает, что эти строки относятся именно к if, и выполнит их только если условие будет истинным. В нашем примере, вывод строки «Угадали!» будет выполнен только если пользователь введет правильное число.
Да, про модули мы поговорим позже, но, как вы уже возможно догадались, random.randint возвращает случайное число, а строка import random загружает модуль для работы со случайными числами в нашу программу. Список того, что может этот модуль можно посмотреть вот на этой странице. Сейчас мы, однако, говорим об условиях и поэтому продолжим:
import random num = random.randint(1,10) guess = int(input('Введите число от 1 до 10: ')) if guess == num : print('Угадали!') else: print('Извините, было загадано число ', num)
Мы добавили оператор else, который отвечает за то, чтобы выполнить какой‑либо код в том случае, если не сработает оператор if. Связку этих двух операторов можно прочитать как «если какое‑то условие верно, выполнить такой‑то код, иначе — выполнить какой‑то другой код».
Кроме операторов if и else в одной связке можно использовать оператор elif. Он пригодится, если нужно что‑то посложнее реакции на верное или неверное условие. Например, нашу игру «Угадай число» можно дополнить еще двумя условиями проверки выхода введенного числа за допустимые границы:
import random num = random.randint(1,10) guess = int(input('Введите число от 1 до 10: ')) if guess == num : print('Угадали!') elif guess > 10: print('Число не может быть больше 10') elif guess < 1: print('Число не может быть меньше 10') else: print('Извините, было загадано число ', num)
дальше
Ветвление — Python documentation
Ветвление — Python documentationВетвления это способ изменить поведение программы в завивимости от каких-либо условий. Например, если пользователь ввёл логин и пароль, мы можем пустить его дальше, иначе мы просим ввести его данные заново:
login = input("Логин: ") password = input("Пароль: ") if len(login) > 6 and len(password) > 8: print("Приветствуем!") else: print("Введите данные полностью")
Здесь мы просим пользователя ввести свой логин и пароль. Пока что ограничимся простой проверкой — если длина логина больше шести символов и вместе с этим длина пароля больше восьми, мы его приветствуем.
Здесь есть сразу несколько новых вещей, во первых это len
, во вторых это
главное за чем мы здесь собрались — конструкция ветвления.
-
len
(s) Возвращает длину переданной строки:
word = "Condition" word_length = len(word) print(word_length)
Условный оператор
Условный оператор позволяет выполнить какое-либо действие если выполняется
условие. В результате проверки порождается особый тип данных bool
булевый.
Данный тип способен принимать всего 2 значения — истина и ложь.
>>> 20 > 15 True >>> 20 < 15 False
Оператор if
проверяет условие и если оно истинно, выполняет действие:
price = 32.5 cash = 50 if cash > price: print("Вам хватит денег для покупки")
Блок else
выполняется в том случае, если результат проверки оказался ложным:
your_age = int(input("Введите ваш возраст: ")) required_age = 18 if your_age < required_age: print("Вы слишком юны для вождения автомобиля") else: print("Вы можете водить автомобиль")
Блок elif
выполняется если предыдущая проверка не увенчалась успехом, но
есть ещё другие варианты проверок. В данной программе предлагается ввести
имеющееся у вас количество денег чтобы узнать что стоит покупать:
cash = int(input("Введите имеющееся количество денег: ")) if cash > 100: print("Купить шоколадку") elif cash > 50: print("Купить чипсы") else: print("Не брать ничего")
Здесь программа просит вас ввести ваш возраст возраст и говорит, можно ли вам
водить автомобиль. Когда введёте число, будет произведена проверка — если
ваш возраст меньше 18, результат будет истина и тогда выполнится код,
написанный внутри блока if
. Если же вы ввели число 18 или больше, то в
результате проверки получится ложь
else
.Объединение проверок
Если мы с вами хотим проверить несколько вещей и на их основе выполнить
действие, то нам придётся использовать 2 ключевых слова: and
и or
.
Они позволяют объединить результаты нескольких проверок вместе. Например,
если пользователь вводит или свою почту или номер телефона, он будет получать
уведомления с новостями:
email = input("Введите электронную почту: ") phone = input("Введите номер телефона:") if len(email) > 8 or len(phone) > 10: print("Мы уведомим вас о наших обновлениях") else: print("Мы не сможем уведомить вас, поскольку не знаем ваших данных")
Логическое «И» (конъюнкция, логическое умножение)
A | B | A and B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Логическое «ИЛИ» (дизъюнкция, логическое сложение)
A | B | A or B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Логическое «НЕ» (инверсия, отрицание)
A | not A |
---|---|
0 | 1 |
1 | 0 |
Задачи
Получить от пользователя число и сообщить является оно положительным, отрицательным или нулём.
Фирма набирает сотрудников и ей нужны молодые кадры со стажем. Возраст от 20 лет, стаж от трёх. Приложение запрашивает у пользователя его возраст и стаж и говорит, подходит ли тот под требования фирмы.
Написать программу, которая будет запрашивать у пользователя 6 раз направление движения и передвигать черепашку в указанном направлении. Должны поддерживаться команды “вверх”, “вниз”, “влево”, “вправо”. Для реализации движения в заданных направлениях предлагается создать соответствующие функции. Для установки нужного угла использовать функцию
seth(angle)
.Пользователь вводит номер месяца, приложение сообщает, какое это время года. Весна (3,4,5), лето (6,7,8), осень (9,10,11) зима (12,1,2)).
Пример:
Номер месяца: 6 Лето Номер месяца: 12 Зима Номер месяца: 13 Такого месяца нет
- Versions
- latest
- Downloads
- html
- On Read the Docs
- Project Home
- Builds
Free document hosting provided by Read the Docs.
Ветвление в воздушном потоке | Astronomer Documentation
При проектировании конвейеров данных вы можете столкнуться с вариантами использования, которые требуют более сложных потоков задач, чем «Задача A > Задача B > Задача C». Например, у вас может быть вариант использования, когда вам нужно выбрать между несколькими задачами для выполнения на основе результатов вышестоящей задачи. Или у вас может быть случай, когда часть вашего конвейера должна работать только при определенных внешних условиях. К счастью, в Airflow есть несколько вариантов построения условной логики и/или перехода к вашим DAG.
В этом руководстве вы узнаете, как использовать @task.branch
(BranchPythonOperator) и @task.short_circuit
(ShortCircuitOperator), другие доступные операторы ветвления и дополнительные ресурсы для реализации условной логики в ваших DAG Airflow. .
Предполагаемые знания
Чтобы получить максимальную отдачу от этого руководства, вы должны понимать:
- Операторы воздушного потока. См. Операторы 101.
- Зависимости в воздушном потоке. См. Управление зависимостями в Apache Airflow.
- Использование декораторов Airflow. См. Введение в декораторы Airflow.
@task.branch
(BranchPythonOperator) Один из самых простых способов реализовать ветвление в Airflow — использовать декоратор @task.branch
, который представляет собой декорированную версию BranchPythonOperator. @task.branch
принимает любую функцию Python в качестве входных данных, если функция возвращает список допустимых идентификаторов для задач Airflow, которые DAG должна запускать после завершения функции.
В следующем примере мы используем функцию Choose_branch
, которая возвращает один набор идентификаторов задач, если результат больше 0,5, и другой набор, если результат меньше или равен 0,5:
- TaskFlow API
- Традиционный синтаксис
результат = 1@task. branch
def Choose_branch(result):
если результат > 0.5:
return ['task_a', 'task_b']
return ['task_c']Choose_branch(result)
В общем, декоратор @task.branch
— хороший выбор, если логику ветвления можно легко реализовать в простой функции Python. Хотите ли вы использовать украшенную версию или традиционный оператор, это вопрос личных предпочтений.
В приведенном ниже коде показан полный пример использования @task.branch
в DAG:
- TaskFlow API
- Традиционный синтаксис
"""Пример DAG, демонстрирующий использование `@task.branch `
TaskFlow API decorator."""из airflow.decorators import dag, task
из airflow.operators.empty import EmptyOperator
из airflow.utils.edgemodifier import Labelimport random
from маятник import datetime@dag(
start_date=datetime(2023, 1, 1),
catchup=False,
schedule="@daily"
)
def branch_python_operator_decorator_example():run_this_first = EmptyOperator(task_id="run_this_first")
options = ["branch_a options = ["branch_a ", "ветвь_b", "ветвь_c", "ветвь_d"]
@task. branch(task_id="branching")
def random_choice(choices):
return random.choice(choices)random_choice_instance = random_choice(choices=options)
run_this_first >> random_choice_instance
(Empty_Operator)
task_id="join",
trigger_rule="none_failed_min_one_success"
)для опции в опциях:
t = EmptyOperator(
task_id=option
)empty_follow option="_follow"9 9 EmptyOperator(0044 )
# Метка здесь необязательна, но может помочь идентифицировать более сложные ветки .choice() возвращает один случайный вариант из списка из четырех ветвей. На следующем снимке экрана, где
branch_b
был выбран случайным образом, две задачи вbranch_b
были успешно выполнены, а другие пропущены.
Если у вас есть подчиненные задачи, которые необходимо выполнять независимо от того, какая ветвь выбрана, например задача
join
в предыдущем примере, вам необходимо обновить правило триггера. Правило триггера по умолчанию в Airflow —all_success
, что означает, что если вышестоящие задачи пропущены, нижестоящая задача не запустится. В предыдущем примере указано значениеnone_failed_min_one_success
, указывающее, что задача должна выполняться до тех пор, пока успешно выполняется одна вышестоящая задача и ни одна из задач не завершилась сбоем.Наконец, обратите внимание, что с декоратором
@task.branch
ваша функция Python должна возвращать хотя бы один идентификатор задачи для любой выбранной ветки (т. е. она не может ничего возвращать). Если один из путей в вашей ветке не должен ничего делать, вы можете использовать EmptyOperator в этой ветке.
@task.short_circuit
(ShortCircuitOperator)Другим вариантом реализации условной логики в ваших DAG является декоратор
@task.short_circuit
, который является модифицированной версией ShortCircuitOperator. Этот оператор принимает функцию Python, которая возвращаетTrue
илиFalse
в зависимости от логики, реализованной для вашего варианта использования. Если возвращаетсяTrue
, DAG продолжает работу, а если возвращаетсяFalse
, все последующие задачи пропускаются.
@task.short_circuit
полезен, когда вы знаете, что некоторые задачи в вашей DAG должны выполняться только изредка. Например, ваша DAG может выполняться ежедневно, но некоторые задачи должны выполняться только по воскресеньям. Или, может быть, ваша DAG управляет моделью машинного обучения, и задачи, которые публикуют модель, должны выполняться только в том случае, если после обучения достигается определенная точность. Этот тип логики также может быть реализован с помощью@task.branch
, но этот оператор требует возврата идентификатора задачи. Использование декоратора@task.short_circuit
может быть чище в случаях, когда условная логика эквивалентна «запустить или нет», а не «запустить то или иное».В следующей DAG показан пример реализации
@task.short_circuit
:
- TaskFlow API
- Традиционный синтаксис
"""Пример DAG, демонстрирующий использование декоратора @task. short_circuit."""из airflow.decorators import dag, задача
из цепочки импорта airflow.models.baseoperator
из airflow.operators.empty import EmptyOperatorиз маятника import datetime
@dag(
start_date=datetime(2023, 1, 1),
schedule="@daily",
catchup=False,
)
def short_circuit_operator_decorator_example():@task.short_circuit
def condition_is_True():
return True0044 return Falseds_true = [EmptyOperator(task_id='true_' + str(i)) для i в [1, 2]]
ds_false = [EmptyOperator(task_id='false_' + str(i)) для i в [1, 2]]chain(condition_is_True(), *ds_true)
chain(condition_is_False(), *ds_false)short_circuit_operator_decorator_example()
В этой DAG есть два коротких замыкания 90, одно из которых0 всегда возвращает 90 True и тот, который всегда возвращает False
. Когда вы запускаете DAG, вы можете видеть, что задачи ниже по течению от Выполнен оператор условия True
, в то время как задачи ниже по потоку от оператора условия False
были пропущены.
Другие операторы ветвления
Airflow предлагает несколько других операторов ветвления, которые работают аналогично BranchPythonOperator, но для более конкретных контекстов:
- BranchSQLOperator: ветвление на основе того, возвращает ли данный SQL-запрос
true
или false.
- BranchDayOfWeekOperator: переходы на основе того, равен ли текущий день недели заданному
параметр week_day
. - BranchDateTimeOperator: переходы на основе того, находится ли текущее время между
target_lower
иtarget_upper
раз.
Все эти операторы принимают параметры follow_task_ids_if_true
и follow_task_ids_if_false
, которые предоставляют список задач для включения в ветвь на основе логики, возвращаемой оператором.
Дополнительные ресурсы ветвления
BranchPythonOperator — это гораздо больше, чем просто выбор одной задачи над другой.
- Что делать, если вы хотите запускать свои задачи только в определенные дни? А не в праздники?
- Что делать, если вы хотите инициировать запуск DAG только в том случае, если предыдущий был успешным?
Для получения дополнительных рекомендаций и рекомендаций по распространенным случаям использования, таким как приведенные выше, попробуйте Astronomer's Бесплатный курс Академии по ветвлению уже сегодня.
Ветвление воздушного потока | Astronomer Documentation
При проектировании конвейеров данных вы можете столкнуться с вариантами использования, которые требуют более сложных потоков задач, чем «Задача A > Задача B > Задача C». Например, у вас может быть вариант использования, когда вам нужно выбрать между несколькими задачами для выполнения на основе результатов вышестоящей задачи. Или у вас может быть случай, когда часть вашего конвейера должна работать только при определенных внешних условиях. К счастью, в Airflow есть несколько вариантов построения условной логики и/или перехода к вашим DAG.
В этом руководстве вы узнаете, как использовать @task.branch
(BranchPythonOperator) и @task.short_circuit
(ShortCircuitOperator), другие доступные операторы ветвления и дополнительные ресурсы для реализации условной логики в ваших DAG Airflow. .
Предполагаемые знания
Чтобы получить максимальную отдачу от этого руководства, вы должны понимать:
- Операторы воздушного потока. См. Операторы 101.
- Зависимости в воздушном потоке. См. Управление зависимостями в Apache Airflow.
- Использование декораторов Airflow. См. Введение в декораторы Airflow.
@task.branch
(BranchPythonOperator) Один из самых простых способов реализовать ветвление в Airflow — использовать декоратор @task.branch
, который представляет собой декорированную версию BranchPythonOperator. @task.branch
принимает любую функцию Python в качестве входных данных, если функция возвращает список допустимых идентификаторов для задач Airflow, которые DAG должна запускать после завершения функции.
В следующем примере мы используем функцию Choose_branch
, которая возвращает один набор идентификаторов задач, если результат больше 0,5, и другой набор, если результат меньше или равен 0,5:
- TaskFlow API
- Традиционный синтаксис
результат = 1@task.branch
def Choose_branch(result):
если результат > 0.5:
return ['task_a', 'task_b']
return ['task_c']Choose_branch(result)
В общем, декоратор @task.branch
— хороший выбор, если логику ветвления можно легко реализовать в простой функции Python. Хотите ли вы использовать украшенную версию или традиционный оператор, это вопрос личных предпочтений.
В приведенном ниже коде показан полный пример использования @task.branch
в DAG:
- TaskFlow API
- Традиционный синтаксис
"""Пример DAG, демонстрирующий использование `@task. branch `
TaskFlow API decorator."""из airflow.decorators import dag, task
из airflow.operators.empty import EmptyOperator
из airflow.utils.edgemodifier import Labelimport random
from маятник import datetime@dag(
start_date=datetime(2023, 1, 1),
catchup=False,
schedule="@daily"
)
def branch_python_operator_decorator_example():run_this_first = EmptyOperator(task_id="run_this_first")
options = ["branch_a options = ["branch_a ", "ветвь_b", "ветвь_c", "ветвь_d"]
@task.branch(task_id="branching")
def random_choice(choices):
return random.choice(choices)random_choice_instance = random_choice(choices=options)
run_this_first >> random_choice_instance
(Empty_Operator)
task_id="join",
trigger_rule="none_failed_min_one_success"
)для опции в опциях:
t = EmptyOperator(
task_id=option
)empty_follow option="_follow"9 9 EmptyOperator(0044 )
# Метка здесь необязательна, но может помочь идентифицировать более сложные ветки . choice() возвращает один случайный вариант из списка из четырех ветвей. На следующем снимке экрана, где
branch_b
был выбран случайным образом, две задачи вbranch_b
были успешно выполнены, а другие пропущены.
Если у вас есть подчиненные задачи, которые необходимо выполнять независимо от того, какая ветвь выбрана, например задача
join
в предыдущем примере, вам необходимо обновить правило триггера. Правило триггера по умолчанию в Airflow —all_success
, что означает, что если вышестоящие задачи пропущены, нижестоящая задача не запустится. В предыдущем примере указано значениеnone_failed_min_one_success
, указывающее, что задача должна выполняться до тех пор, пока успешно выполняется одна вышестоящая задача и ни одна из задач не завершилась сбоем.Наконец, обратите внимание, что с декоратором
@task.branch
ваша функция Python должна возвращать хотя бы один идентификатор задачи для любой выбранной ветки (т. е. она не может ничего возвращать). Если один из путей в вашей ветке не должен ничего делать, вы можете использовать EmptyOperator в этой ветке.
@task.short_circuit
(ShortCircuitOperator)Другим вариантом реализации условной логики в ваших DAG является декоратор
@task.short_circuit
, который является модифицированной версией ShortCircuitOperator. Этот оператор принимает функцию Python, которая возвращаетTrue
илиFalse
в зависимости от логики, реализованной для вашего варианта использования. Если возвращаетсяTrue
, DAG продолжает работу, а если возвращаетсяFalse
, все последующие задачи пропускаются.
@task.short_circuit
полезен, когда вы знаете, что некоторые задачи в вашей DAG должны выполняться только изредка. Например, ваша DAG может выполняться ежедневно, но некоторые задачи должны выполняться только по воскресеньям. Или, может быть, ваша DAG управляет моделью машинного обучения, и задачи, которые публикуют модель, должны выполняться только в том случае, если после обучения достигается определенная точность. Этот тип логики также может быть реализован с помощью@task.branch
, но этот оператор требует возврата идентификатора задачи. Использование декоратора@task.short_circuit
может быть чище в случаях, когда условная логика эквивалентна «запустить или нет», а не «запустить то или иное».В следующей DAG показан пример реализации
@task.short_circuit
:
- TaskFlow API
- Традиционный синтаксис
"""Пример DAG, демонстрирующий использование декоратора @task.short_circuit."""из airflow.decorators import dag, задача
из цепочки импорта airflow.models.baseoperator
из airflow.operators.empty import EmptyOperatorиз маятника import datetime
@dag(
start_date=datetime(2023, 1, 1),
schedule="@daily",
catchup=False,
)
def short_circuit_operator_decorator_example():@task. short_circuit
def condition_is_True():
return True0044 return Falseds_true = [EmptyOperator(task_id='true_' + str(i)) для i в [1, 2]]
ds_false = [EmptyOperator(task_id='false_' + str(i)) для i в [1, 2]]chain(condition_is_True(), *ds_true)
chain(condition_is_False(), *ds_false)short_circuit_operator_decorator_example()
В этой DAG есть два коротких замыкания 90, одно из которых0 всегда возвращает 90 True и тот, который всегда возвращает False
. Когда вы запускаете DAG, вы можете видеть, что задачи ниже по течению от Выполнен оператор условия True
, в то время как задачи ниже по потоку от оператора условия False
были пропущены.
Другие операторы ветвления
Airflow предлагает несколько других операторов ветвления, которые работают аналогично BranchPythonOperator, но для более конкретных контекстов:
- BranchSQLOperator: ветвление на основе того, возвращает ли данный SQL-запрос
true
или false.