【问题标题】:how to build a function in order to process single iterable or two or more argument如何构建函数以处理单个可迭代或两个或多个参数
【发布时间】:2013-02-24 23:29:18
【问题描述】:

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

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

avg([1,2,3,4,5])
3.0

我很有趣,不知道如何使用单个可迭代参数和两个或多个参数,如 max() 中的那样

max(1,2,3,4,5)
5
max([1,2,3,4,5])
5

【问题讨论】:

  • 为什么要这样做?通常最好只定义一个一致的 API 并要求调用者以您想要的形式传入参数。这将使您的代码更易于维护。
  • 谢谢 BrenBarn 我同意你的观点,为了理解编程,这是我个人的好奇心。

标签: python function optimization coding-style


【解决方案1】:

首先,除非你有充分的理由,否则你不应该这样做; minmax 这样做是因为它们的二进制形式很常见,但是例如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)

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

【讨论】:

  • 我似乎无法理解为什么会这样。 if 检查和 obs 分配做什么,不应该检查 isinstance(obs[0], Sequence),obs 不总是一个序列,因为它使用了 asterix 的东西吗?
  • @MarkusMeskanen:检查是否只有一个类型正确的参数,然后重新分配obs进行后续计算。
  • 是的,但 obs 不总是一个参数列表吗?
  • 很高兴知道我并不愚蠢,我认为这应该是投票的原因,但不明白为什么。现在说得通了
  • 您为什么使用Sized 而不是SequenceIterable?理论上,对象可以调整大小但不可迭代(因此sum 会失败)。更一般地说,检查可迭代性然后进行迭代可能会更好。
猜你喜欢
  • 1970-01-01
  • 2021-11-16
  • 2018-04-20
  • 2018-03-29
  • 2019-05-11
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多