2009-07-08 4 views
3

람다에 대해 더 잘 이해할 수 있도록 저는 회전하고 쿼드를 변형시키는이 짧은 스 니펫을 썼습니다. 이제 아래의 3 단계를 하나의 라이너 람다 (아마도 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 

답변

8

당신은 등 map, reduce을 사용하지만, 요즘 함축 파이썬에서 일을 할 수있는 좋은 방법입니다 목록 수 : 나는 첫 번째 줄에 (parentheses) 대신 [brackets]을 사용하는 방법

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

공지 사항 . 이를 generator expression이라고합니다. 처음에는 메모리에 rot_points을 모두 구성하지 않고 을 구성한 다음을 반복하는 방식으로 두 번째 라인에서 점이 사용되므로 rot_points을 즉석에서 구성 할 수 있습니다. 그것이 불필요한 메모리 사용을 근본적으로 줄일 수 있습니다.

+0

한 게시물에 너무 많은 파이썬이 있습니다! –

+1

그래서 엄밀히 말하면 생성자가 목록 작성이 아닌 선호됩니다. – zweiterlinde

+0

zweiterlinde : 그래서 생성자 표현> 목록 내포> 람다? – Mizipzor

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

솔직히 말해서 첫 번째 코드 스 니펫이 더 읽기 쉽다고 생각합니다. :피 – Mizipzor

관련 문제