理解__call__和list.sort(键)

use*_*312 5 python sorting

我有以下代码我想了解:

>>> class DistanceFrom(object):
        def __init__(self, origin):
            self.origin = origin
        def __call__(self, x):
            return abs(x - self.origin)  

>>> nums = [1, 37, 42, 101, 13, 9, -20]
>>> nums.sort(key=DistanceFrom(10))
>>> nums
[9, 13, 1, 37, -20, 42, 101]
Run Code Online (Sandbox Code Playgroud)

谁能解释一下这是如何工作的?据我所知,__call__调用时object()调用的是 - 将对象作为函数调用.

我不明白的是如何nums.sort(key=DistanceFrom(10)).这是如何运作的?有人可以解释一下这行吗?

谢谢!

Mew*_*Mew 8

__call__在python中允许一个类运行,就像它是一个函数一样.您可以手动尝试:

>>> dis = DistanceFrom(10)
>>> print dis(10), dis(5), dis(0)
0 5 10
>>> 
Run Code Online (Sandbox Code Playgroud)

对于列表中的每个项目调用该函数是什么类型,并使用返回的值作为排序键.在这个示例中,您将获得一个列表,其中第一个项目最接近10,而另一个项目更靠近末尾.


Joh*_*ooy 7

在这里,我定义了一个函数DistanceFrom(),它可以以类似于你的类的方式使用,但可能更容易理解

>>> def DistanceFrom(origin):
...     def f(x):
...         retval = abs(x - origin)
...         print "f(%s) = %s"%(x, retval)
...         return retval
...     return f
... 
>>> nums = [1, 37, 42, 101, 13, 9, -20]
>>> nums.sort(key=DistanceFrom(10))
f(1) = 9
f(37) = 27
f(42) = 32
f(101) = 91
f(13) = 3
f(9) = 1
f(-20) = 30
>>> nums
[9, 13, 1, 37, -20, 42, 101]
Run Code Online (Sandbox Code Playgroud)

所以你看到,返回的对象DistanceFrom称为针对每个项目一次nums,然后nums是根据返回的值返回的有序