6
votes

Les compréhensions en Python et JavaScript sont seulement très basiques?

En regardant des compromies dans Python et JavaScript, je ne peux pas voir certaines des caractéristiques principales que je considère la plus puissante dans les complètes dans des langues comme Haskell.

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

S'ils n'autorisent pas plusieurs générateurs, je les trouve assez décevants - pourquoi ces choses ont-elles été laissées de côté?


0 commentaires

4 Réponses :


3
votes

1 commentaires

Cool, je suis content. Je me demandais simplement pourquoi je ne pouvais pas trouver cette information facilement ... aucun des exemples de Wikipedia ou ailleurs ne semble inclure cela. Maintenant, tout ce que je n'aime pas, c'est la syntaxe par rapport à Haskell. :) Qu'en est-il de JavaScript?



12
votes

python permet plusieurs générateurs: xxx pré>

et restrictions: p> xxx pré>

update b>: la syntaxe de Javascript est Similaire (résultats de l'aide de shell JavaScript sur Firefox): p>

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


8 commentaires

Frais. Maintenant, tous les besoins de Python sont en correspondance dans les générateurs. Et généraliser les compréhensions au-delà des séquences à d'autres monades. Et ER - un Typerchecker. :)


Non. Python n'est pas haskell. Le type de vérification est contre la philosophie de Python.


De ce que j'ai lu, la vérification du type statique facultatif a été sérieusement envisagée pour Python pendant un moment avant d'être rejetée. Donc, je ne crois pas que cela puisse être beaucoup contre la philosophie. Et l'histoire nous dit que des langues comme Lisp sans que les dames de type ne puissent pas bien augmenter, même avec des tests unitaires. Personnellement, je trouve difficile d'apprendre à mes étudiants quand ils ne peuvent pas compter sur l'IDE pour comprendre les types de choses - les types statiques facilitent ainsi la programmation lorsque vous apprenez à programmer avec une bonne IDE.


Belle mise à jour. Pour JavaScript, ces informations semblaient assez difficiles à trouver. Et, je suppose que j'étais d'humeur paresseuse. :) Je demandais en partie du fait de devoir vous recommander de recommander des langues pour enseigner dans un cours majeur non-CS pour la "programmation légère". J'aimerais toujours recommander F #, mais je pense que Python et JavaScript sont plus susceptibles de bien descendre avec d'autres personnes.


Le simple fait que la vérification du type statique a finalement été rejetée est une indication certaine certaine que ce n'est pas pythonique. L'un des points principaux sur Python est le dynamisme - et non seulement WRT / Taping. N'oubliez pas que dans Python, vous pouvez ajouter / remplacer / supprimer des attributs et des méthodes lors de l'exécution, que ce soit sur un objet ou par instance. Vous pouvez même changer la classe d'un objet à l'exécution de FWIW. Peu pire - «classe» est une déclaration exécutable d'exécution. Bonne chance avec le type statique en vérifiant cela! -)


Vous pouvez imiter quelque chose de dactylographié de manière dynamique dans une langue statistique dactylographiée simplement en faisant des constructions de bibliothèque qui renvoient toujours le même type "universel". Il finit même à regarder assez semblables au code d'origine. Construire une bibliothèque qui émule Python dans une langue statiquement dactylographiée est assez facile. Les gens ne font pas exactement cela, mais ils font souvent des choses similaires lorsque la saisie plus faible est souhaitée. C'est vraiment facile. L'autre moyen est impossible car il n'y a pas de vérificateur de type.


En évitant les vérifications de type dans une langue typée de manière statique, vous avez souvent des problèmes car le compilateur suppose que la vérification du type est là et utile. En C, vous vous retrouvez généralement avec des pointeurs, puis vous faites la mauvaise chose avec le mauvais pointeur et kablam . Les types de vérification dans Python sont triviaux si vous le souhaitez. ASSERT ISInstance (OB, TYPE)


@Rowan Static Typing est une optimisation et ne devrait pas être nécessaire pour apprendre à programmer. L'un des plus grands livres pour l'apprentissage de la programmation SICP utilise un système.



1
votes

Ajouter une instruction IF aussi ...

>>> [(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)]


0 commentaires

1
votes

Les compréhensions sont très puissantes dans HASKELL, car HASKELL est fonctionnel, il est donc extrêmement un sens pour eux d'être. Python n'est pas fonctionnel, il a donc moins de sens.

Vous pouvez faire beaucoup de choses complexes avec des complexions dans Python, mais cela devient rapidement difficile à lire, vaincre ainsi tout le but (ce qui signifie que vous devriez le faire d'une autre manière).

Cependant, comme indiqué ici, Python autorise plusieurs générateurs dans des compréhensions.


4 commentaires

Enfin, j'ai entendu dire que l'une des forces de Python est que cela prend en charge la programmation fonctionnelle et embrasse des objets comme des 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?


Python a un support restreint pour la programmation fonctionnelle - principalement du fait que les fonctions Python sont des objets vrais. Il a également emprunté quelques constructions de langues fonctionnelles. Mais c'est toujours surtout et essentiellement une langue impérative orientée objet. De plus, la définition pythoneque de "élégance" est lisibilité . Une compréhension multiple génératrice est généralement beaucoup plus lisible (pour la majorité des programmeurs au moins) écrites comme une boucle ancienne unique "pour".


@Rowan: Oui, pour les boucles, typiquement. Vous souhaitez également consulter la création de vos propres générateurs avec produire ou éventuellement __ suivant __ .


Python ne prend pas très bien la programmation fonctionnelle (plus que Java, bien sûr), et il n'embrasse pas beaucoup de fermetures que de leur donner une brève poignée de main molle. Les Lambdas in Python sont reléguées au même statut de deuxième classe-citoyen que pour les boucles à OCAML.