Python: While 循环,在不同的条件下执行相同的代码。优雅与架空

Python: While Loops, Executing the same code under different conditions. Elegance and overhead

在python中: 我希望在 while 循环中执行相同的代码块,但在不同的条件下,带有一个应该检查哪个条件的标志。 此外,在这种情况下,标志不会在执行期间更改,并且只有一个标志对于程序的这一部分是活动的。

我可以这样做:

#user inputs flag
if flag == "flag1": flag1 = True
elif flag == "flag2": flag2 = True
#...
#define parameters    
while (flag1 and condition1) or (flag2 and condition2) ... or (flagN and conditionN):
    #do stuff #using parameters

由于"and"在python.[=13中的工作方式,这种方法可以,因为它只会检查标志,而不是每次都计算每个括号的条件=]

def dostuff(parameters):
    #do stuff

#user inputs flag
if flag == "flag1": flag1 = True
elif flag == "flag2": flag2 = True
#...

#define parameters

if flag1:
    while(condition1):
        dostuff(parameters)
elif flag2:
    while(condition2):
        dostuff(parameters)
etc... down to N

会完成同样的事情,可能是相同的开销。

我只是想知道是否有人可以在编程实践和可读性方面提出更好的方法,或者这是否是最好的通用方法。

谢谢

您可以使用任何:

while any((flag1 and condition1),(flag2 and condition2),(flagN and conditionN))

您的两种方法之间也存在差异,如果任何条件都可以影响另一个,那么这两个示例的行为可能会有所不同。

您还可以制作一个配对容器并迭代:

data = ((flag1, condition1),(flag2, condition2),(flagN,conditionN))

for flag, cond in data:
   if flag:
       while cond:
         do_stuff(parameters)

它将避免重复代码并且可读。

您可以使用 dict 个 lambda 表达式:

conditions = {
    flag1: lambda: cond1,
    flag2: lambda: cond2,
    flag3: lambda: cond3}

while conditions[flag]():
    do_stuff(parameters)

示例:

conditions = {
    "flag1": lambda: x < 10,
    "flag2": lambda: x < 3,
    "flag3": lambda: x < 5}

x = 0
while conditions["flag2"]():
    print(x)
    x += 1

输出:

0
1
2