2009-07-08 6 views
3

Pour m'aider à mieux comprendre lambda, j'ai écrit ce court extrait qui fait pivoter et transformer un quad (j'espère avoir le bon calcul). Maintenant, je veux remplacer les trois étapes ci-dessous avec un lambdas doublure, éventuellement en conjonction avec map(). Im utilisant un vector class mais j'espère, les fonctions sont claires quant à ce qu'ils font.Aidez-moi à lambda-nize this

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 

Répondre

8

Vous pouvez utiliser map, reduce, et al, mais la liste de nos jours compréhensions sont la meilleure façon de faire les choses en 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] 

Remarquez comment je (parentheses) au lieu de [brackets] dans la première ligne . C'est ce qu'on appelle un generator expression. Il permet rot_points d'être construit à la volée comme les points sont utilisés dans la deuxième ligne plutôt que de construire tous les rot_points en mémoire d'abord et puis en itérant à travers eux. Cela pourrait économiser un peu d'utilisation inutile de la mémoire, en gros, si c'est un problème.

+0

Tellement bon python en un seul post! –

+1

donc, à proprement parler, les générateurs sont préférés, pas les listes de compréhension :) – zweiterlinde

+0

zweiterlinde: Donc, ses expressions de générateur> liste des compréhensions> lambdas? – Mizipzor

0

Notez que vous appelez inutilement get_angle() pour chaque point, alors que c'est vraiment constant pendant la durée de vie de la boucle.

Je vais essayer ceci:

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

Je ne pense pas que ce soit une mauvaise idée de créer une fonction d'assistance dans ce cas non plus, puisque vous faites un peu à chaque point. Une nouvelle fonction est plus lisible:

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

Je pense honnêtement que votre premier extrait de code est plus lisible. : P – Mizipzor

Questions connexes