2010-10-27 67 views
5

我有下面的代码,我想了解:了解__call__和list.sort(键)

>>> 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] 

谁能解释这是如何工作?据我所知,__call__是调用object()时调用的 - 调用该对象作为函数。我不明白的是nums.sort(key=DistanceFrom(10))。这个怎么用?任何人都可以请解释这一行吗?

谢谢!

回答

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] 

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

+0

谢谢!太棒了。 – user225312 2010-10-27 14:58:32

+0

@阿尔弗雷德,你最欢迎 – 2010-10-27 15:01:43

4

它使用key功能对象DistanceFrom(10)nums排序。它需要被调用,因为key需要被调用。结果输出按10的“远程”排序,即9是最接近10的值,101是最远的值。

对象被初始化之后,并通过作为key参数到sort方法,在每次迭代,将与当前的值被调用(这就是x是),并返回值将被用于确定在的x位置结果列表。

+0

这是如何执行的?我的意思是,DistanceFrom(10)设置self.origin = 10.之后呢? – user225312 2010-10-27 14:45:08

+0

@Alfred:看到我的编辑 – SilentGhost 2010-10-27 14:47:44

+0

“__ init __”是一个构造函数,在创建Object键时被调用 – OlimilOops 2010-10-27 14:48:09

8

__call__ python允许类运行,就好像它是一个函数。您可以手动尝试此操作:

>>> dis = DistanceFrom(10) 
>>> print dis(10), dis(5), dis(0) 
0 5 10 
>>> 

对列表中的每个项目都调用该函数,并将返回的值用作排序关键字。在这个例子中,你会得到一个列表,其中最接近10的项目是第一个,而最后一个的项目更远。

+0

啊。这很好。 – user225312 2010-10-27 14:52:21

+0

@user:你的回答很完美,但我接受了gnibbler的回答,因为如果他们搜索它,对初学者会有好处。 – user225312 2010-10-27 15:42:42

1

当你打电话的时候,这意味着你期待它返回一个值。当你创建一个定义了__call__方法的类时,你可以指定该类的一个实例可以像函数那样工作。

对于这个问题的目的,这样的:

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

在功能上等同于:

def distance_from(origin, other): 
    return abs(other - origin) 

至于key参数进行排序,这里是你的解释直接从Python文档:

key详细说明一个 参数的函数,该参数用于从每个列表元素提取一个 比较键: key=str.lower。默认值是 无(直接比较的元素)

1

只要我发现我不了解基本原理,Python文档就非常好。我找到这些与谷歌。

The key parameter是sort将调用列表中的元素的函数。我通过搜索sort site:http://docs.python.org/找到该文档,然后搜索key=

__call__是一个函数,您可以添加到一个对象,使该对象可以调用,就好像它是一个函数。我通过搜索__call__ site:http://docs.python.org/发现了该文档,然后查看__call__的文档链接。

+0

我明白他们是什么,我的问题是特定于这个例子。 – user225312 2010-10-27 14:56:47