我有以下控制流程,我认为可以改进,但是我不知道如何...
我有两个互为排他的条件和相应的操作,需要针对特定条件(例如,当一个条件为真时)和非特定条件(即,当两个条件为真时)执行。我也想在两个条件都不匹配的情况下做些事情。
最初我有:
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
然后我根据满足的条件创建视频或图像。 如果任何一个为真,则告诉用户成功。 如果不满足任何条件,则路径有问题,我想据此通知用户。
答案 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')
通过这种方式,您可以扩展数据结构以在不修改逻辑的情况下具有很多条件,还可以消除其重复项