2014-12-10 92 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__