更好/更简单的控制流程:如果是A,省略号B,如果是A或B,否则

时间:2019-06-19 12:07:03

标签: python if-statement controls execution

我有以下控制流程,我认为可以改进,但是我不知道如何...

我有两个互为排他的条件和相应的操作,需要针对特定​​条件(例如,当一个条件为真时)和非特定条件(即,当两个条件为真时)执行。我也想在两个条件都不匹配的情况下做些事情。

最初我有:

if condition1:
    print("something only on condition1")
    print("also this because any condition is True")
elif condition2:
    print("something only on condition2")
    print("also this because any condition is True")
else:
    print("do this when no condition")

但是,当“ print(“这也是因为任何条件为True”)组成的部分是一些较大的代码块时,似乎很难将其重复。因此我想到了

if condition1:
    print("something only on condition1")
elif condition2:
    print("something only on condition2")
if condition1 or condition2:
    print("also this because any condition is True")
else:
    print("do this when no condition")

但是,这感觉有些过头了。由于已经分别检查了两个条件,因此带有“或”语句的条件似乎不必要地多余。不过我可能会误会。

第三个选择是

if condition1 or condition2:
    if condition1:
        print("something only on condition1")
    elif condition2:
        print("something only on condition2")
    print("also this because any condition is True")
else:
    print("do this when no condition")

但是,这也不是真正的改进,我觉得堆叠的if语句更难于快速理解。

我还需要谨记,我希望在执行任何特定于条件的操作之后运行“也因为任何条件为True”。

我的目标/问题是是否存在简化此控制流程并使之易于理解的明智方法。例如,仅具有3个控制块(if,elif,else)的方法,或者通常仅对每个条件进行一次评估的方法。

谢谢:)

编辑: 实际任务的背景信息(仍简化了):

有两组(将来可能会更大):

img_extensions = ('.png', '.jpg')
video_extensions = ('.avi')

我现在得到一些路径[string],并想检查是否其中一个

path.endswith(img_extensions)      <- condition1
path.endswith(video_extensions)    <- condition2

然后我根据满足的条件创建视频或图像。 如果任何一个为真,则告诉用户成功。 如果不满足任何条件,则路径有问题,我想据此通知用户。

1 个答案:

答案 0 :(得分:1)

这是我要这样做的方式:

conditions = {
    condition1: lambda: print("something only on condition1"),
    condition2: lambda: print("something only on condition2")
}

for condition, action in conditions.items():
    if condition:
        action()

if any(conditions.keys()):
    print('also this because any condition is True')
else:
    print('do this when no condition')

通过这种方式,您可以扩展数据结构以在不修改逻辑的情况下具有很多条件,还可以消除其重复项