帮帮我lambda-nize这个

时间:2009-07-08 15:31:05

标签: python lambda

为了帮助我更好地理解lambda,我编写了这个简短的片段,它可以旋转和转换四边形(我希望我的数学正确)。现在,我想用一个衬里lambdas替换下面的三个步骤,可能与map()结合使用。

我正在使用vector class,但希望这些功能很明确。

self.orientation = vector(1,0)
self.orientation.rotate(90.0)

#the four corners of a quad
points = (vector(-1,-1),vector(1,-1),vector(1,1),vector(-1,1))
print points

#apply rotation to points according to orientation
rot_points = []
for i in points:
    rot_points.append(i.rotated(self.orientation.get_angle()))
print rot_points

#transform the point according to world position and scale
real_points = []
for i in rot_points:
    real_points.append(self.pos+i*self.scale)
print real_points

return real_points

2 个答案:

答案 0 :(得分:8)

您可以使用mapreduce等,但现在列表推导是在Python中执行操作的首选方式:

rot_points  = (i.rotated(self.orientation.get_angle()) for i in points)
real_points = [self.pos+i*self.scale for i in rot_points]

注意我在第一行中如何使用(parentheses)代替[brackets]。这被称为generator expression。它允许动态构造rot_points,因为在第二行中使用点而不是先在内存中构造所有rot_points,然后然后迭代它们。如果这是一个问题,它可以节省一些不必要的内存使用量。

答案 1 :(得分:0)

请注意,对于每个点,您都不必要地调用get_angle(),而实际上它在循环生命周期内是不变的。

我试试这个:

angle = self.orientation.get_angle()
real_points = [self.pos+point.rotated(angle)*self.scale for point in points]

我认为在这种情况下创建辅助函数也不是一个坏主意,因为你对每一点都做了很多。新功能更具可读性:

angle = self.orientation.get_angle()

def adjust_point(point):
     point = point.rotated(angle)
     point *= self.scale
     point += self.pos
     return point

real_points = [adjust_point(p) for p in point]