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

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"))

错误分析

  1. 逻辑顺序颠倒:把小数点判断放在最前面,只要遇到单个.就直接返回Transaction,完全忽略了十进制数的合法性要求(只能有一个小数点,且前后为数字)。
  2. 无效匹配:symbols列表里的".."是无效的,因为循环遍历的是单个字符,永远不会匹配到这个双字符元素。
  3. 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"

# 测试用例同上

核心逻辑说明

  1. PIN优先级最高:先检查输入是否全为数字,避免后续逻辑干扰。
  2. 十进制数严格校验:仅允许一个小数点,且小数点前后至少有一部分是数字,排除连续小数点、带符号的点等非法情况。
  3. 兜底处理:所有不满足前两种条件的输入,一律判定为密码。

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:17:53