Python控制结构习题求助:修正收银台输入识别函数逻辑错误
问题修正:收银台输入识别函数错误修复
问题说明
这是一道控制结构相关的编程题,现有代码存在逻辑错误:当输入包含连续小数点(如......)时,错误返回Transaction,但根据规则这类输入应被判定为密码,返回Password。
习题规则
编写interpretCashier函数,接收字符串输入,按以下规则返回结果:
- 输入仅含数字 → 返回
PIN - 输入是合法十进制数 → 返回
Transaction - 其余情况 → 返回
Password
错误代码
symbols = ["£", "$", "%", "&", "A", "a", "b", "z", "!", "@", ".."] def interpretCashier(input): for i in input: if i ==".": return "Transaction" elif input.isdigit(): return "PIN" if i in symbols: return "Password" print(interpretCashier("24.59")) print(interpretCashier("123456")) print(interpretCashier("my$......$$w0rd"))
错误分析
- 逻辑顺序颠倒:把小数点判断放在最前面,只要遇到单个
.就直接返回Transaction,完全忽略了十进制数的合法性要求(只能有一个小数点,且前后为数字)。 - 无效匹配:
symbols列表里的".."是无效的,因为循环遍历的是单个字符,永远不会匹配到这个双字符元素。 - PIN判断位置错误:
input.isdigit()放在循环的分支里,导致只有在遍历到某个字符时才会检查,实际上应该优先判断全数字的情况。
修正方案
方案1:分步逻辑验证(不依赖正则)
def interpretCashier(input_str): # 优先判断PIN:全为数字 if input_str.isdigit(): return "PIN" # 统计小数点数量 dot_count = input_str.count('.') # 合法十进制数只能有一个小数点 if dot_count == 1: integer_part, decimal_part = input_str.split('.', 1) # 确保分割后的两部分至少有一个是数字,且无其他非法字符 if (integer_part.isdigit() or decimal_part.isdigit()) and (integer_part.isdigit() or not integer_part) and (decimal_part.isdigit() or not decimal_part): # 排除纯小数点的情况 if input_str != ".": return "Transaction" # 所有不符合前两种情况的都归为密码 return "Password" # 测试用例 print(interpretCashier("24.59")) # 输出 Transaction print(interpretCashier("123456")) # 输出 PIN print(interpretCashier("my$......$$w0rd")) # 输出 Password print(interpretCashier("......")) # 输出 Password print(interpretCashier(".123")) # 输出 Transaction print(interpretCashier("123.")) # 输出 Transaction print(interpretCashier("12..34")) # 输出 Password
方案2:正则表达式(更简洁精准)
如果允许使用正则,可以用一行匹配合法十进制数:
import re def interpretCashier(input_str): if input_str.isdigit(): return "PIN" # 正则匹配:可选整数部分+小数点+可选小数部分,或小数点+小数部分,确保无其他字符 if re.fullmatch(r'^\d+\.?\d*$|^\.\d+$', input_str): return "Transaction" return "Password" # 测试用例同上
核心逻辑说明
- PIN优先级最高:先检查输入是否全为数字,避免后续逻辑干扰。
- 十进制数严格校验:仅允许一个小数点,且小数点前后至少有一部分是数字,排除连续小数点、带符号的点等非法情况。
- 兜底处理:所有不满足前两种条件的输入,一律判定为密码。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

