为什么 python 中的 sorted() 不接受位置参数?

Nir*_*arg 7 python sorting

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),其中keyreverse是可选的,因此根据此,我传递的第二个参数必须与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. 这是如何运作的?

use*_*342 8

为什么 python 中的 sorted() 不接受位置参数?

因为sorted在 Python 2 中曾经接受位置参数,但第二个参数是比较函数,而不是现在的关键函数。Python 3 放弃了对比较函数的支持list.sortsorted进行了相应的修改。默默地改变位置参数的含义被认为太混乱了,因此开发人员决定完全禁止位置参数(除了第一个参数,可迭代排序),并要求为其他所有参数使用关键字参数。

目的是为了sorted(sequence, function)在 Python 3中调用快速失败的未修改 Python 2 代码,而不是尝试将比较函数作为关键函数调用,而是使用不正确数量的参数调用它。如果比较函数碰巧接受可变数量的参数,或者如果序列为空因此排序碰巧对某些输入“起作用”,这可以防止可能发生的混淆。

同样,sorted(sequence, cmp=function)由于cmp已被删除而提前失败。sorted(sequence, key=function)在 Python 2 和 3 中都按预期工作。

  • @Phillyclause89 我不知道。虽然有_一些_ PEP 涵盖了 Python 3(它们的编号以 3000 开头),但似乎有一段时间,许多决定都是在没有明确定义的过程的情况下在邮件列表上做出的。对“list.sort”和“sorted”的更改似乎属于这一类。 (2认同)

ywb*_*aek 8

除了@user4815162342 的回答,
文档中

sorted(iterable, *, key=None, reverse=False)
Run Code Online (Sandbox Code Playgroud)

注意*betweeniterablekey参数。这是用于指定必须
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 个