Назовите эту конструкцию языка Python / Ruby (используя значения массива для удовлетворения параметров функции) - PullRequest
20 голосов
/ 17 июля 2009

Как называется эта языковая конструкция?

В Python я могу сказать:

def a(b,c): return b+c
a(*[4,5])

и получите 9. Аналогично в Ruby:

def a(b,c) b+c end
a(*[4,5])

Как это называется, когда передается один массив функции, которая в противном случае требует нескольких аргументов?

Как называется оператор *?

Какие другие языки поддерживают эту замечательную функцию?

Ответы [ 7 ]

28 голосов
/ 17 июля 2009

Документы Python называют это Распаковка списков аргументов . Это довольно удобная функция. В Python вы также можете использовать двойную звездочку (**), чтобы распаковать словарь (хэш) в аргументы ключевых слов. Они также работают в обратном порядке. Я могу определить функцию следующим образом:

def sum(*args):
    result = 0
    for a in args:
        result += a
    return result

sum(1,2)
sum(9,5,7,8)
sum(1.7,2.3,8.9,3.4)

Чтобы упаковать все аргументы в список произвольного размера.

10 голосов
/ 17 июля 2009

В рубине его часто называют "сплат".

Также в ruby ​​вы можете использовать его для обозначения «всех других элементов в списке».

a, *rest = [1,2,3,4,5,6]
a     # => 1
rest  # => [2, 3, 4, 5, 6]

Может также отображаться с любой стороны от оператора присваивания:

a  = d, *e

В этом случае это немного похоже на cdr схемы, хотя это не обязательно должен быть только заголовок списка.

5 голосов
/ 17 июля 2009

Типичная терминология для этого называется «применение функции к списку», или «подать заявку» для краткости.

См. http://en.wikipedia.org/wiki/Apply

Он был в LISP с момента своего появления в 1960 году, что странно. Рад, что питон заново открыл его: -}

Apply обычно находится в списке или в виде списка, такого как массив. Однако можно применять функции к аргументам, которые приходят из других мест, таких как структуры. Наш ПАРЛАНСКИЙ язык имеет фиксированные типы (int, float, string, ...) и структуры. Как ни странно, список аргументов функции очень похож на структуру определение, и в PARLANSE, это является определение структуры, и вы можете «применить» функцию PARLANSE к совместимой структуре. Вы также можете «создавать» экземпляры структуры:


 (define S
    (structure [t integer]
               [f float]
               [b (array boolean 1 3)]
    )structure
 )define s

  (= A (array boolean 1 3 ~f ~F ~f))

  (= s (make S -3 19.2 (make (array boolean 1 3) ~f ~t ~f))


  (define foo (function string S) ...)

  (foo +17 3e-2 A) ; standard function call

  (foo s) ; here's the "apply"

PARLANSE выглядит как гул, но это не так.

3 голосов
/ 17 июля 2009

Ruby называет это splat , хотя Дэвид Блэк также придумал аккуратный оператор unar {, ra} y (то есть унарный оператор unarray )

2 голосов
/ 18 июля 2009

У Haskell тоже (для пар), с функцией uncurry:

ghci> let f x y = 2*x + y
f :: (Num a) => a -> a -> a
ghci> f 1 2
4
ghci> f 10 3
23
ghci> uncurry f (1,2)
4
ghci> uncurry f (10,3)
23

Вы также можете превратить его в оператора, так что он будет более похож на сплат:

ghci> f `uncurry` (1,2)
4
ghci> let (***) = uncurry
(***) :: (a -> b -> c) -> (a, b) -> c
ghci> f *** (10,3)
23

И хотя было бы легко определить аналогичные функции для случаев с 3-кортежем, 4-кортежем и т. Д., Не существует какой-либо общей функции для n -тупов (например, сплат работает в других языках) из-за Строгий набор текста на Хаскеле.

2 голосов
/ 17 июля 2009

Я называю это «расширением списка», но я не думаю, что это стандартная терминология (я не думаю, что она есть ...). Lisp во всех версиях (включая Scheme), а также Haskell и другие функциональные языки могут сделать это достаточно легко, но я не думаю, что это легко сделать на «основных» языках (возможно, вы можете выполнить это как «рефлексию») в некоторых! -).

1 голос
/ 17 июля 2009

На большинство вопросов уже дан ответ, но что касается вопроса «Как зовут * оператора?»: Технический термин «звездочка» (происходит от латинского слова звездочка, что означает «маленькая звезда», что, в свою очередь, происходит от греческого ἀστερίσκος ). Однако часто его называют «звездой» или, как указано выше, «сплатом».

...