为了账号安全,请及时绑定邮箱和手机立即绑定

以列表为参数或多个值作为参数的 Python 函数

以列表为参数或多个值作为参数的 Python 函数

米脂 2021-08-24 17:07:36
我想编写一个python函数my_sum,sum以如下方式扩展python的内置函数:如果一个序列被传递给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 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

它是蟒蛇式的。我认为至少需要进行一项检查,并且 python 的理念是“请求宽恕而不是许可”(在此处解释),这基本上意味着对于标准控制流使用 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。


查看完整回答
反对 回复 2021-08-24
?
慕村225694

TA贡献1880条经验 获得超4个赞

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

此外,输入的验证和格式化应该在代码的外部,而不是在最终的函数中。在最好的情况下,数据应该在进入这个函数之前进行验证,并且你应该只有sum处理熟数据的函数。

这是一种方法:

  • 保持简单

  • 避免添加条件路径

  • 避免在内部代码中进行防御性编程

  • 从而避免未来的问题。

我会有以下代码。

def argsToList(*x):

  return list(x)  


print sum([1,2,3,4])

print sum(argsToList(1,2,3,4))

# both output 10


查看完整回答
反对 回复 2021-08-24
  • 2 回答
  • 0 关注
  • 285 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号