【问题标题】:Python: What is Wrong with these two Functions?Python:这两个函数有什么问题?
【发布时间】:2013-04-03 14:04:59
【问题描述】:

我在编写的程序中遇到了一个问题。我已将问题缩小到这两个功能。当您调用函数 enterPasswords,输入无效数据(例如“a”),然后通过输入有效数据(例如“hello”)退出 passwordLength 函数时,就会出现问题。我在那里留下了一些打印语句来帮助您查看问题。我试过添加退货,但同样的问题仍然存在。

任何建议将不胜感激。如果你能告诉我为什么会出现问题,我相信我可以自己解决。谢谢。

    def passwordLength(password):
        if (len(password) < 4) or (len(password) > 15):
            print("Error from server: Your password must be at least four and at most fifteen characters long.")
            enterPasswords()


    def enterPasswords():
        password = input("Input password: ")
        passwordLength(password)
        print(password)
        password2 = input("Re-enter password: ")
        print(password, password2)


    enterPasswords()

这是我的问题的图像(我想知道的是,为什么程序没有在我突出显示的地方结束,为什么会继续,为什么在结尾处打印“a” ?):

http://i.imgur.com/LEXQFTO.png

【问题讨论】:

  • 我无法重现您的问题。您可以发布一个示例对话框,以便我们了解它是如何出错的吗?你有一些奇怪的逻辑(例如我可以输入一个无效的密码,然后是一个有效的密码,然后确认无效的密码)但程序确实运行了。
  • 我已经用问题的描述和图片编辑了我的帖子。顺便感谢您的回复。

标签: python function python-3.x call


【解决方案1】:

如果用户一开始输入的密码无效,它会重复enterPasswords - 但是,如果用户成功完成此操作,它会回到最初的enterPasswords。相反,尝试

def passwordLength(password):
    if (len(password) < 4) or (len(password) > 15):
        print("Error from server: Your password must be at least four and at most fifteen characters long.")
        return False
    return True


def enterPasswords():
    password = input("Input password: ")
    while not passwordLength(password):
        password = input("Input password: ")

    print(password)
    password2 = input("Re-enter password: ")
    print(password, password2)

这将继续要求用户重新输入第一个密码,直到它有效,然后才会要求用户确认。

【讨论】:

  • 感谢您的反馈,我过去曾尝试以您的方式实施我的程序。我只是想知道为什么我的方法没有按照我想要的方式工作。
  • @user2240694 正如我在帖子中提到的那样,并且正如您发布的图片所示,您的问题来自您从passwordLength 调用enterPasswords 函数这一事实。 enterPasswords 要求输入密码两次 - 但是,如果它无效,它会转到 passwordLength,它会启动另一个 enterPasswords 会话。这会导致多次提示重新进入。所以你可以 1. 做类似于我所做的事情,使 passwordLength 成为一个完全独立的函数,消除代码的循环性质 2. 如果使用 passwordLength,则从 enterPasswords 中断
  • 哦,我明白了,所以由于输入无效数据时 enterPasswords 函数没有完成执行,所以当输入有效数据时程序总是会回到它停止的地方。我现在明白这个问题了,谢谢!
【解决方案2】:

passwordLength() 中的密码变量与enterPasswords() 中的变量完全无关。行为也可能与您预期的不同。试试这样的:

def passwordLength(pw):
    return 4 <= len(pw) <=15

def getPw():
    return input("Enter password: ")

def enterPasswords():
    pw = getPw()
    while not passwordLength(pw):
        print("Incorrect password length.")
        pw = getPw()

    # ...

【讨论】:

    【解决方案3】:

    您的函数以一种糟糕的方式相互调用。如果您尝试逐行遵循您的算法(使用您提到的“a”和“hello”的情况),您可能会看到问题。

    这是一个解决方案:

    def passwordLength(password):
        if (len(password) < 4) or (len(password) > 15):
            print("Error from server: Your password must be at least four and at most fifteen characters long.")
            return False
        else : return True    
    
    
    def enterPasswords(): 
        passwordOK = False
        while not passwordOK :
            password = input("Input password: ")
            passwordOK = passwordLength(password)
        print(password)
        password2 = input("Re-enter password: ")
        print(password, password2)
    
    enterPasswords()
    

    【讨论】:

      猜你喜欢
      • 2017-03-26
      • 1970-01-01
      • 2013-09-22
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 2011-02-13
      • 2011-04-24
      相关资源
      最近更新 更多