Python 函数参数是选 list 还是*arg 呢

shinonome · 2024-8-31 12:08:11 · 134 次点击
```python
def list_arg(*test_list:int):
    for i in test_list:
        print(i)

list_arg(*[1,2])

def list_arg(test_list:list[int]):
    for i in test_list:
        print(i)

list_arg([1,2])
```

之前一直是用的 list, 因为本来就是就 list,(不是 list 我就[int]包装一下),所以也没多想,今天看 nonebot 的时候看到有这种用法,想问问大家这俩种大家会怎么选呢, 在参数是

**int|list[int]**

的情况下

```python
def deep_update(
    mapping: dict[K, Any], *updating_mappings: dict[K, Any]
) -> dict[K, Any]:
    """深度更新合并字典"""
    updated_mapping = mapping.copy()
    for updating_mapping in updating_mappings:
        for k, v in updating_mapping.items():
            if (
                k in updated_mapping
                and isinstance(updated_mapping[k], dict)
                and isinstance(v, dict)
            ):
                updated_mapping[k] = deep_update(updated_mapping[k], v)
            else:
                updated_mapping[k] = v
    return updated_mapping
```
举报· 134 次点击
登录 注册 站外分享
11 条回复  
iOCZS 小成 2024-8-31 12:14:51
不应该是 list_arg(1,2)么?
fakepoet 小成 2024-8-31 12:24:12
选 1 ,传入一个 mutable 参数大部分时候都是一个坏的做法。
darcyC 小成 2024-8-31 12:25:12
可变参数用法在做库的时候用的比较多,个人或团队用的话,很多时候倾向于 list ,而不是 * 或 **(除非你有特别的理由)
vituralfuture 小成 2024-8-31 12:35:10
首先是符合语义,其次是如果你有其他参数要传的话,就只能用列表了,不然其他参数只能用关键字传参
NoOneNoBody 小成 2024-8-31 12:52:20
应该习惯参数分开不同的意义,前面的例子分开元素没有意义,所以没必要用*
用*多是
1. 输入有固定顺序,但不太关注名字,例如 from to ,start end 这些,使用者一般不考虑参数名直接输入两个数,且约定俗成一般不会搞错顺序
2. 多个参数,但长度不定,但函数内的计算是针对单个元素的,或者只使用其中某个位置的
如 def select_b(a,b,*args): return b  这样可以传一个*tuple 过去

你这个想法是“批量”,即使只有一个也可扔一组过去,循环一次而已
但建议也是要有单个处理的思想,将来 pandas/numpy 这些使用的向量函数,都是单个处理的,向量化能直接把单个处理的函数应用在一组数据,如果一开始就写成批量处理,反而没有向量化了(不能转为向量函数);向量化在海量数据处理中是很重要的,速度比 for 循环要高很多
但如果不考虑将来在大数据中复用,也可以忽略

PS: 传递单个参数习惯用 tuple ,因为 tuple 是 hashable ,而 list 是 unhashable ,将来遇到多进程调用某个函数(这个函数最初设计没有考虑到用在多进程),就可能出现不能 pickle 无法继续的情况
Sawyerhou 小成 2024-8-31 12:52:30
轻易不用 list ,一般情况下可变对象不可作为参数。
CaptainD 小成 2024-8-31 12:59:29
@Sawyerhou #7 是不作为参数默认值吧
ClericPy 小成 2024-8-31 21:54:23

Python 函数参数是选 list 还是*arg 呢

具体情况具体分析吧

稍微大点的协同开发项目,共享几个入参和结果的 typeddict / dataclass
iorilu 小成 2024-9-1 10:31:51

Python 函数参数是选 list 还是*arg 呢

这两个不是一回事阿, 有什么疑问

难道 lz 认为是一样得吗

test_list:list[int]
一个是确定是个集合, 空集合也是集合


*test_list:int
一个一般至少有一个参数, 可能多个参数
12下一页
返回顶部