这只是为了学术兴趣。我经历了很多以下情况。
either_true = False
if x:
...do something1
either_true = True
elif y:
...do something2
either_true = True
if either_true:
..do something3
是否有任何pythonic方式,或通常更好的编程方式。 基本上只有当或者elif为真时才执行something3。
答案 0 :(得分:35)
如果either_true
是一行代码(例如函数调用),您也可以完全省略doSomething3
标志:
if x:
..do something 1
..do something 3
elif y:
..do something 2
..do something 3
它保留了最多评估x
和y
一次的良好属性(如果y
为真,则不会评估x
。)
答案 1 :(得分:31)
就代码重复和评估而言,您的代码几乎 。我唯一能想到避免重复的事情就是:
# be optimistic!
either_true = True
if x:
do_something1
elif y:
do_something2
else:
either_true = False
if either_true:
do_something3
这会删除一个作业,但总行数不会改变。
优点是,这适用于n
条件,而不添加任何其他任务,而您当前的解决方案需要either_true = True
来满足每个条件。
在我看来,它们具有相同程度的可读性,但上述代码在更多条件下会更好。
此外,没有“pythonic”方式,除了一个可读的解决方案,避免代码重复,并在效率方面是最佳的,我不知道任何类型的“更好的编程”,以实现相同的结果。
答案 2 :(得分:19)
我会通过使用嵌套的if语句来处理这个问题,即。
if x or y:
if x:
...do something1
elif y:
...do something2
...do something3
正如一些评论所指出的,最佳解决方案将取决于x&是的。如果您的目标是易于阅读/简洁的代码,那么这个或其他答案应该没问题。然而,如果x&你是昂贵的函数调用,那么最好做一些更像你所做的事情,以避免两次调用函数。
答案 3 :(得分:7)
你可以将其中一些包装在一个函数中:
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
答案 4 :(得分:6)
本着为已经提出的解决方案提供完全不同的解决方案的精神,您可以设置一个列表结构化词典,允许您设置绑定到预定义的多个案例" somethings"
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语句的情况下添加多个案例很容易。
答案 5 :(得分:5)
if x or y:
dosomethig1() if x else dosomething2()
dosomething3()
当然,这会评估x.__nonzero__
两次。通常这不是什么大问题,但如果它很昂贵,你可以随时评估它并将其保存到一个临时变量。
答案 6 :(得分:4)
对于所有这些建议以及您提出的任何其他建议,请注意,如果x
和y
是昂贵的表达方式:
if askTheServer() or readTheOneGigabyteConfigFile():
...
您可以首先将这些表达式返回的值分配给快速评估变量:
x = askTheServer()
y = readTheOneGigabyteConfigFile()
if x or y :
...
答案 7 :(得分:2)
either_true = x or y
if x:
...do something1
elif y:
...do something2
if either_true:
..do something3
答案 8 :(得分:2)
我会在函数中包含..do事件并编写一个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()
如果......做某事涉及很多事情,这很好。
答案 9 :(得分:0)
如果做某事很短,比如做(1),做(2)或类似的东西,你可以这样做:
(x and (do(1), x) or y and (do(2), y)) and do(3)