Python字典结合while循环实现多轮ID匹配的问题排查
Python ID匹配程序:循环版本的识别问题修复
问题说明
需要实现以下功能的Python程序:
- 接收用户输入的ID(对应字典中的value)
- 匹配成功后返回对应的用户名(字典的key)
- 最多支持3次输入尝试
修改为while循环版本后出现异常:首次输入错误时,后续输入正确ID也会被判定错误,直至耗尽所有尝试次数。
初始单轮代码
def get_name(entry): customer_id = {'Fayyad':2314, 'Faysal':9031} for key, value in customer_id.items(): if entry == value: return f"Welcome {key}!" return "Sorry, the ID entered is wrong. Try again." res = get_name(int(input("Enter your ID: "))) print(res)
错误的循环版本代码
def get_name(entry): customer_id = {'Fayyad':2314, 'Faysal':9031} entry_limit = 3 entry_count = 0 while entry_count < entry_limit: for key, value in customer_id.items(): if entry == value: return f"Welcome {key}!" else: int(input("Sorry wrong ID. Please reenter your 4-digit ID number: ")) entry_count += 1 return "Sorry, you've exceeded your trial limit. Your card will be retained." res = get_name(int(input("Enter your 4-digit ID number: "))) print(res)
错误输出示例
Enter your 4-digit ID number: 2115 Sorry wrong ID. Please reenter your 4-digit ID number: 2314 Sorry wrong ID. Please reenter your 4-digit ID number: 9031 Sorry wrong ID. Please reenter your 4-digit ID number: 2456 Sorry, you've exceeded your trial limit. Your card will be retained.
问题根源
- entry值未更新:函数接收的
entry参数仅为首次输入的值,后续循环中重新输入的ID没有赋值给entry,导致每次循环都在判断最初的错误ID。 - for循环逻辑缺陷:原函数的for循环在第一次不匹配时就直接返回错误,不会检查字典中的其他键值对。
修复后的代码
def get_name(): customer_id = {'Fayyad':2314, 'Faysal':9031} entry_limit = 3 entry_count = 0 while entry_count < entry_limit: # 每次循环重新获取用户输入 try: entry = int(input("Enter your 4-digit ID number: ")) except ValueError: print("Please enter a valid 4-digit number.") entry_count += 1 continue # 遍历所有键值对检查匹配 matched = False for key, value in customer_id.items(): if entry == value: print(f"Welcome {key}!") return # 遍历完无匹配才提示错误 print("Sorry wrong ID. Please try again.") entry_count += 1 print("Sorry, you've exceeded your trial limit. Your card will be retained.") # 直接调用函数 get_name()
修复说明
- 将输入逻辑移到函数内部的循环中,确保每次尝试都能获取新的ID并更新判断值。
- 修正for循环逻辑:遍历所有键值对后再判定是否匹配失败,避免提前返回错误。
- 添加异常处理,防止用户输入非数字导致程序崩溃。
- 调整函数结构,无需传入初始entry参数,逻辑更简洁清晰。
内容的提问来源于stack exchange,提问作者Frei
相关产品推荐
相关产品推荐

