这个lambda函数有什么作用?

时间:2014-12-10 21:46:49

标签: python lambda

我还在和lambdas挣扎。此代码作为Python: closest coordinate?的答案提交。很多事让我感到困惑,但我已经完成了大部分内容。 float方法对self的使用对我来说仍然有点棘手(我得到self.xself.y,但不确定那个上下文中的self是什么。只提到因为它可能涉及我不理解的主要部分,这是closest方法中的lambda函数。我看到它将返回生成的最小项目,并将它作为args解包。然后我有点失落。 __sub____pow__分别重新定义-**,还是仅仅是不同的方法?

class Point:
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def closest(self,*points):           
        return min(points,key=lambda x:float(x-self))
    def __sub__(self,other):
        return Point((self.x-other.x) , (self.y - other.y))
    def __pow__(self,powTo):
        return Point(self.x**powTo,self.y**powTo) 
    def __iter__(self):
        yield self.x
        yield self.y
    def __float__(self):
        return sum(self**2)**0.5
    def __str__(self):
        return "(%s,%s)"%(self.x,self.y)

pt0 = Point(9,2)
print pt0.closest(Point(0,0),Point(10,0),Point(10,10))

3 个答案:

答案 0 :(得分:2)

lambda args: expr不是一个特殊的魔术功能,它只是

的简单简写
def someFunc(args):
    return expr

当你需要一个带有简单表达的小函数并且你不关心这个名字时,它主要是有用的。如果我们使用熟悉的语法,closest()方法将是:

def closest(self,*points):
    def keyFunc(x):
        return float(x-self)           
    return min(points,key=keyFunc)

也就是说,它会创建一个小的一次性函数,根据self及其参数x进行一些计算,并将其传递给min()内置函数。正如Ostrea所解释的那样,min(seq, key=f)会在seq中返回 x 项,最小化f( x )

答案 1 :(得分:1)

def __sub__是您可以在对象上定义的神奇方法之一。

当你减去两点时会调用它。在示例中,self将为pt0

答案 2 :(得分:1)

是的,__sub____pow__分别重新定义了-**。在此示例中,您只需将匿名函数传递给min()的可选参数。以下是此可选参数的作用,如docs中所述:

  

可选的keyword-only键参数指定一个单参数排序函数,就像用于list.sort()的函数一样。

在这个匿名函数中,你只需减去点,从点上调用closest,将其作为参数传递,然后将其转换为float(此转换被覆盖,请参阅__float__