将值数组作为函数参数的Python/Ruby语言结构命名
这个语言结构叫什么?
在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)
这样可以把所有参数打包成一个任意大小的列表。