为了帮助我更好地理解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
答案 0 :(得分:8)
您可以使用map
,reduce
等,但现在列表推导是在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]