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

代码评审:Python任意参数列表该用法是否合理?代码是否有缺陷?

find_smallest_int函数实现问题解答

现有代码为什么能通过当前测试

你现在写的函数用*arr接收参数,也就是你接触到的任意参数列表特性,它会把所有传入的位置参数打包成一个元组(tuple)。你所有测试用例都只传了1个列表参数,所以循环第一次取到的i就是传入的目标列表,把元素拼接到z之后排序取首位,自然能得到正确结果。

现存的问题

1. 鲁棒性不足

如果调用时传入非可迭代的单个数字,比如find_smallest_int(34, 12, 5),执行z += i时会直接抛出TypeError——整数不是可迭代对象,没法往列表里拼接,不符合可变参数列表的预期使用场景。
如果传入字符串这类可迭代但非数字序列的参数,还会把字符串拆成单个字符参与排序,返回完全不符合预期的结果。

2. 效率极低

你把z.sort()放在了循环内部,每拼接一次元素就对整个列表做一次全量排序。Python内置的sort时间复杂度是O(n log n),如果传入k个可迭代参数,总时间复杂度会飙升到O(kn log n),数据量稍微大一点性能就会非常差。哪怕只传一个列表,排序找最小值的效率也远低于直接遍历找最小值,更不如内置的min()函数——底层是C实现的O(n)遍历,比纯Python写的排序快得多。

3. 冗余不规范

Python不需要用分号结尾语句,你写的z = [];不符合PEP8编码规范,属于没必要的写法。另外你提到的参数解包操作在这段代码里根本不存在:*arr做的是参数打包,把多个传入参数装进元组,和解包是反向操作。

优化方案

  • 如果题目明确要求传入参数是单个数字列表,完全没必要用可变参数,直接写就行,性能拉满:
def find_smallest_int(arr):
    return min(arr)
  • 如果你确实要做支持多参数、支持传入数字/数字列表的通用最小值查找函数,可以用下面的写法,时间复杂度稳定O(n),也能兼容不同的传参方式:
def find_smallest_int(*arr):
    min_result = float('inf')
    for item in arr:
        # 处理可迭代的数字序列,排除字符串避免拆成字符
        if hasattr(item, '__iter__') and not isinstance(item, str):
            current_min = min(item)
        else:
            current_min = item
        if current_min < min_result:
            min_result = current_min
    return min_result

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:57:24