stringtranslate.com

Сравнение языков программирования (понимание списков)

List comprehension — это синтаксическая конструкция, доступная в некоторых языках программирования для создания списка на основе существующих списков. Она следует форме математической нотации set-builder ( set comprehension ), в отличие от использования функций map и filter .

Примеры понимания списка

Буу

Список всех двойников от 0 до 10 (исключая)

удваивает = [ i * 2 для i в диапазоне ( 10 )]      

Список имен клиентов, находящихся в Рио-де-Жанейро

rjCustomers = [ клиент . Имя клиента в клиентах , если клиент . Состояние == "RJ" ]          

С#

var ns = from x in Enumerable . Диапазон ( 0 , 100 ) , где x * x > 3 select x * 2 ;                 

Предыдущий код представляет собой синтаксический сахар для следующего кода, написанного с использованием лямбда-выражений:

var ns = Перечислимый . Диапазон ( 0 , 100 ) . Где ( x => x * x > 3 ) . Выбрать ( x => x * 2 );                

Цейлон

Фильтрация чисел, делящихся на 3:

значение divisibleBy3 = { for ( i in 0 .. 100 ) if ( i % 3 == 0 ) i }; // тип divisibleBy3 — ​​Iterable<Integer>           

Несколько «генераторов»:

значение тройки = { for ( x in 0 .. 20 ) for ( y in x .. 20 ) for ( z in y .. 20 ) if ( x * x + y * y == z * z ) [ x , y , z ] }; // тип троек Iterable<Integer[3]>                       

Кложур

Бесконечная ленивая последовательность:

 ( for [x ( iterate inc 0 ) :when ( > ( * x x ) 3 ) ] ( * 2 x ))              

Понимание списка с использованием нескольких генераторов:

 ( для [x ( диапазон 20 ) y ( диапазон 20 ) z ( диапазон 20 ) : когда ( == ( + ( * x x ) ( * y y )) ( * z z )) ] [x y z] )                        

CoffeeScript

largeNumbers = ( число для числа в списке , когда число > 100 )          

Общий Лисп

Списочные интерпретации могут быть выражены с помощью ключевого слова loopмакроса collect. Условные конструкции выражаются с помощью if, как показано ниже:

( цикл для x от 0 до 100 если ( > ( * x x ) 3 ) собрать ( * 2 x ))                

Кобра

Перечислите имена клиентов:

имена  =  для  cust  в  customers  получить  cust . имя

Список клиентов с остатками:

имена  =  для  клиентов  , где  баланс клиента > 0    

Перечислите имена клиентов, имеющих остатки на счетах:

имена  =  для  cust  в  клиентах  , где  cust . balance  >  0  получить  cust . name

Общие формы:

для  VAR  в  ENUMERABLE  [ где  УСЛОВИЕ ]  получить  EXPR для  VAR  в  ENUMERABLE  где  УСЛОВИЕ

Обратите внимание, что, поместив условие и выражение после имени переменной и перечисляемого объекта, редакторы и IDE могут обеспечить автодополнение для членов переменной.

Дарт

[ для ( переменная i в диапазоне ( 0 , 100 )) если ( i * i > 3 ) i * 2 ]              
var pyth = [ for ( var x in range ( 1 , 20 )) for ( var y in range ( x , 20 )) for ( var z in range ( y , 20 )) if ( x * x + y * y == z * z ) [ x , y , z ] ];                                    
Итерируемый <int> диапазон ( int start , int end ) = > Список . generate ( end - start , ( i ) => start + i ) ;             

Эликсир

для x <- 0 .. 100 , x * x > 3 , сделать : x * 2            

Эрланг

L = списки : seq ( 0 , 100 ). S = [ 2 * X || X <- L , X * X > 3 ].           

Фа#

Лениво оцениваемые последовательности:

seq { for x in 0 .. 100 do if x * x > 3 then yield 2 * x }                

Или, для значений с плавающей точкой

seq { for x in 0 . .. 100 . do if x ** 2 . > 3 . then yield 2 .* x }                

Списки и массивы:

[ for x in 0 . .. 100 . do if x ** 2 . > 3 . then yield 2 .* x ] [| for x in 0 . .. 100 . do if x ** 2 . > 3 . then yield 2 .* x |]                              

Списковые генераторы являются частью большого семейства языковых конструкций, называемых вычислительными выражениями.


Хаскелл

[ х * 2 | х <- [ 0 .. 99 ], х * х > 3 ]             

Пример понимания списка с использованием нескольких генераторов:

pyth знак равно [( Икс , y , z ) | x <- [ 1 .. 20 ], y <- [ x .. 20 ], z <- [ y .. 20 ], x ^ 2 + y ^ 2 == z ^ 2 ]                 

Ио

Используя объект Range, язык IO может создавать списки так же просто, как и в других языках:

Диапазон от 0 до ( 100 ) asList select ( x , x * x > 3 ) map (* 2 )      

ИСЛИСП

Списочные интерпретации могут быть выражены с помощью forспециальной формы. Условные конструкции выражаются с помощью if, как показано ниже:

( for (( x 0 ( + x 1 )) ( collect ())) (( >= x 100 ) ( reverse collect )) ( if ( > ( * x x ) 3 ) ( setq collect ( cons ( * x 2 ) collect ))))                         


Джулия

Julia поддерживает понимание, используя синтаксис:

 y = [ x ^ 2 + 1 для x в 1 : 10 ]      

и многомерные понимания, такие как:

 z = [( x - 5 ) ^ 2 + ( y - 5 ) ^ 2 для x = 0 : 10 , y = 0 : 10 ]         

