Python 有额外的while循环条件。。。基于一个条件?

Python 有额外的while循环条件。。。基于一个条件?,python,while-loop,Python,While Loop,变量a可以取任意数量的值。a的值是while循环所需的额外预定义条件量 这可以通过多个elif语句来完成,但是有更干净的方法吗 if a == 0: while condition_1: ... elif a == 1: while condition_1 or condition_2: ... elif a == 2: while condition_1 or condition_2 or condition_3: ...

变量
a
可以取任意数量的值。
a
的值是while循环所需的额外预定义条件量

这可以通过多个
elif
语句来完成,但是有更干净的方法吗

if a == 0:
    while condition_1:
        ...
elif a == 1:
    while condition_1 or condition_2:
        ...
elif a == 2:
    while condition_1 or condition_2 or condition_3:
        ...

你有没有试过这样的方法:

while (a >= 0 and condition_1) or (a >= 1 and condition_2) or (a >= 2 and condition_3) ...

您可以在时定义要计算的函数:

def test(a):
    if a == 1:
        return condition1(...)
    elif a == 2:
        return condition2(...) or condition1(...)
    elif a == 3:
        return condition2(...) or condition1(...) or condition3(...)
    else:
        return False

# test(a) will check the conditions ... define additional arguments if you need them
while test(a):
    do_stuff

它仍然有elifs,但您不需要编写
while
-循环多次。

其他语言使用
switch
语句的一般方法是创建一个字典,其中包含每个案例的函数:

conds = {
    0: lambda: condition_1,
    1: lambda: condition_1 or condition_2,
    2: lambda: condition_1 or condition_2 or condition_3
}
然后:

通过使用lambdas(如果条件特别复杂,则使用命名函数),可以在循环中每次计算适当的条件,而不是在定义字典时计算一次

在这个简单的例子中,
a
具有从0开始的顺序整数值,您可以使用一个列表并保存一些键入内容。为了进一步简化,您可以根据前一个条件定义每个条件,因为每次只需添加一个条件:

conds = [
     lambda: condition_1,
     lambda: conds[0]() or condition_2,
     lambda: conds[1]() or condition_3
]
或者,正如朱利安在评论中所说:

conds = [
     lambda: condition_1,
     lambda: condition_2,
     lambda: condition_3
]

while any(cond() for cond in conds[:a+1]):
    # do stuff

你想完成什么?你能给我们一个更具体的例子吗?+1关于一个聪明而简单的解决方案。但是,您可能需要指定lambdas的原因-如果我解释正确,那是因为不使用它们会导致布尔值在字典初始化时固定,对吗?是的。对于特别复杂的条件,也可以使用命名函数。在任何情况下,它都需要是一个函数,以将评估推迟到以后(并允许重复评估)。我个人建议将其直接输入到答案中,因此如果有人不理解,他们将立即得到解释小改进(可能?):define
conds=[lambda:cond1,lambda:cond2,…]
然后
而任何([cond()表示cond in conds[:a]])
都需要括号,因为
conds[a]
是一个函数,必须调用它才能计算其中定义的条件。有些令人困惑的是,函数对象本身是“真实的”,因此如果你不调用函数,你的
while
循环将永远运行。虽然从技术上讲是正确的,但我想建议读者,这是一个有点冗长、过度和非python式的解决方案,特别是当条件变得越来越复杂时。虽然有点不那么优雅,你的回答对我来说很管用。你能给我解释一下它是怎么工作的吗?
(a>=0和条件_1)
是迷你if语句吗?
关键字在逻辑上等同于嵌套的
if
语句,因此,排序。。。
conds = [
     lambda: condition_1,
     lambda: condition_2,
     lambda: condition_3
]

while any(cond() for cond in conds[:a+1]):
    # do stuff