2016-09-30 67 views
0

我有以下情形:Python函數使用字典存儲他們的名字遞歸調用對方

  • 有多個功能各接受某些參數
  • 他們稱之爲基於參數相互遞歸/迭代,直到某些條件可以從參數被推斷出來
  • 我可以在這些函數中做if-elif,但是因爲這會在所有這些函數中引起很多if-elif,所以我認爲我應該使用字典存儲對這些函數的引用作爲關鍵字然後哈sh到這個字典中(使用參數內容)來獲取並調用要調用的函數。

問題是,我無法決定在所有函數(所有函數將使用此字典)之前或在所有函數(因爲字典將使用所有這些函數)之前定義該字典的位置。

下面我試圖模擬場景。我使用隨機函數來決定調用哪個函數,而不是從參數中推斷它。我也用recurCount來決定何時停止遞歸調用。

import random 

# funcDict = {"fun1": fun1, 
#    "fun2": fun2, 
#    "fun3": fun3, 
#    "fun4": fun4} 

#Traceback (most recent call last): 
# File "C:\...\temp.py", line 107, in <module> 
# funcDict = {"fun1": fun1, 
#NameError: name 'fun1' is not defined 

funcList = ["fun1","fun2","fun3","fun4"] 
recurCount = 5 

def fun1(): 
    global recurCount 
    print("fun1") 
    if(recurCount == 0): 
     return 
    else: 
     recurCount= recurCount-1 
     funcDict[random.choice(funcList)]() #recursive call 

def fun2(): 
    global recurCount 
    print("fun2") 
    if(recurCount == 0): 
     return 
    else: 
     recurCount= recurCount-1 
     funcDict[random.choice(funcList)]() #recursive call 

def fun3(): 
    global recurCount 
    print("fun3") 
    if(recurCount == 0): 
     return 
    else: 
     recurCount= recurCount-1 
     funcDict[random.choice(funcList)]() #recursive call 

def fun4(): 
    global recurCount 
    print("fun4") 
    if(recurCount == 0): 
     return 
    else: 
     recurCount= recurCount-1 
     funcDict[random.choice(funcList)]() #recursive call 

fun1() 

# funcDict = {"fun1": fun1, 
#    "fun2": fun2, 
#    "fun3": fun3, 
#    "fun4": fun4} 

#Traceback (most recent call last): 
# File "C:\...\temp.py", line 152, in <module> 
# fun1() 
# File "C:\...\temp.py", line 123, in fun1 
# funcDict[random.choice(funcList)]() 
#NameError: name 'funcDict' is not defined 
+0

你有沒有打過電話'FUN1()之前定義''funcDict'(但你定義了所有的函數之後)? – Julien

+0

'funcDict'沒有被定義,因爲它被評論。此外,您可以將'funcDict [random.choice(funcList)]()'改爲'funcDict [random.choice(funcDict.keys())]()'到函數之後並在'fun1'調用 – ShabashP

+0

之前定義。避免重複的函數名稱列表。 –

回答

0

該字典要求函數已經定義,而第一次調用任何函數都要求字典已經定義。因此,你應該定義詞典所有的函數定義和之前進行第一次調用任何的功能:

def fun1(): 
    ... 

def fun2(): 
    ... 

def fun3(): 
    ... 

def fun4(): 
    ... 

funcDict = {"fun1": fun1, 
      "fun2": fun2, 
      "fun3": fun3, 
      "fun4": fun4} 

fun1() 
+0

是的,這...它是如此簡單...但有時候很容易愚蠢根本不打你的頭...... – Mahesha999