如何构建函数以处理单个可迭代或两个或多个参数

Gia*_*ear 0 python optimization coding-style function

我有以下功能示例(数字列表的平均值):

def avg(obs):
    return (1. / len(obs)) * np.sum(obs)

avg([1,2,3,4,5])
3.0
Run Code Online (Sandbox Code Playgroud)

我很有兴趣了解如何使用单个可迭代参数和两个或多个参数 max()

max(1,2,3,4,5)
5
max([1,2,3,4,5])
5
Run Code Online (Sandbox Code Playgroud)

Fre*_*Foo 6

首先,除非你有充分的理由,否则你不应该; min并且max这样做是因为它们的二进制形式是如此常见,但是例如sum仅在迭代上运行.

也就是说,以下是诀窍.

from collections import Sized

def avg(*obs):
    if len(obs) == 1 and isinstance(obs[0], Sized):
        obs = obs[0]
    return (1. / len(obs)) * sum(obs)
Run Code Online (Sandbox Code Playgroud)

(Sized是一个抽象的基类,它概括了列表,集合,dicts,元组,NumPy数组和各种其他容器.确保len定义.)