我试着在列表中迭代elif语句,最后加上一个else语句。下面是我的代码:
if clickPoint is None:
print(clickPoint)
for each in meal_objects:
if inside(clickPoint, each._button):
each._button.setFill('green')
break
for each in build_meal_objects:
if inside(clickPoint, each._button):
each._button.setFill('green')
break
for each in ingredient_objects:
if inside(clickPoint, each._button):
each._button.setFill('green')
break
else:
print(clickPoint)meal_objects、build_meal_objects和ingredient_objects都是列表。
问题是,由于许多原因,这段代码非常可怕。如果不满足第一个条件,则每个for循环都将运行,即使其中一个for循环条件已经运行,最后的else语句也将运行。实际上,如果满足任何for循环中的任何if语句,则不应执行if块的其余部分。
代码应该更像下面这样的伪代码:
if clickPoint is None:
print(clickPoint)
elif for each in meal_objects:
if inside(clickPoint, each._button):
each._button.setFill('green')
break
elif for each in build_meal_objects:
if inside(clickPoint, each._button):
each._button.setFill('green')
break
elif for each in ingredient_objects:
if inside(clickPoint, each._button):
each._button.setFill('green')
break
else:
print(clickPoint)我觉得我可能忽略了一些非常简单的东西,所以如果是这样或如果这是一个写得很差的问题,请原谅我。谢谢!
发布于 2017-06-24 18:33:13
可能最简单(也是最灵活)的方法是将它们放在一个函数中并强制执行return,例如:
def f(clickPoint, *lists):
if clickPoint is None:
# or raise an exception instead as seems more an exception than natural
return (None, None)
for lst in lists:
for item in lst:
if inside(clickPoint, item._button):
item._button.setFill('green')
return (lst, item)
return (None, None)然后将其称为:
lst, item = f(clickPoint, meal_objects, build_meal_objects, ingredient_objects)这意味着只有所有列表的第一个元素会有一个填充集,它会返回一个对列表和设置的项目的引用,如果您想要打印,可以在以后检查这些引用。
例如:
if (lst, item) == (None, None):
# handle that nothing was set?
else:
# you know which button (`item`) in which list (`lst`) had its fill changed 我想如果你真的有需要,你可以使用Python语言的for/else语法,但这需要你有效地将序列链接到一个for上来发出break,例如:
for lst, item in ((lst, item) for lst in (meal_objects, build_meal_objects, ingredient_objects) for item in lst):
if inside(clickPoint, item._button):
item._button.setFill('green')
break
else: # this only enters if `break` was NOT issued in the for-loop
print('nothing set')发布于 2017-06-24 19:50:43
好的,这需要一些解释。请看下面的内容。
for x in range(5):
for y in range(5):
print (x*y)
if x*y==3:
break
else:
continue # executed if the loop finished normally (no break)
break # executed if 'continue' was skipped (break)上面的程序只是打印值,直到找到一个3。
输出:
0
0
0
0
0
0
1
2
3如果最后的continue和else不存在呢?
for x in range(5):
for y in range(5):
print (x*y)
if x*y==3:
break输出:
0
0
0
0
0
0
1
2
3
0
2
4
6
8
0
3
0
4
8
12
16看,它甚至在找到一个3之后都不会停止,这是因为break只会导致退出内部循环。因此,第一个代码可用于退出嵌套循环。甚至是一个非常深的嵌套循环。
那么,如何在代码中应用这一点呢?看看这个!
my_objects = {0: meal_objects, 1: build_meal_objects, 2: ingredient_objects}
flag2=True
flag1=True
if clickPoint is None:
print(clickPoint)
flag2=False
if flag2:
for i in range(3):
temp_obj = my_objects[i]
for each in temp_obj:
if inside(clickPoint, each._button):
each._button.setFill('green')
flag1=False
break
else:
continue
break
if flag1 and flag2:
print(clickPoint)使用标志变量。现在,在上面的代码中,首先设置flag1=True和flag2=True。执行第一个if块,如果clickPoint为None,则打印它。并将flag2设置为 False.
我为什么要这么做?以确保它在下一条if语句中失败。因此,您的任何for循环都不会执行。
下一部分,如果incase clickPoint不是None。执行下一个if,注意这里是我做了一个小改动的地方!
my_objects = {0: meal_objects, 1: build_meal_objects, 2: ingredient_objects}创建对象的dict并使用range(your_dict_size)逐个获取它们。注意通过这种方式,你可以添加越来越多的对象。
还记得我解释过的退出嵌套循环的吗?这就是发生的事情。一旦你得到了你想要的东西,就这样,控制退出,不再运行循环。
并将flag1设置为False
注意:使用两个标志变量的原因是为了确保您的else部分(这里是最后一个if)总是在前两个if失败的情况下执行。
发布于 2017-06-24 18:30:56
我想这就是你想要做的:
if clickPoint is None:
print(clickPoint)
else:
called = False
for each in meal_objects:
if inside(clickPoint, each._button):
each._button.setFill('green')
called = True
break
if not called:
for each in build_meal_objects:
if inside(clickPoint, each._button):
each._button.setFill('green')
called = True
break
if not called:
for each in ingredient_objects:
if inside(clickPoint, each._button):
each._button.setFill('green')
called = True
break
if not called:
print(clickPoint)这确保了只有一个for循环调用each._button.setFill('green')。如果它们都没有调用它,则运行print语句。
https://stackoverflow.com/questions/44735330
复制相似问题