簡體   English   中英

Python函數使用存儲其名稱的字典遞歸調用彼此

[英]Python functions recursively calling each other using dictionary storing their name

我有以下情況:

  • 有多個函數都接受某些參數
  • 它們基於遞歸/迭代地基於參數互相調用,直到滿足可以從參數推斷出的特定條件為止
  • 我可以在這些函數中執行if-elif ,但是由於這會在所有這些函數中引起大量的if-elif ,因此我認為我應該使用字典將對這些函數的引用作為它們的名稱存儲為鍵,然后將其哈希到該字典中(使用參數內容)獲取並調用要調用的函數。

問題在於,在所有功能之前(因為所有功能將使用此字典)或在所有功能之后(由於字典將使用所有這些功能),我無法決定在哪里定義該詞典。

下面我嘗試模仿這種情況。 我使用隨機函數來確定要調用哪個函數,而不是從參數中推斷出來。 我也使用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

字典要求已經定義了函數,而對任何一個函數的第一次調用都要求已經定義了字典。 因此,您應該所有函數定義之后和首次調用任何函數之前定義字典:

def fun1():
    ...

def fun2():
    ...

def fun3():
    ...

def fun4():
    ...

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

fun1()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM