Как выйти из предложения 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, оберните оставшийся код в большой блок else. Пример:
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, я полагаю, что выход из них пропустит их.
9 ответов:
(этот метод работает для
if
s, несколько вложенных циклов и другие конструкции, которые вы не можетеbreak
С легкостью.)оберните код в свою функцию. Вместо
break
используйтеreturn
.пример:
def some_function(): if condition_a: # do something and return early ... return ... if condition_b: # do something else and return early ... return ... return if outer_condition: ... some_function() ...
from goto import goto, label if some_condition: ... if condition_a: # do something # and then exit the outer if block goto .end ... if condition_b: # do something # and then exit the outer if block goto .end # more code here label .end(на самом деле не использовать это, пожалуйста.)
while some_condition: ... if condition_a: # do something break ... if condition_b: # do something break # more code here break
вы можете эмулировать функциональность goto с исключениями:
try: # blah, blah ... # raise MyFunkyException as soon as you want out except MyFunkyException: pass
отказ от ответственности: я только хочу обратить ваше внимание на возможность делать вещи таким образом, хотя я никоим образом не поддерживаю его как разумный при нормальных обстоятельствах. Как я уже упоминал в комментарии к этому вопросу, структурирование кода таким образом, чтобы избежать византийских условностей, в первую очередь, предпочтительнее. : -)
может быть это?
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
вообще говоря, нет. Если вы гнездования "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, они могут быть объявлены заранее ;) это было бы лучшим выбором, так как это позволит избежать необходимости рефакторинга уродливого if/then позже.
для того, что на самом деле было задано, мой подход заключается в том, чтобы поставить эти
if
s внутри одной петли петли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
фактически то, что вы описываете, - это операторы 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
Так вот я понимаю, что вы пытаетесь вырваться из внешних Если блок кода
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, который затем неявно выйдет из блока кода, затем вы используете блок else для вложения других ifs в сделать что-то
if test_for_false: # Exit the code(which is the outer if code) else: if condition_a: # Do something if condition_b: # Do something