请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

为什么reduce不接受关键字传参

a = reduce(lambda sum, item: sum + item, lisT, initial=10) 会报错
TypeError: reduce() takes no keyword arguments

正在回答

4回答

我看了下官方文档,文档里给出的reduce签名只是一段伪代码def reduce(function, sequence, initial=None)。这并不是说这里就能传关键字。而且,你不觉得这第三个参数传关键字很多余吗?本身这里就是个可选参数,且有特定 意义。至于说,为什么不能传关键字参数,我觉得只能去找找底层的C实现代码来看看。但我并不认为是因为Cpython的实现所以不能做关键字参数。而且这个问题我觉得,直接搜索也基本找不到答案。因为个人认为这个问题的关注点很偏。所以就只有看源码了。

0 回复 有任何疑惑可以回复我~
  • 提问者 little_forest #1
    好的,谢谢老师,不纠结这个问题了。我继续去刷你的flask课程了
    回复 有任何疑惑可以回复我~ 2019-05-12 11:35:44
7七月 2019-05-11 22:35:10

这个第三个参数是reduce函数的设计,和你自己定义的函数又没有关系,为什么一定要传入一个关键字呢?就好比,我设计一个参数,我不支持关键字,你一定要传入关键字吗?

0 回复 有任何疑惑可以回复我~
  • 提问者 little_forest #1
    reduce的函数式这样的,def reduce(function, sequence, initial=None):  如果你自己定义一个这样的函数是肯定能按照关键字传参的;关键字传参是可以做的不按顺序传参,而是按名字匹配。而且问题点就在这里啊,啥叫设计一个函数不支持关键字,reduce函数这个函数签名上看不出来他不支持关键字啊,所以才有了后来是不是CPython底层的实现问题。
    回复 有任何疑惑可以回复我~ 2019-05-12 08:47:59
7七月 2019-05-11 22:31:46

我能问个问题吗?你为什么一定要在第三个地方加上个关键字参数呢?第三个参数就是初始值,加关键字到底是啥意思呢?

0 回复 有任何疑惑可以回复我~
  • 提问者 little_forest #1
    我又不是非得在第三个参数加关键字,这三个参数你不管加哪个,加多少都不行,这是问题。不是我一定要加。我不加我也能做,java我也从来没加过啊。
    回复 有任何疑惑可以回复我~ 2019-05-12 08:50:02
7七月 2019-05-11 13:16:20

不接收就是不能接收呀。。。。

0 回复 有任何疑惑可以回复我~
  • 提问者 little_forest #1
    如果自己定义一个函数,函数参数除了可以按照顺序传,也是可以指定名字传的,这个默认就是这样。只是这个函数为什么和其他函数不一样,不接受这种形式传参。是什么机制吗?
    回复 有任何疑惑可以回复我~ 2019-05-11 13:56:41
  • 7七月 回复 提问者 little_forest #2
    可你定义的是一个lambda呀。
    回复 有任何疑惑可以回复我~ 2019-05-11 14:56:17
  • 提问者 little_forest 回复 7七月 #3
    你这都没认真看我提的问题呀,算了。
    回复 有任何疑惑可以回复我~ 2019-05-11 16:21:52
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信