将值数组作为函数参数的Python/Ruby语言结构命名

21 投票
7 回答
7249 浏览
提问于 2025-04-15 12:58

这个语言结构叫什么?

在Python中,我可以这样写:

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

然后得到9。同样在Ruby中:

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

这是什么叫法,当你把一个数组传给一个本来需要多个参数的函数时?

这个*符号叫什么?

还有哪些其他语言也支持这个很酷的功能?

7 个回答

5

这个术语通常叫做“对列表应用一个函数”,或者简短地说“应用”。

可以查看这个链接了解更多信息:http://en.wikipedia.org/wiki/Apply

这个概念从1960年左右的LISP语言开始就存在了。很高兴Python也重新发现了它 :-}

应用通常是针对一个列表或者类似列表的东西,比如数组。不过,我们也可以把函数应用到来自其他地方的参数,比如结构体。我们的PARLANSE语言有固定的数据类型(比如整数、浮点数、字符串等)和结构体。

有趣的是,函数的参数列表看起来很像结构体的定义,而在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看起来像LISP,但其实不是。

10

在Ruby编程语言中,这个符号通常被称为“splat”。

在Ruby中,你可以用它来表示“列表中的所有其他元素”。

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

它也可以出现在赋值符号的两边:

a  = d, *e

在这种用法中,它有点像Scheme语言中的cdr,不过它不一定要是列表的头部以外的所有元素。

29

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)

这样可以把所有参数打包成一个任意大小的列表。

撰写回答