a=[1,2,3,4]
def func(x):
return x**x
b=sorted(a,func)
Run Code Online (Sandbox Code Playgroud)
这一行总是给出一个错误->
类型错误:排序预期 1 个参数,得到 2
实际上 sorted 的语法是sorted(iterable,key,reverse),其中key和reverse是可选的,因此根据此,我传递的第二个参数必须与key.
当我定义自己的功能时
def func2(x,y=4,z=10):
print(x,y,z)
func2(100,200)--->output-->>100 200 10
Run Code Online (Sandbox Code Playgroud)
这里 200 自动作为y参数传递给func2. 这是如何运作的?
为什么 python 中的 sorted() 不接受位置参数?
因为sorted在 Python 2 中曾经接受位置参数,但第二个参数是比较函数,而不是现在的关键函数。Python 3 放弃了对比较函数的支持list.sort并sorted进行了相应的修改。默默地改变位置参数的含义被认为太混乱了,因此开发人员决定完全禁止位置参数(除了第一个参数,可迭代排序),并要求为其他所有参数使用关键字参数。
目的是为了sorted(sequence, function)在 Python 3中调用快速失败的未修改 Python 2 代码,而不是尝试将比较函数作为关键函数调用,而是使用不正确数量的参数调用它。如果比较函数碰巧接受可变数量的参数,或者如果序列为空因此排序碰巧对某些输入“起作用”,这可以防止可能发生的混淆。
同样,sorted(sequence, cmp=function)由于cmp已被删除而提前失败。sorted(sequence, key=function)在 Python 2 和 3 中都按预期工作。
除了@user4815162342 的回答,
从文档中,
sorted(iterable, *, key=None, reverse=False)
Run Code Online (Sandbox Code Playgroud)
注意*betweeniterable和key参数。这是用于指定必须将
after 的每个参数指定为关键字 arguments的 python 语法。*
因此,您的自定义函数应定义如下以应用类似的实现:
def func2(x, *, y=4, z=10):
print(x, y, z)
func2(100, 200)
Run Code Online (Sandbox Code Playgroud)
类型错误:func2() 需要 1 个位置参数,但给出了 2 个
| 归档时间: |
|
| 查看次数: |
414 次 |
| 最近记录: |