[随机字符串生成器]在 else 条件下陷入循环

[Random String Generator]Getting stuck in a loop on else condition

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

# 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 但仅适用于numbers 并且我没有设法重新运行 userWelcome()

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

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

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

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

感谢您的时间和精力!

代码递归调用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
  

如果您想调用函数而不是在内部循环,您可以改为使函数 return 成功 (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

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