You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:32:31