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

来源:12-5 reduce

little_forest

2019-05-11

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

写回答

4回答

7七月

2019-05-12

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

0
1
little_forest
好的,谢谢老师,不纠结这个问题了。我继续去刷你的flask课程了
2019-05-12
共1条回复

7七月

2019-05-11

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

0
1
little_forest
reduce的函数式这样的,def reduce(function, sequence, initial=None): 如果你自己定义一个这样的函数是肯定能按照关键字传参的;关键字传参是可以做的不按顺序传参,而是按名字匹配。而且问题点就在这里啊,啥叫设计一个函数不支持关键字,reduce函数这个函数签名上看不出来他不支持关键字啊,所以才有了后来是不是CPython底层的实现问题。
2019-05-12
共1条回复

7七月

2019-05-11

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

0
1
little_forest
我又不是非得在第三个参数加关键字,这三个参数你不管加哪个,加多少都不行,这是问题。不是我一定要加。我不加我也能做,java我也从来没加过啊。
2019-05-12
共1条回复

7七月

2019-05-11

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

0
4
little_forest
回复
7七月
网上说是因为这些函数都是CPython实现的本地函数,虽然查看函数体的时候参数是有名字的,其实实际实现是没名字的。我不太确定这个说法对不对。 An implementation may provide built-in functions whose positional parameters do not have names, even if they are ‘named’ for the purpose of documentation, and which therefore cannot be supplied by keyword. In CPython, this is the case for functions implemented in C that use PyArg_ParseTuple() to parse their arguments.
2019-05-11
共4条回复

Python3.8系统入门+进阶 (程序员必备第二语言)

语法精讲/配套练习+思考题/原生爬虫实战

14293 学习 · 4429 问题

查看课程