代码之家  ›  专栏  ›  技术社区  ›  user225312

了解呼叫和列表。排序(键)

  •  5
  • user225312  · 技术社区  · 15 年前

    我有以下代码要理解:

    >>> 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)) . 这是怎么工作的?有人能解释一下这句话吗?

    谢谢!

    5 回复  |  直到 15 年前
        1
  •  7
  •   John La Rooy    15 年前

    这里我定义了一个函数 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 然后 纽姆斯 根据返回值进行排序

        2
  •  8
  •   SilentGhost    15 年前

    __call__

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

    sort的作用是为列表中的每个项调用该函数,并将返回的值用作排序键。在本例中,您将得到一个列表,其中最接近10的项放在最前面,最靠近10的项放在最后面。

        3
  •  4
  •   SilentGhost    15 年前

    它排序列表 nums key 函数对象 DistanceFrom(10) . 它需要可调用,因为 钥匙

    对象初始化并作为 钥匙 参数到 sort x 返回值将用于确定 在结果列表中的位置。

        4
  •  1
  •   jathanism    15 年前

    __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=str.lower 无(直接比较元素)

        5
  •  1
  •   Dave Aaron Smith    15 年前

    每当我发现自己不了解基本原理时,Python文档就非常好。我用谷歌找到了这些。

    The key parameter 是排序将调用列表元素的函数。我通过谷歌找到了这个医生 sort site:http://docs.python.org/ 然后搜索 key=

    __call__ 是一个可以添加到对象的函数,使该对象可以调用,就像它是一个函数一样。我通过谷歌找到这个医生 __call__ site:http://docs.python.org/ 然后按照文档的链接 __呼叫__