Подтвердить что ты не робот

Как выйти из условия if

Какие существуют методы для преждевременного выхода из предложения if?

Иногда я пишу код и хочу поставить оператор break внутри предложения if, только чтобы помнить, что они могут использоваться только для циклов.

Давайте рассмотрим следующий код:

if some_condition:
   ...
   if condition_a:
       # do something
       # and then exit the outer if block
   ...
   if condition_b:
       # do something
       # and then exit the outer if block
   # more code here

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

if some_condition:
   ...
   if condition_a:
       # do something
       # and then exit the outer if block
   else:
       ...
       if condition_b:
           # do something
           # and then exit the outer if block
       else:
           # more code here

Проблема заключается в том, что больше мест выхода означает более вложенные/отступы.

В качестве альтернативы, я мог бы написать свой код, чтобы предложения if были как можно меньше и не требовали каких-либо выходов.

Кто-нибудь знает о хорошем/лучшем способе выхода из предложения if?

Если есть какие-либо связанные else-if и else, я полагаю, что выход будет пропустить их.

4b9b3361

Ответ 1

Этот метод работает для if s, нескольких вложенных циклов и других конструкций, из которых вы не можете break легко.

Оберните код в его собственную функцию. Вместо break, return.

Ответ 2

<Предварительно > от goto import goto, label если some_condition:  ...  если условие_a:      # сделай что-нибудь      #, а затем выйти из внешнего блока if      goto.end  ...  if condition_b:      # сделай что-нибудь      #, а затем выйти из внешнего блока if      goto.end  # еще код здесь label.end

(На самом деле не используйте это, пожалуйста.)

Ответ 3

while some_condition:
   ...
   if condition_a:
       # do something
       break
   ...
   if condition_b:
       # do something
       break
   # more code here
   break

Ответ 4

Вы можете эмулировать функциональность goto с исключениями:

try:
    # blah, blah ...
    # raise MyFunkyException as soon as you want out
except MyFunkyException:
    pass

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

Ответ 5

может быть это?

if some_condition and condition_a:
       # do something
elif some_condition and condition_b:
           # do something
           # and then exit the outer if block
elif some_condition and not condition_b:
           # more code here
else:
     #blah
if

Ответ 6

Вообще говоря, не надо. Если вы гнездились "ifs" и взломали их, вы делаете это неправильно.

Однако, если вы должны:

if condition_a:
   def condition_a_fun():
       do_stuff()
       if we_wanna_escape:
           return
   condition_a_fun()
if condition_b:
   def condition_b_fun():
       do_more_stuff()
       if we_wanna_get_out_again:
           return
   condition_b_fun()

Обратите внимание, что функции не должны быть объявлены в операторе if, они могут быть объявлены заранее;) Это был бы лучший выбор, так как он избежит необходимости реорганизовывать уродливое, если и затем позже.

Ответ 7

Для того, что на самом деле было задано, мой подход состоит в том, чтобы поместить те if внутри цикла с одним циклом

while (True):
    if (some_condition):
        ...
        if (condition_a):
            # do something
            # and then exit the outer if block
            break
        ...
        if (condition_b):
            # do something
            # and then exit the outer if block
            break
        # more code here
    # make sure it is looped once
    break

Проверьте это:

conditions = [True,False]
some_condition = True

for condition_a in conditions:
    for condition_b in conditions:
        print("\n")
        print("with condition_a", condition_a)
        print("with condition_b", condition_b)
        while (True):
            if (some_condition):
                print("checkpoint 1")
                if (condition_a):
                    # do something
                    # and then exit the outer if block
                    print("checkpoint 2")
                    break
                print ("checkpoint 3")
                if (condition_b):
                    # do something
                    # and then exit the outer if block
                    print("checkpoint 4")
                    break
                print ("checkpoint 5")
                # more code here
            # make sure it is looped once
            break

Ответ 8

Эффективно то, что вы описываете, - это операторы goto, которые обычно довольно сильно подкрашиваются. Ваш второй пример намного легче понять.

Тем не менее, чище все равно будет:

if some_condition:
   ...
   if condition_a:
       your_function1()
   else:
       your_function2()

...

def your_function2():
   if condition_b:
       # do something
       # and then exit the outer if block
   else:
       # more code here

Ответ 9

Мне не нравится вся идея структурирования кода таким образом. Я боюсь, что это приводит к тем же проблемам, что и при использовании операторов goto. (к счастью, Python не имеет инструкции).