2016-09-30 69 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