如何退出if子句

过早退出if条款有哪些方法?

有些时候我正在编写代码,并且希望在if子句中放置一个break语句,只记得那些只能用于循环。

让我们以下面的代码为例:

 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子句,我认为退出会跳过它们。

这个方法适用于if s,多重嵌套循环和其他你不能轻易break构造。

将代码包装在自己的函数中。 而不是breakreturn

从转到import转到,标签

如果some_condition:
    ...
   如果condition_a:
        # 做一点事
        #然后退出外部的if块
        goto .end
    ...
   如果condition_b:
        # 做一点事
        #然后退出外部的if块
        goto .end
    #更多代码在这里

标签.end

(请不要实际使用这个。)

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

您可以模拟例外情况下的gotofunction:

 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语句中声明,它们可以预先声明;)这将是一个更好的select,因为它将避免在稍后/之后避免重构一个丑陋。

对于实际问题,我的方法是把这些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 

testing它:

 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 

有效地,你所描述的是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 

我不喜欢这样构造代码的整个想法。 我担心会导致与使用goto语句相同的问题。 (幸运的是,Python没有转到声明)。