Операторы ветвления: Операторы ветвления. — it-black.ru

Ветвление, условные операторы 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

Задачи

  1. Получить от пользователя число и сообщить является оно положительным, отрицательным или нулём.

  2. Фирма набирает сотрудников и ей нужны молодые кадры со стажем. Возраст от 20 лет, стаж от трёх. Приложение запрашивает у пользователя его возраст и стаж и говорит, подходит ли тот под требования фирмы.

  3. Написать программу, которая будет запрашивать у пользователя 6 раз направление движения и передвигать черепашку в указанном направлении. Должны поддерживаться команды “вверх”, “вниз”, “влево”, “вправо”. Для реализации движения в заданных направлениях предлагается создать соответствующие функции. Для установки нужного угла использовать функцию seth(angle).

  4. Пользователь вводит номер месяца, приложение сообщает, какое это время года. Весна (3,4,5), лето (6,7,8), осень (9,10,11) зима (12,1,2)).

    Пример:

    Номер месяца: 6
    Лето
    Номер месяца: 12
    Зима
    Номер месяца: 13
    Такого месяца нет
    

Read the Docs v: latest

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 Label

import 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 False

ds_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 Label

import 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 False

ds_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 .
Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *