Python函数,其中列表作为参数或多个值作为参数

时间:2018-11-21 16:27:14

标签: python function

我想编写一个Python函数my_sum,该函数以以下方式扩展python内置的sum

  • 如果将序列传递给my_sum,则其行为类似于内置的sum
  • 如果将多个值传递给my_sum,它将返回值的总和。

所需的输出

my_sum([1, 2, 3])  # shall return 6 (similiar to built-in sum)
my_sum(1, 2, 3)    # shall return 6 as well, (sum throws TypeError)

以下是有效的方法。

def my_sum(*x):
    try:
        return sum(x)  # sums multiple values
    except TypeError:
        return sum(*x)  # sums sequence of values

这是实现所需行为的pythonic方法吗?对我来说,代码看起来很奇怪。

2 个答案:

答案 0 :(得分:2)

这是pythonic。我认为至少需要进行一次检查,并且python的哲学是“要求非宽恕”(解释为here),这基本上意味着对于标准控制流,可以使用try-except块。

如果导入已建立的库是pythonic的,并且允许并且愿意这样做,则也可以使用numpy.sum,如下所示:

import numpy as np
def my_sum(*x):
    return np.sum(x)

有了这个定义,两者

my_sum([1, 2, 3])  
my_sum(1, 2, 3) 

返回6

答案 1 :(得分:0)

我认为这不是例外的用例,例外是例外的情况。如果将参数转换为列表并传递给加法器函数,请使用另一个函数。

此外,输入的验证和格式应位于代码的外部,而不是最终函数中。在最佳情况下,应先验证数据,然后再使用此功能,sum函数才能处理已煮熟的数据。

这是一种方法:

  • 保持简单
  • 避免添加条件路径
  • 避免在内部代码中进行防御性编程
  • 从而避免将来出现问题。

我将输入以下代码。

def argsToList(*x):
  return list(x)  

print sum([1,2,3,4])
print sum(argsToList(1,2,3,4))
# both output 10