0

所以(你可能会从我的代码中看到)我是 Python(3.8.3 版)的初学者,到目前为止我非常喜欢它,并且我在几个不同的初学者项目中挑战了自己。我目前正在制作一个随机字符串生成器(即密码生成器,因此使用了秘密模块)。

# Password Generator
import secrets, string

print("Welcome to the generator. Please specify your requirements")
print("A. All Characters;\nB. No Numbers;\nC. No Punctuation\nPlease choose the appropriate letter for your needs.")
userInput = input()
def userWelcome():

  if userInput.lower() == "a":
      generatePass = string.ascii_letters + string.digits + string.punctuation
      print("How long do you want your string to be?")
      stringRange = int(input())
      print( "".join(secrets.choice(generatePass) for _ in range(stringRange)) )


  elif userInput.lower() == "b":
      generatePass = string.ascii_letters + string.punctuation
      print("How long do you want your string to be?")
      stringRange = int(input())
      print("".join(secrets.choice(generatePass) for _ in range(stringRange)))


  elif userInput.lower() == "c":
      generatePass = string.ascii_letters + string.digits
      print("How long do you want your string to be?")
      stringRange = int(input())
      print("".join(secrets.choice(generatePass) for _ in range(stringRange)))


  else:
      print("Not an option! Let's try again.")
      userWelcome()

userWelcome()

但是,我的问题是如果用户输入了不正确的选项该怎么办。如您所见,我假设他们填写的 else 语句与之前的任何选项都不匹配 - 所以我想再次尝试重新运行生成器(所以我尝试在 else 语句中再次调用 userWelcome)。

但是,当我输入例如 12 作为输入时,我的 shell 开始输出我的字符串(不是一个选项让我们再试一次),就像它卡在一个循环中一样一千次。我想知道我到底做错了什么。

我试过的:

(1) 所以我首先尝试使用try 和 except来解决这个输入问题,当出现 ValueError 但仅适用于数字时运行 except 并且我没有设法重新运行 userWelcome()

(2) 我试图创建一个elif 语句,在该语句中检查整数的输入,但是它也陷入了循环。代码:

elif userInput.isalpha() == False:
    print("Not an option! Let's try again.")
    userWelcome()

无论如何,我希望这能很好地解释它。我已经忙了几个小时了,我想我会问这个。也许这是一个非常愚蠢的问题,但对我来说很难:)

TL;DR:想通过再次运行我的函数来检查正确的用户输入,陷入奇怪的循环

感谢您的时间和精力!

4

1 回答 1

0

代码userWelcome()递归调用,不改变全局变量userInput。再次处理相同的错误字符串,导致相同的结果,再次调用userWelcome()- 永远(至少直到最大调用深度)。

您应该在 的开头读取一个新字符串userWelcome,而不是使用全局变量。此外,这里的递归是一种过度杀伤力,会让您感到困惑。最好使用一个简单的 while 循环:

while True:
  userInput = ....
  if ....
     do something
     return
  elif ...
     do something else
     return  # exit the function - breaking out of the loop
  else:
     print(error message)
     # No return here, means the loop will continue to loop
  

如果要调用函数而不是在内部循环,则可以使函数返回成功(True)与失败(False),并在调用者中循环:

while not userWelcome(inputString):
    inputString = read the string

def userWelcome(inputString):
   if inputString == ....:
      something
      return True # To mark OK
   elif inputString == .....:
      something else
      return True # To mark OK
   else:
      print an error
      return False # To mark failure

只是避免使用全局变量,这是一种不好的做法。通过参数传递值,如上面的代码所示。

于 2020-07-12T15:49:38.183 回答