2017-08-28 51 views
0

這更多的是好奇心的問題。有興趣知道,如果我們可以從字典值以跳過迭代如何從字典值中調用繼續循環

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) 

調用諸如continue功能尋找類似下面將要輸出

1 
2 
4 
5 
6 
7 
8 
9 
10 

這可能嗎?

+0

'continue'不是一個函數,它是一個聲明。 –

+0

編號'continue'是一個聲明。它只能在循環的上下文中使用。 –

+0

是的,我知道 - 我想知道是否有一個功能可以做什麼繼續 – user3166881

回答

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 

使用鍵的值來決定是否跳過迭代與否,然後居然跳過它。

+0

雖然正在尋找一些更復雜的東西 - 我認爲其他人尋找一個快速實施會很高興與這種反應 - 謝謝你 – user3166881

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 

當然,上述方案假定你有example_list所有其他可能的值flags條目。否則,你會得到一個KeyError

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 

這裏的是怎麼回事:

  1. 我們定義了一個繼續例外,其唯一目的是在循環結束時被捕獲。
  2. 我們創建了一個do_continue()函數,其唯一目的是拋出異常。
  3. 我們用(3,do_continue)鍵,值對填充dict_function。
  4. 我們將主循環的主體封裝在try/catch塊中,如果發現Continue異常,則不執行任何操作。
  5. 在try塊中,我們檢查確認val是否存在於dict_function中,如果存在,執行它。