2016-11-22 141 views
4

我在我的R.Pi上学习Python,并且遇到了一个小障碍。在我看来,下面的代码会将“inputchecker”功能保留在内存中,并返回到“getinput”功能。嵌套函数Pythonic?

这是错的代码?它应该完全不同吗?

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) 
+0

这不完全是Python的,因为这会导致if语句与不可预见的真正问题,这不是只蟒蛇限制。所有语言都支持这种“黑客”。最好使用while循环,除非您经常使用while循环将其放入函数中。 – ProgramFast

回答

2

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

但是,您正在使用递归来要求用户输入,并且您的代码很难遵循。改用一个简单的循环,参见Asking the user for input until they give a valid response

+0

伟大的反馈谢谢你。现在我有更多的方向欢呼。 – Benjo

1

有两个函数无限地相互呼叫并不是最好的控制流。这将是一个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 

它可能甚至会更好,如果你简化成一个单一的功能更好。没有理由需要分割。

0

我肯定会避免递归调用。另外,我会让验证函数返回一个布尔值,而不是下一个问题的编号。既然你依次问问题,这似乎只会让你的代码读者复杂化。

而且我先给验证总是回报的东西 - 你永远不知道:第一个参数可能是错的,以及:

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() 
-1

要回答你的“Python化”问题:虽然蟒蛇可以做函数式编程,它是not designed。语法有点难懂,语言缺少一些features。其中一些缺失的特征意味着递归是slow

所以,我会坚持到imperitave编程是“Python的”

+0

这与函数式编程有什么关系?代码*是必要的。这里没有尾递归。并非所有的递归代码都是功能代码。 –