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

Python:如何让求最大值索引函数正确抛出自定义TypeError异常

问题分析与修复方案

原代码存在两个关键问题:

  1. 提前调用max()导致异常提前触发:在检查元素类型前就执行max(values),当列表包含字符串等非数值类型时,max会先抛出原生的"不支持比较"TypeError,根本走不到自定义异常的逻辑。
  2. 类型检查对象错误:代码里判断的是循环索引i的类型,而非列表中的元素values[i],完全起不到检查元素类型的作用。

修复后的代码

def maxvalue(values):
    """
    Function that receives a list/array and returns the index of the maximum
    value in that sequence
    """    
    # 先遍历检查所有元素是否为数值类型
    for val in values:
        if not isinstance(val, (int, float)):
            raise TypeError("Only numerical values are allowed")
    
    indices = []
    max_value = max(values)
    # 用enumerate同时获取索引和元素,写法更简洁
    for idx, val in enumerate(values):
        if val == max_value:
            indices.append(idx)
    return indices

# 测试示例
# 含非数值类型的情况,会抛出自定义异常
# maxvalue([1, 1, 1.5, "e", 235.8, 9, 220, 220])
# 全数值类型的情况,返回最大值的所有索引
# print(maxvalue([1, 1, 1.5, 235.8, 9, 220, 220]))  # 输出 [4, 6, 7]

关键修改说明

  • 提前做类型校验:把元素类型检查放在max()调用之前,确保只有全数值类型的列表才会进入最大值计算逻辑,遇到非数值类型直接抛出自定义异常。
  • 正确的类型检查方式:使用isinstance(val, (int, float))判断元素类型,相比直接判断type(val),它能兼容继承自int/float的子类(如果存在),逻辑更健壮。
  • 更简洁的遍历方式:用enumerate遍历列表,同时拿到索引和元素,避免手动通过range(len(values))索引取值的繁琐写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:50:17