如何从字典值中调用continue循环

时间:2017-08-28 22:59:17

标签: python python-3.x loops

这更像是一个好奇心问题。有兴趣知道我们是否可以从字典值调用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

这可能吗?

3 个答案:

答案 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>正在进行的事情:

  1. 我们定义一个Continue异常,其唯一目的是在循环结束时捕获。
  2. 我们创建一个do_continue()函数,其唯一目的是抛出所述异常。
  3. 我们使用(3,do_continue)键值对填充dict_function。
  4. 我们将主循环的主体包装在try / catch块中,如果捕获到Continue异常则不执行任何操作。
  5. 在try块中,我们检查以确保dict_function中存在val,如果存在,则执行它。