【问题标题】:Better/simpler control flow for: if A, elif B, if A or B, else更好/更简单的控制流程:if A, elif B, if A or B, else
【发布时间】:2019-11-02 04:05:56
【问题描述】:

我有以下控制流程,我觉得可以改进,但我不知道如何...

我有两个互斥条件和相应的操作,需要执行特定条件(即当那个为真时)和非特定条件(即当任一为真时)。我也想在两个条件都不匹配时做点什么。

原来我有:

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(”也是因为任何条件都为真“)”部分是一些大代码块时,重复它似乎不切实际。于是我想到了

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 语句更难快速理解。

另外我需要记住,我希望在任何条件特定操作之后运行“也是因为任何条件为真”。

我的目标/问题是,是否有一种巧妙的方法可以简化此控制流程并使其易于理解。例如,一种只有 3 个控制块(if、elif、else)的方法,或者通常只对每个单独的条件进行一次评估。

谢谢你:)

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

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

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

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

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

然后我根据满足的条件创建视频或图像。 如果其中一个是真的,我会告诉用户它是成功的。 如果不满足条件,说明路径有问题,我想相应地通知用户。

【问题讨论】:

  • 如果这些是您不想继续执行的复杂条件,您可以将它们提取到变量中
  • 好点,但就我而言,条件实际上并不太复杂,所以问题更多来自追求最优/完美
  • 我想你已经给出了所有的选择。据我所知,没有其他选择。选择你认为最好的。
  • @pcsso 你能解释一下这些条件吗?根据他们的不同,它可能存在更好的选择
  • 你可以把“一些大代码块,重复它似乎不切实际”放在一个函数中,并使用第一个块作为它最可读的块。

标签: python if-statement controls execution


【解决方案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')

通过这种方式,您可以在不编辑逻辑的情况下扩展数据结构以拥有很多条件,也可以删除重复

【讨论】:

  • 非常有趣!虽然复杂性基本保持不变,但我真的很喜欢增加的灵活性。
  • 唯一的缺点是数据结构是静态的。意思是,如果条件1改变了,它不会在字典中改变
  • 你可以把一个动态对象的引用放到数据结构中来解决这个问题
  • 实际上它必须是一个动态对象而不是布尔值。由于只能有 2 个布尔键...
  • 是的,你必须在某处写下你的条件,写一次,然后在程序中任何你想要相同条件的地方使用对它的引用,然后如果你编辑你的条件,新的条件将被使用无处不在
猜你喜欢
  • 2018-01-29
  • 2015-06-15
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多