这更像是一个好奇心问题。有兴趣知道我们是否可以从字典值调用continue
这样的函数来跳过迭代
example_list = [1,2,3,4,5,6,7,8,9,10]
dict_function = { 3 : continue }
for val in example_list:
dict_function[val]()
print(val)
寻找类似以下内容的输出
1
2
4
5
6
7
8
9
10
这可能吗?
答案 0 :(得分:3)
continue
是一种语言结构,而不是一种功能。看一下反汇编的字节代码:
import dis
dis.dis('for _ in range(5): continue')
1 0 SETUP_LOOP 23 (to 26)
3 LOAD_NAME 0 (range)
6 LOAD_CONST 0 (5)
9 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
12 GET_ITER
>> 13 FOR_ITER 9 (to 25)
16 STORE_NAME 1 (_)
19 JUMP_ABSOLUTE 13
22 JUMP_ABSOLUTE 13
>> 25 POP_BLOCK
>> 26 LOAD_CONST 1 (None)
29 RETURN_VALUE
请参阅19 JUMP_ABSOLUTE
?这就是continue
实际翻译成的内容。你不能像正常的功能那样“召唤”它。
尝试这样的事情:
dict_function = { 3 : False }
for val in example_list:
if not dict_function.get(val, True):
continue
使用键的值来决定是否跳过该迭代,然后实际跳过它。
答案 1 :(得分:2)
这可能吗?
没有。 continue
是一个句法结构。一个声明,它无法调用。它只能在循环的上下文中使用。在其他任何地方使用都会产生SyntaxError
。没有任何函数可以复制continue
的行为,因为它需要周围循环的上下文,正如@ coldspeed的答案所示。
可能的解决方法可能是设置标志。如果该标志是某个值,那么您将跳转:
example_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
flags = {3 : True}
for val in example_list:
if flags[val]:
continue
当然,上述解决方案假设您flags
中的所有其他可能值都有example_list
个条目。否则,您将获得KeyError
。
答案 2 :(得分:2)
我想出的最接近你想要的是:
#!/usr/bin/env python3
# From: https://stackoverflow.com/questions/45928441/how-to-call-continue-on-loop-from-within-dictionary-value
class Continue(Exception): pass
def do_continue(): raise Continue
example_list = [1,2,3,4,5,6,7,8,9,10]
dict_function = {3:do_continue}
for val in example_list:
try:
if val in dict_function:
dict_function[val]()
print(val, end=' ')
except Continue: pass
输出:
1 2 4 5 6 7 8 9 10
这是&#39>正在进行的事情: