提问人:OlorinIstari 提问时间:3/24/2023 最后编辑:OlorinIstari 更新时间:3/24/2023 访问量:42
嵌套在每个级别具有不同函数调用的循环的可变长度
Variable length nested for loops with different function calls at each level
问:
尽管已经问了这个问题的一些变体,但我找不到我想要的东西。
假设我有一个不同类的实例的可变长度向量:[objA, objB, objC],每个类都有一个返回特定值的方法,以及一个布尔值,call_method() 实际上就像“生成器”一样,每次调用都返回一个新和一个新的。它们实际上是生成器的包装器,如果生成器返回对象,则设置为 True,否则为 falsecall_method()
v
s
v
s
s
我想要一个这样的结构:
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]的任意列表实现这一点的最佳方法是什么?
答:
0赞
blhsing
3/24/2023
#1
给定具有该方法的对象列表,可以在索引处调用对象的方法,该索引与用于存储调用的返回值的单独输出列表的大小相匹配。如果返回标志为 ,则丢弃输出列表中的最后一个值。如果输出列表中没有要丢弃的值,则表示失败,在这种情况下,最好引发异常。当输出列表的大小与输入列表的大小匹配时,您将获得成功:call_method
call_method
False
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]))
评论
s1
v1, v2, v3
s3