Porovnání programovacích jazyků (porozumění seznamu) - Comparison of programming languages (list comprehension)
![]() | tento článek potřebuje další citace pro ověření.Únor 2009) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
Seznam s porozuměním je syntaktický konstrukt k dispozici v některých programovací jazyky pro vytvoření seznamu založeného na existujících seznamech. Sleduje formu matematické set-builder notace (nastavit porozumění) na rozdíl od použití mapa a filtr funkce.
Příklady porozumění seznamu
Vypískat
Seznam se všemi čtyřhry od 0 do 10 (exkluzivní)
čtyřhra = [i*2 pro i v rozsah(10)]
Seznam se jmény zákazníků se sídlem v Rio de Janeiro
rjCustomers = [zákazník.název pro zákazník v zákazníky -li zákazník.Stát == "RJ"]
C#
var ns = z X v Vyčíslitelné.Rozsah(0, 100) kde X * X > 3 vybrat X * 2;
Předchozí kód je syntaktický cukr pro následující kód napsaný pomocí výrazů lambda:
var ns = Vyčíslitelné.Rozsah(0, 100) .Kde(X => X * X > 3) .Vybrat(X => X * 2);
Cejlon
Filtrování čísel dělitelných 3:
hodnota dělitelnýBy3 = { pro (i v 0..100) -li (i%3==0) i };// typ divisibleBy3 je Iterable
Více „generátorů“:
hodnota trojnásobek = { pro (X v 0..20) pro (y v X..20) pro (z v y..20) -li (X*X + y*y == z*z) [X,y,z] };// typ trojic je Iterable
Clojure
Nekonečná líná sekvence:
(pro [X (opakovat vč 0) :když (> (* X X) 3)] (* 2 X))
Seznam s porozuměním pomocí více generátorů:
(pro [X (rozsah 20) y (rozsah 20) z (rozsah 20) :když (== (+ (* X X) (* y y)) (* z z))] [X y z])
CoffeeScript
velká čísla = (číslo pro číslo v seznam když číslo > 100)
Společný Lisp
Porozumění seznamu lze vyjádřit pomocí smyčka
makro sbírat
klíčové slovo. Podmíněné výrazy jsou vyjádřeny pomocí -li
, jak následuje:
(smyčka pro X z 0 na 100 -li (> (* X X) 3) sbírat (* 2 X))
Kobra
Seznam jmen zákazníků:
jména = pro cust v zákazníky dostat cust.název
Seznam zákazníků se zůstatky:
jména = pro cust v zákazníky kde cust.Zůstatek > 0
Seznam jmen zákazníků se zůstatky:
jména = pro cust v zákazníky kde cust.Zůstatek > 0 dostat cust.název
Obecné formy:
pro VAR v ENUMERABLE [kde STAV] dostat EXPRpro VAR v ENUMERABLE kde STAV
Všimněte si, že uvedením podmínky a výrazu po název proměnné a vyjmenovatelný objekt, editory a IDE mohou poskytnout automatické doplňování na členy proměnné.
Šipka
[pro (var i v rozsah(0, 100)) -li (i * i > 3) i * 2]
var pyth = [ pro (var X v rozsah(1, 20)) pro (var y v rozsah(X, 20)) pro (var z v rozsah(y, 20)) -li (X * X + y * y == z * z) [X, y, z]];
Iterable<int> rozsah(int Start, int konec) => Seznam.generovat(konec - Start, (i) => Start + i);
Elixír
pro X <- 0..100, X * X > 3, dělat: X * 2
Erlang
L = seznamy:násl(0,100).S = [2*X || X <- L, X*X > 3].
F#
Lazily-hodnocené sekvence:
násl { pro X v 0 .. 100 dělat -li X*X > 3 pak výtěžek 2*X }
Nebo pro hodnoty s plovoucí desetinnou čárkou
násl { pro X v 0. .. 100. dělat -li X**2. > 3. pak výtěžek 2.*X }
Seznamy a pole:
[ pro X v 0. .. 100. dělat -li X**2. > 3. pak výtěžek 2.*X ][| pro X v 0. .. 100. dělat -li X**2. > 3. pak výtěžek 2.*X |]
Porozumění seznamu je součástí větší rodiny jazykových konstruktů nazývaných výpočetní výrazy.
Báječný
(0..100).najít vše{ X -> X * X > 3 }.sbírat { X -> 2 * X }
Haskell
[X * 2 | X <- [0 .. 99], X * X > 3]
Příklad porozumění seznamu pomocí více generátorů:
pyth = [(X,y,z) | X <- [1..20], y <- [X..20], z <- [y..20], X^2 + y^2 == z^2]
Io
Použitím objektu Range může jazyk Io vytvořit seznam stejně snadno jako v jiných jazycích:
Rozsah 0 na(100) jako seznam vybrat(X, X*X>3) mapa(*2)
ISLISP
Porozumění seznamu lze vyjádřit pomocí pro
speciální formulář. Podmíněné výrazy jsou vyjádřeny pomocí -li
, jak následuje:
(pro ((X 0 (+ X 1)) (sbírat ())) ((>= X 100) (zvrátit sbírat)) (-li (> (* X X) 3) (setq sbírat (nevýhody (* X 2) sbírat))))
Jáva
Java s Streams API,[1] který zahrnuje rozhraní IntStream[2] což umožňuje operace jako následující:
Seznam<Celé číslo> ns = IntStream.rozsah(0, 100) .filtr(X -> X * X > 3) .mapa(X -> X * 2) .v krabici().sbírat(Sběratelé.seznam());
JavaScript
[...rozsah(100)].filtr(X => X**2 > 3).mapa(X => 2 * X) funkce* rozsah(Start, stop, krok=1) { // rozsah (n) je přemapován na rozsah (0, n, 1) -li (!stop) [Start, stop] = [0, Start] pro (nechat i=Start; i<stop; i+=krok) { výtěžek i; }}
Julie
Julia podporuje porozumění pomocí syntaxe:
y = [X^2+1 pro X v 1:10]
a vícerozměrné chápání jako:
z = [(X-5)^2+(y-5)^2 pro X = 0:10, y = 0:10]
Je také možné přidat podmínku:
proti = [3X^2 + 2y^2 pro X v 1:7 pro y v 1:7 -li X % y == 0]
A stačí změnit hranaté závorky na kulatou, dostaneme generátor:
G = (3X^2 + 2y^2 pro X v 1:7 pro y v 1:7 -li X % y == 0)
Mythryl
s = [2 * i pro i v 1..100, kde i * i> 3];
Více generátorů:
pyth = [(x, y, z) pro x v 1..20 pro y v x..20 pro z v y..20 kde x * x + y * y == z * z];
Nemerle
$[X*2 | X v [0 .. 100], X*X > 3]
OCaml
OCaml podporuje porozumění seznamu prostřednictvím OCaml baterií.[3]
Krajta
Krajta používá následující syntaxi k vyjádření porozumění seznamu přes konečné seznamy:
S = [2 * X pro X v rozsah(100) -li X ** 2 > 3]
A výraz generátoru lze použít ve verzích Pythonu> = 2.4, což dává líné hodnocení přes jeho vstup a lze jej použít s generátory iterovat přes 'nekonečný' vstup, jako je funkce generátoru počtu, která vrací po sobě jdoucí celá čísla:
z itertools import početS = (2 * X pro X v počet() -li X ** 2 > 3)
(Následné použití výrazu generátoru určí, kdy se má zastavit generování hodnot).
R
X <- 0:100 S <- 2 * x [x ^ 2 > 3]
Raketa
(pro / seznam ([X 100] #:když (> (* X X) 3)) (* X 2))
Příklad s více generátory:
(pro * / seznam ([X (v dosahu 1 21)] [y (v dosahu 1 21)] [z (v dosahu 1 21)] #:když (= (+ (* X X) (* y y)) (* z z))) (seznam X y z))
Raku
my @s = ($ _ * 2 pokud $ _ ** 2> 3 za 0 .. 99);
Rubín
(0..100).vybrat { |X| X**2 > 3 }.mapa { |X| 2*X }
Rez
Rez nemá předdefinované seznamy, ale mnoho z jejich schopností lze replikovat pomocí iterátorů:
nechatns: Vec<_>=(0..100).filtr(|X|X*X>3).mapa(|X|2*X).sbírat();
Scala
Použití porozumění:
val s = pro (X <- 0 na 100; -li X*X > 3) výtěžek 2*X
Systém
Porozumění seznamu je ve schématu podporováno pomocí SRFI -42 knihovna.[4]
(list-ec (: X 100) (-li (> (* X X) 3)) (* X 2))
Příklad porozumění seznamu pomocí více generátorů:
(list-ec (: X 1 21) (: y X 21) (: z y 21) (-li (= (+ (* X X) (* y y)) (* z z))) (seznam X y z))
SETL
s: = {2 * x: x in {0..100} | x ** 2> 3};
Pokec
((1 na: 100) vybrat: [ :X | X na druhou > 3 ]) sbírat: [ :X | X * 2 ]
Rychlý
// 0 2 4 6 ... 18nechat krát dva = (0..<10).mapa{ $0*2 }
// Předpokládejme isPrime: (Int) -> Bool funkce, která kontroluje, zda je její argument prvočíslonechat primeBelow100 = (0...100).filtr(isPrime)
Vizuální prolog
S = [ 2*X || X = seznam :: getMember_nd(L), X*X > 3 ]
PowerShell
$ s = ( 0..100 | ? {$_*$_ -gt 3} | % {2*$_} )
což je krátká notace:
$ s = 0..100 | kde-objekt {$_*$_ -gt 3} | pro každého-objekt {2*$_}