Python密码生成器输入验证优化:避免无效输入后从头询问
密码生成器输入交互逻辑优化
我用while循环搭配try-except块实现了密码生成器的输入交互,用来询问用户是否包含字母、数字和特殊字符。当前验证逻辑在用户输入非'y'或'n'时会触发错误提示,但错误后代码会回到开头重新询问字母选项。我希望优化逻辑,使无效输入后仅重新询问当前项,而非从头开始执行。
原代码
# Prompt user for whether to include letters, numbers and special characters while True: try: include_letters = input("Include letters? (y/n): ").lower() if include_letters not in ('y', 'n'): raise ValueError("Invalid input. Enter 'y' or 'n'") include_letters = include_letters == 'y' include_numbers = input("Include numbers? (y/n): ").lower() if include_numbers not in ('y', 'n'): raise ValueError("Invalid input. Enter 'y' or 'n'") include_numbers = include_numbers == 'y' include_special_chars = input("Include special characters? (y/n): ").lower() if include_special_chars not in ('y', 'n'): raise ValueError("Invalid input. Enter 'y' or 'n'") include_special_chars = include_special_chars == 'y' if not (include_letters or include_numbers or include_special_chars): raise ValueError("You must select at least one of letters, numbers or special characters to continue.") break except ValueError as error: print(error)
问题复现示例
Include letters? (y/n): y Include numbers? (y/n): y Include special characters? (y/n): g Invalid input. Enter 'y' or 'n' Include letters? (y/n): y Include numbers? (y/n): k Invalid input. Enter 'y' or 'n' Include letters? (y/n):
优化方案
核心思路是把每个输入项的验证逻辑拆成独立的循环,让每个选项单独处理输入错误,不会影响已经完成的输入步骤。优化后的代码如下:
# 询问用户是否包含字母、数字和特殊字符 while True: # 单独循环验证字母选项 while True: include_letters = input("Include letters? (y/n): ").lower() if include_letters in ('y', 'n'): include_letters = include_letters == 'y' break print("Invalid input. Enter 'y' or 'n'") # 单独循环验证数字选项 while True: include_numbers = input("Include numbers? (y/n): ").lower() if include_numbers in ('y', 'n'): include_numbers = include_numbers == 'y' break print("Invalid input. Enter 'y' or 'n'") # 单独循环验证特殊字符选项 while True: include_special_chars = input("Include special characters? (y/n): ").lower() if include_special_chars in ('y', 'n'): include_special_chars = include_special_chars == 'y' break print("Invalid input. Enter 'y' or 'n'") # 检查是否至少选择了一项,符合要求则退出循环 if include_letters or include_numbers or include_special_chars: break print("You must select at least one of letters, numbers or special characters to continue.")
优化说明
- 每个输入项都用独立的
while循环包裹,当用户输入无效时,只会在当前选项反复询问,直到输入'y'或'n'才会进入下一个选项 - 最后统一检查是否至少选择了一种字符类型,如果未选择任何类型,才会重新开始整个流程,保证业务逻辑的完整性
内容的提问来源于stack exchange,提问作者veteranblanco
相关产品推荐
相关产品推荐

