如果或者elif要么是真的那么做点什么

时间:2014-02-13 14:04:13

标签: python python-2.7

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

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。

10 个答案:

答案 0 :(得分:35)

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

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

它保留了最多评估xy一次的良好属性(如果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)

对于所有这些建议以及您提出的任何其他建议,请注意,如果xy是昂贵的表达方式:

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)