嵌套在每个级别具有不同函数调用的循环的可变长度

Variable length nested for loops with different function calls at each level

提问人:OlorinIstari 提问时间:3/24/2023 最后编辑:OlorinIstari 更新时间:3/24/2023 访问量:42

问:

尽管已经问了这个问题的一些变体,但我找不到我想要的东西。

假设我有一个不同类的实例的可变长度向量:[objA, objB, objC],每个类都有一个返回特定值的方法,以及一个布尔值,call_method() 实际上就像“生成器”一样,每次调用都返回一个新和一个新的。它们实际上是生成器的包装器,如果生成器返回对象,则设置为 True,否则为 falsecall_method()vsvss

我想要一个这样的结构:

while True:
  v1, s1 = objA.call_method()
  if s1 == False:
    break # It is a failure
  while True:
    v2, s2 = objB.call_method()
    if s2 == False:
      break # break out of the middle loop and call objA again for a new v1, s1
    while True:
      v3, s3 = objC.call_method()
      if s3 == True:
        return [v1, v2, v3]
      if s3 == False:
        break #i.e. call objB again.

正如你在这里看到的,我不需要第三个对象,因为无论 true 还是 false,我都会退出循环。(为了完整起见,刚刚在此处添加)。只有当外循环成功(即 s = True)时,它才会进入内循环,并继续。while True

对于[objK]的任意列表实现这一点的最佳方法是什么?

嵌套 Python 循环

评论

0赞 John Gordon 3/24/2023
您需要保留 v1、s1、v2、s2 等吗?
0赞 OlorinIstari 3/24/2023
你能描述一下你的意思吗?我不需要,正如你所看到的,它只是进入下一个for循环的检查,但我最终需要返回if is set to trues1v1, v2, v3s3
0赞 John Gordon 3/24/2023
哦,我忽略了那个返回语句。我现在明白了。

答:

0赞 blhsing 3/24/2023 #1

给定具有该方法的对象列表,可以在索引处调用对象的方法,该索引与用于存储调用的返回值的单独输出列表的大小相匹配。如果返回标志为 ,则丢弃输出列表中的最后一个值。如果输出列表中没有要丢弃的值,则表示失败,在这种情况下,最好引发异常。当输出列表的大小与输入列表的大小匹配时,您将获得成功:call_methodcall_methodFalse

def call_method_until_all_success(objs):
    values = []
    while (index := len(values)) < len(objs):
        value, success = objs[index].call_method()
        if success:
            values.append(value)
        elif values:
            values.pop()
        else:
            raise RuntimeError # it is a failure
    return values

print(call_method_until_all_success([objA, objB, objC]))