[随机字符串生成器]在 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
避免使用全局变量,这是一种不好的做法。通过参数传递值,如上面的代码。
所以(您可能会从我的代码中看到)我是 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
避免使用全局变量,这是一种不好的做法。通过参数传递值,如上面的代码。