2009-10-09 5 views
6

En regardant les compréhensions en Python et Javascript, jusqu'à présent, je ne peux pas voir certaines des principales caractéristiques que je considère comme les plus puissantes dans les compréhensions dans des langages comme Haskell.Les compréhensions en Python et Javascript ne sont que très basiques?

Autorisent-ils des choses comme des générateurs multiples? Ou sont-ils simplement un formulaire de filtre de carte de base?

Si elles ne permettent pas plusieurs générateurs, je les trouve assez décevants - pourquoi ces éléments ont-ils été omis?

Répondre

12

Python permet à plusieurs générateurs:

>>> [(x,y,x*y) for x in range(1,5) for y in range(1,5)] 
[(1, 1, 1), (1, 2, 2), (1, 3, 3), (1, 4, 4), 
(2, 1, 2), (2, 2, 4), (2, 3, 6), (2, 4, 8), 
(3, 1, 3), (3, 2, 6), (3, 3, 9), (3, 4, 12), 
(4, 1, 4), (4, 2, 8), (4, 3, 12), (4, 4, 16)] 

Et aussi les restrictions:

>>> [(x,y,x*y) for x in range(1,5) for y in range(1,5) if x*y > 8] 
[(3, 3, 9), (3, 4, 12), (4, 3, 12), (4, 4, 16)] 

Mise à jour: Javascript pour la syntaxe est similaire (résultats m en utilisant la javascript shell sur firefox):

var nums = [1, 2, 3, 21, 22, 30]; 
var s = eval('[[i,j] for each (i in nums) for each (j in [3,4]) if (i%2 == 0)]'); 
s.toSource(); 
[[2, 3], [2, 4], [22, 3], [22, 4], [30, 3], [30, 4]] 

(Pour une raison quelconque, quelque chose au sujet de la substance de contexte est évaluée dans le shell nécessite JavaScript eval indirection d'avoir un travail compréhensions de la liste. Javascript dans une balise <script> ne nécessite pas que, bien sûr)

+0

Cool. Maintenant, tout ce dont Python a besoin est la correspondance de modèles dans les générateurs. Et de généraliser les compréhensions au-delà des séquences à d'autres monades. Et er - un typerchecker. :) – RD1

+2

Non. Python n'est pas Haskell. La vérification de type est contraire à la philosophie de python. –

+0

D'après ce que j'ai lu, la vérification de type statique facultative a été sérieusement considérée pour Python pendant un moment avant d'être rejetée. Donc, je ne crois pas que cela puisse être contre la philosophie. Et l'histoire nous dit que les langages comme Lisp sans les vérificateurs de type ne se développent pas bien, même avec des tests unitaires. Personnellement, je trouve difficile d'enseigner à mes étudiants quand ils ne peuvent pas compter sur l'IDE pour comprendre le type de choses - les types statiques rendent la programmation beaucoup plus facile quand on apprend à programmer avec un bon IDE. – RD1

3

Oui, vous pouvez avoir plusieurs iterables dans un Python list comprehension:

>>> [(x,y) for x in range(2) for y in range(3)] 
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)] 
+0

Cool, je suis content. Je me demande juste pourquoi je n'ai pas pu trouver cette information facilement ... aucun des exemples sur Wikipedia ou ailleurs ne semble inclure ceci. Maintenant, tout ce que je n'aime pas, c'est la syntaxe par rapport à Haskell. :) Qu'en est-il de Javascript? – RD1

1

Ajouter une instruction if et ...

>>> [(x,y) for x in range(5) for y in range(6) if x % 3 == 0 and y % 2 == 0] 
[(0, 0), (0, 2), (0, 4), (3, 0), (3, 2), (3, 4)] 
1

compréhensions est très puissant dans Haskell dans une large mesure parce que Haskell est fonctionnelle, donc cela a beaucoup de sens pour eux. Python n'est pas fonctionnel donc cela a moins de sens.

Vous pouvez faire beaucoup de choses complexes avec des interprétations en Python mais il devient rapidement difficile à lire, ce qui annule tout le but (ce qui signifie que vous devriez le faire d'une autre manière).

Toutefois, comme indiqué ici, python permet plusieurs générateurs de compréhension.

+1

Dernièrement, j'ai entendu dire que l'une des forces de Python est de soutenir la programmation fonctionnelle et d'englober des choses comme les fermetures. Existe-t-il une autre façon de faire l'équivalent d'une compréhension de plusieurs générateurs plus élégante en Python? – RD1

+0

Python a un support restreint pour la programmation fonctionnelle - principalement en raison du fait que les fonctions Python sont de vrais objets. Il a également emprunté quelques constructions à partir de langages fonctionnels. Mais c'est toujours et essentiellement un langage orienté objet impératif. En outre, la définition pythonienne de "élégance" est * lisibilité *. Une compréhension de plusieurs générateurs est généralement beaucoup plus lisible (pour la majorité des programmeurs au moins) écrite comme une simple boucle "for". –

+0

@Rowan: Oui, pour les boucles, généralement. Vous voulez aussi créer vos propres générateurs avec 'yield' ou éventuellement' __next__'. –

Questions connexes