Также можно добавить условие:

v = [ 3 x ^ 2 + 2 y ^ 2 для x из 1 : 7 для y из 1 : 7 если x % y == 0 ]                  

И просто заменив квадратные скобки на круглые, мы получим генератор:

g = ( 3 x ^ 2 + 2 y ^ 2 для x из 1 : 7 для y из 1 : 7 если x % y == 0 )                  

Мифрил

s = [ 2*i для i в диапазоне 1..100, где i*i > 3 ];

Несколько генераторов:

pyth = [ (x,y,z) для x в диапазоне 1..20 для y в диапазоне x..20 для z в диапазоне y..20, где x*x + y*y == z*z ];

Немерле

$[ x * 2  |  x  в  [ 0  ..  100 ],  x * x  >  3 ]

Ним

Nim имеет встроенные seq, set, table и object-композиции в модуле стандартной библиотеки sugar: [1]

импортный сахар пусть переменная = collect ( newSeq ): для элемента в @[- 9 , 1 , 42 , 0 , - 1 , 9 ] : элемент + 1               утвердить переменную == @[- 8 , 2 , 43 , 1 , 0 , 10 ]        

Включение реализовано как макрос, который расширяется во время компиляции. Вы можете увидеть расширенный код с помощью опции компилятора expandMacro :

var collectResult = newSeq ( Natural ( 0 )) для элемента в элементах ( @[- 9 , 1 , 42 , 0 , - 1 , 9 ] ): добавить ( collectResult , item + 1 ) collectResult               

Выражения могут быть вложенными и многострочными:

импортный сахар пусть значения = собрать ( newSeq ): для val в [ 1 , 2 ] : собрать ( newSeq ): для val2 в [ 3 , 4 ] : если ( val , val2 ) != ( 1 , 2 ): ( val , val2 ) утвердить значения == @[@[ ( 1 , 3 ), ( 1 , 4 ) ] , @[ ( 2 , 3 ), ( 2 , 4 ) ]]                                 

OCaml

OCaml поддерживает понимание списков с помощью OCaml Batteries . [2]

Перл

мой @s = карта { 2 * $_ } grep { $_ ** 2 > 3 } 0 .. 99 ;             

Массив со всеми числами двойной точности от 1 до 9 включительно:

мои @doubles = карта { $_ * 2 } 1 .. 9 ;       

Массив с именами клиентов, проживающих в Рио-де-Жанейро (из массива хэшей):

мой @rjCustomers = карта { $_ -> { состояние } экв "RJ" ? $_ -> { имя } : ()} @customers ;           

Фильтрация чисел, делящихся на 3:

мой @divisibleBy3 = grep { $_ % 3 == 0 } 0 .. 100 ;         

PowerShell

$s  =  (  0 .. 100  |  ?  { $_ * $_  -больше  3 }  |  %  { 2 * $_ }  )

что является сокращенной записью:

$s  =  0 .. 100  |  where-object  { $_ * $_  -gt  3 }  |  foreach -object  { 2 * $_ }

Питон

Для выражения списочных представлений над конечными списками в Python используется следующий синтаксис:

S  =  [ 2  *  x  для  x  в  диапазоне ( 100 )  если  x  **  2  >  3 ]

Выражение генератора может использоваться в версиях Python >= 2.4, что обеспечивает ленивую оценку входных данных, и может использоваться с генераторами для итерации по «бесконечным» входным данным, таким как функция генератора количества, которая возвращает последовательные целые числа:

из  itertools  импортировать  количество S  =  ( 2  *  x  для  x  в  количестве ()  если  x  **  2  >  3 )

(Последующее использование выражения генератора определит, когда следует прекратить генерацию значений).

Р

 х <- 0 : 100 С <- 2 * х [ х ^ 2 > 3 ]           

Ракетка

( для/список ([ x 100 ] #:когда ( > ( * x x ) 3 )) ( * x 2 ))           

Пример с несколькими генераторами:

( for*/list ([ x ( в диапазоне 1 21 )] [ y ( в диапазоне 1 21 )] [ z ( в диапазоне 1 21 )] #:when ( = ( + ( * x x ) ( * y y )) ( * z z ))) ( список x y z ))                            

Раку

 мой  @s = ( $_ * 2  если  $_ ** 2 > 3  для  0 .. 99 );

Скала

Использование for-понимания:

val s = for ( x <- 0 to 100 ; if x * x > 3 ) yield 2 * x              

Схема

Списковые представления поддерживаются в Scheme с помощью библиотеки SRFI -42. [3]

( список-ec ( : x 100 ) ( если ( > ( * x x ) 3 )) ( * x 2 ))            

Пример понимания списка с использованием нескольких генераторов:

( список-ec ( : x 1 21 ) ( : y x ​​21 ) ( : z y 21 ) ( если ( = ( + ( * x x ) ( * y y )) ( * z z ))) ( список x y z ))                            

УСТАНОВИТЬ

s := {2*x : x в {0..100} | x**2 > 3 };

Smalltalk

(( 1  до:  100 ) выбрать: [ : x  |  x  в квадрате  >  3 ]) собрать: [ : x  |  x  *  2 ]

Визуальный Пролог

S = [  2 * X  ||  X = список::getMember_nd ( L ) , X * X > 3  ]

Ссылки

  1. ^ Модуль сахара Ним
  2. ^ Батарейки OCaml включены
  3. ^ Схема SRFI 42: Жадное понимание

Внешние ссылки