如果或者如果真的那么做一些事情

这只是为了学术兴趣。 我遇到以下情况很多。

either_true = False if x: ...do something1 either_true = True elif y: ...do something2 either_true = True if either_true: ..do something3 

有没有pythonic这样做的方式,或一般更好的编程方式做到这一点。 基本上做某事3只有在或者ELIF为真时才执行。

就代码重复性和评估而言,你的代码几乎是最优的。 我能想到的唯一避免重复的事情是:

 # be optimistic! either_true = True if x: do_something1 elif y: do_something2 else: either_true = False if either_true: do_something3 

这将删除一个分配,尽pipe总数不会改变。

好处是,它可以在n条件下工作,不需要添加任何其他的赋值,而当前的解决scheme需要对每个条件都使用一个either_true = True值。

在我看来,它们具有相同程度的可读性,但是上面的代码在更多条件下会更好。

除此之外,没有“pythonic”方法,除了一个可读的解决scheme,避免代码重复,并在效率方面是最佳的,我不知道任何一种“更好的编程”,以达到相同的结果。

如果doSomething3是一行代码(例如函数调用),那么也可以完全省略两个或either_true标志:

 if x: ..do something 1 ..do something 3 elif y: ..do something 2 ..do something 3 

它最多保持一次评估xy的好性质(如果x为真, y不会被评估)。

我会通过使用嵌套if语句来处理这个问题

 if x or y: if x: ...do something1 elif y: ...do something2 ...do something3 

正如一些评论指出的,最好的解决scheme将取决于x和y是什么。 如果易读性/简洁的代码是你的目标,那么这个或其他答案应该没问题。 然而,如果x和y是昂贵的函数调用,那么最好是做更多的事情,比如你已经做了避免两次调用函数的事情。

你可以把它包装在一个函数中:

 def do_stuff(): if x: ...do something1 return True elif y: ...do something2 return True else: return False if do_stuff(): ..do something3 

或者全部在一个函数中:

 def do_stuff() if x: ...do something1 elif y: ...do something2 else: return ..do something3 

本着为已经提出的解决scheme提供完全不同的解决scheme的精神,您可以设置一个列表结构化的字典,它允许您设置绑定到您预定义的“某些事物”

 cases = [ {'condition' : x, 'action' : something1}, {'condition' : not x and y, 'action' : something2}, {'condition' : x or y, 'action' : something3}, ] for c in cases: if c['condition']: c['action'] 

其实我真的很喜欢这个方法(我只是在试图提出这个问题的唯一答案时才发现它,谢谢!) – 很明显,哪种情况会绑定到哪个动作,并且很容易添加更多没有添加更多的if / else语句的情况。

 if x or y: dosomethig1() if x else dosomething2() dosomething3() 

当然,这确实评估x.__nonzero__两次。 通常这不是什么大问题,但是如果代价昂贵的话,你总是可以预先评估并将其保存到临时variables中。

对于所有这些build议和任何你想出来的,请注意,如果xy是昂贵的expression式:

 if askTheServer() or readTheOneGigabyteConfigFile(): ... 

您可以首先将这些expression式返回给快速评估variables的值:

 x = askTheServer() y = readTheOneGigabyteConfigFile() if x or y : ... 
 either_true = x or y if x: ...do something1 elif y: ...do something2 if either_true: ..do something3 

我会包装..在function上写一些if-elif:

 def do_x(): .. do something 1 .. do something 3 def do_y(): .. do something 2 .. do something 3 if x: do_x() elif y: do_y() 

这很好,如果..做一些事情涉及到很多东西。

如果做的东西很短,就像做(1),做(2)或类似的东西,你可以这样做:

 (x and (do(1), x) or y and (do(2), y)) and do(3)