嵌套函数是Python吗?

2024-04-19 08:02:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用我的R.Pi学习Python,遇到了一个小问题。在我看来,当“inputchecker”函数路由回“getinput”函数时,下面的代码将在内存中保持打开状态。在

这是坏代码吗?应该采取完全不同的做法吗?在

def getinput(i):    
    if i == 1:
        first = input("Would you like A or B? ")
        inputchecker(1, first)
    elif i == 2:
        second = input("Would you like C or D? ")
        inputchecker(2, second)

def inputchecker(n, userinput):    
    def _tryagain_(n):
        usage(n)
        getinput(n)        
    if n == 1:
        if userinput in ("A", "B"):
            print("You chose wisely.")
            getinput(2)
        else:
            _tryagain_(n)
    elif n == 2:
        if userinput in ("C", "D"):
            print("You chose wisely.")
        else:
            _tryagain_(n)

def usage(u):
    if u == 1:
        print("Usage: Just A or B please.") 
    if u == 2:
        print("Usage: Just C or D please.") 


getinput(1)

Tags: or函数代码youinputifdeflike
3条回答

不,嵌套函数中的名称getinput不会创建引用。每次调用_tryagain_时都会查找它,因为它是全局的。这并不重要,因为当Python退出时,一个模块作为一个整体被清除,所以这里没有内存泄漏的真正机会。在

但是,您使用递归来请求用户输入,您的代码很难理解。请使用简单的循环,请参见Asking the user for input until they give a valid response。在

我当然会避免递归调用。另外,我会让验证函数返回一个布尔值,而不是下一个问题的数字。因为你总是按顺序问问题,这似乎只会让你的代码读者觉得复杂。在

另外,我会让validation总是返回一些您永远不知道的东西:第一个参数也可能是错误的:

def getinput():
    valid = False
    while not valid:
        first = input("Would you like A or B? ")
        valid = inputIsValid(1, first)
    valid = False
    while not valid:
        second = input("Would you like C or D? ")
        valid = inputIsValid(2, second)
    return [first, second]

def inputIsValid(n, userinput):    
    valid = False
    if n == 1:
        valid = userinput in ("A", "B")
    elif n == 2:
        valid = userinput in ("C", "D")
    if valid:
        print("You chose wisely.")
    else:
        usage(n)
    return valid

def usage(u):
    if u == 1:
        print("Usage: Just A or B please.") 
    elif u == 2:
        print("Usage: Just C or D please.") 

getinput() 

让两个函数无限地互相调用并不是最好的控制流。最好使用while循环

def getinput(i):
    while i:    
        if i == 1:
            first = input("Would you like A or B? ")
            i = inputchecker(1, first)
        elif i == 2:
            second = input("Would you like C or D? ")
            i = inputchecker(2, second)

def inputchecker(n, userinput):          
    if n == 1:
        if userinput in ("A", "B"):
            print("You chose wisely.")
            return 2
        else:
            getusage(i)
            return i
    elif n == 2:
        if userinput in ("C", "D"):
            print("You chose wisely.")
        else:
            getusage(i)
            return i

如果你把它简化成一个函数可能会更好。没有理由要分开。在

相关问题 更多 >