2014-12-10 94 views
3

我还在苦苦挣扎。此代码作为对Python: closest coordinate?的回答提交。很多事情让我困惑,但我已经完成了大部分工作。浮点法的使用self对我来说仍然有点棘手(我得到了self.xself.y,但并不确定在这种情况下自我是什么)。只是提到,因为它可能涉及主要部分,我不明白,这是closest方法中的lambda函数。我发现它会返回生成的最小项目,并且它将参数解包为参数。然后我有点失落。分别是__sub____pow__分别重新定义了-**,还是它们只是不同的方法?这个lambda函数做什么?

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)) 
+0

你尝试打印自壁橱或'打印(自点[1])'' – 2014-12-10 21:49:16

+0

self'是值该方法被调用,例如当你使用'pt0.closest(...)'时,'pt0'。 – Barmar 2014-12-10 21:49:23

+2

这些特殊方法的文档在这里:https://docs.python.org/2/library/operator.html – Barmar 2014-12-10 21:51:51

回答

1

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()内建函数。如牡蛎解释,min(seq, key=f)返回该项Xseq这最小化f(X)

1

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

当你减去两点时它会被调用。在这个例子中,self将是pt0

1

是的,__sub____pow__分别重新定义了-**。在这个例子中,您只需将匿名函数传递给min()的可选参数。 docs

可选的关键字唯一键参数指定像list.sort()那样的单参数排序函数。

在这个匿名函数你只是减点,其上closest从点叫,这是作为参数传递,然后将其转换为浮动(这种转换将被覆盖,见__float__