我还在和lambdas挣扎。此代码作为Python: closest coordinate?的答案提交。很多事让我感到困惑,但我已经完成了大部分内容。 float方法对self
的使用对我来说仍然有点棘手(我得到self.x
和self.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))
答案 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__
)