2009-10-09 5 views
6

Wenn ich mich mit Python und Javascript befasse, kann ich einige der Hauptfunktionen, die ich in Linguisten wie Haskell am mächtigsten finde, nicht sehen.Verständnis in Python und Javascript sind nur sehr einfach?

Erlauben sie Dinge wie mehrere Generatoren? Oder sind sie nur eine einfache Kartenfilterform?

Wenn sie nicht mehrere Generatoren erlauben, finde ich sie ziemlich enttäuschend - warum wurden solche Dinge weggelassen?

Antwort

12

Python ermöglicht es, mehrere Generatoren:

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

Und auch Einschränkungen:

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

aktualisieren: Javascripts Syntax ist ähnlich (Ergebnisse von m mit der javascript shell auf 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]] 

(Aus irgendeinem Grund, etwas über den Zusammenhang Sachen in der Javascript-Shell erfordert die eval indirection ausgewertet, um Listenkomprehensionen zu haben arbeiten. Javascript innerhalb eines <script> Tag erfordert nicht, dass, natürlich)

+0

Kühl. Jetzt braucht Python nur Pattern-Matching in Generatoren. Und Verallgemeinerungen jenseits von Sequenzen zu anderen Monaden zu verallgemeinern. Und äh - ein Typerchecker. :) – RD1

+2

Nein. Python ist nicht Haskell. Typprüfung ist gegen die Philosophie von Python. –

+0

Nach dem, was ich gelesen habe, wurde die optionale statische Typprüfung ernsthaft für Python in Betracht gezogen, bevor sie zurückgewiesen wurde. Also, ich glaube nicht, dass es so viel gegen die Philosophie sein kann. Und Geschichte sagt uns, dass Sprachen wie Lisp ohne Typ Checker nicht gut skalieren, auch mit Unit-Tests. Persönlich fällt es mir schwer, meinen Schülern beizubringen, wenn sie sich nicht auf die IDE verlassen können, um die Arten von Dingen zu verstehen - statische Typen machen das Programmieren so viel einfacher, wenn man lernt, mit einer guten IDE zu programmieren. – RD1

3

Ja, können Sie mehrere Iterables in einem Python list comprehension haben:

>>> [(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, ich bin froh. Ich frage mich nur, warum ich diese Informationen nicht leicht finden konnte. Keines der Beispiele auf Wikipedia oder anderswo scheint dies zu beinhalten. Alles, was ich nicht mag, ist die Syntax im Vergleich zu Haskell. :) Was ist mit Javascript? – RD1

1

eine if-Anweisung als auch Hinzufügen ...

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

Comprehensions in Haskell zu einem großen Teil sehr mächtig ist, weil Haskell funktionsfähig ist, so es macht sehr viel Sinn für sie zu sein. Python ist nicht funktional, daher ist es weniger sinnvoll.

Sie können in Python viele komplexe Dinge mit Comprehensions machen, aber es wird schnell schwer zu lesen, wodurch der ganze Zweck vereitelt wird (was bedeutet, dass Sie es auf andere Weise tun sollten).

Wie bereits erwähnt, erlaubt Python jedoch mehrere Generatoren in Comprehensions.

+1

Zuletzt hörte ich, eine der Stärken von Python ist, dass es funktionale Programmierung unterstützt und Dinge wie Schließungen umfasst. Gibt es eine andere Möglichkeit, das Äquivalent eines mehrfachen Generatorverständnisses zu verwenden, das in Python eleganter ist? – RD1

+0

Python hat eine eingeschränkte Unterstützung für funktionale Programmierung - hauptsächlich aufgrund der Tatsache, dass Python-Funktionen echte Objekte sind. Es hat auch ein paar Konstrukte aus funktionalen Sprachen geliehen. Aber es ist immer noch hauptsächlich und im Grunde eine imperative objektorientierte Sprache. Auch die pythonesque Definition von "Eleganz" ist * Lesbarkeit *. Ein Mehrgeneratorenverständnis ist normalerweise (für die meisten Programmierer zumindest) lesbarer als eine einfache alte "for" -Schleife. –

+0

@Rowan: Ja, für Schleifen, in der Regel. Sie sollten auch in die Erstellung eigener Generatoren mit 'yield' oder möglicherweise' __next__' schauen. –