主流编程语言,获得目标函数所有未知实参方式对比
发布于 作者:苏南大叔 来源:程序如此灵动~
本文来个大对比,看看主流编程语言中,从函数内获得所有实参的可能性。本次参与编程语言大对比的语言是:php、python、还有nodejs。参与对比的需求是:面对未知的实参个数,在函数定义内部获得所有被传递进来的实参的方式方法。
大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文做个主流编程语言对比,获得所有实参的方法。测试环境:win10,php@7.4.29nts,python@3.6.8,nodejs@16.14.2。
形参和实参
| 名称 | 英文 | 说明 |
|---|---|---|
| 形参 | parameter | 函数定义的时候,在定义里面的参数叫做形参,形式上的参数。 |
| 实参 | argument | 函数调用的时候,真实传递到参数位置上的变量叫做实参,实际上的参数。 |
举例来说:function go(location)和go("北京"),形参是location,实参是北京。
php编程语言
参考文章:
function test(){
var_dump(func_num_args());
var_dump(func_get_args());
var_dump(func_get_arg(0));
}
test("a","b","c",$d="dd","e");输出:
int(5)
array(5) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
[3]=>
string(2) "dd"
[4]=>
string(1) "e"
}
string(1) "a"- 可以使用
func_get_args()获得所有的实参。 - 可以使用
...$args获得剩余的所有实参。
| 区别 | 获取方式 |
|---|---|
| 所有实参 | func_get_args() |
| 剩余实参 | ...$args |
| 形参 $arg = "" | 不支持识别“$arg” |
function test($a,$b="",...$args){
var_dump(func_num_args());
var_dump(func_get_arg(0));
var_dump(func_get_args());
var_dump($a,$args,$b);
}
test("a","b","c",$d="dd","e");python编程语言
参考文章:
def test(aa,*args,**kwargs):
print(args,args[0]) # ('b', 'c') b
print(kwargs,kwargs["a2"]) # {'a2': 'a2'} a2
test("a","b","c",a2="a2")
print(test.__code__.co_argcount) # 1
print(test.__code__.co_varnames) # ('aa', 'args', 'kwargs')输出:
('b', 'c') b
{'a2': 'a2'} a2
1
('aa', 'args', 'kwargs')
Nonepython代码里面,目前使用*args和**kwargs可以获得所有剩余实参,通过.__code__.co_argcount和.__code__.co_varnames,获得是形参的相关情况,而不是实参。
node编程语言
鉴于node和javascript的亲戚性,这里就不多说了。本段代码,其实也可以在浏览器环境里面运行。
情况一:
function test(a,...args){
console.log(args,args[0])
}
test("a","b","c",d="dd","e");输出:
[ 'b', 'c', 'dd', 'e' ] b情况二: 也可以直接写...args:
const test = function (...args) {
console.log(...args, args[0], args[1]);
}
test("sunan", "苏南", { "苏南大叔": "wonderful" });输出:
sunan 苏南 { '苏南大叔': 'wonderful' } sunan 苏南情况三: 其实还有更加强大的方式,代码如下:
function test() {
console.log(arguments,arguments[0]);
}
test(1, 2, 3);直接就存在一个特殊类型的arguments变量,输出如下:
[Arguments] { '0': 1, '1': 2, '2': 3 }
1这个类型是非常特殊啊,在js里面,数组也是特殊的object,这里又输出一个特殊的[Arguments]字样。
情况三特例: 这个arguments个别情况下也不符合要求,这个和函数的定义方式有关。
const test = () => {
console.log(arguments);
}
test("苏南","大叔");
function test2() {
console.log(arguments,arguments[0]);
}
test2("苏南","大叔");表格对比
| 编程语言 | 获得所有实参 | 获得剩余实参 | 说明 |
|---|---|---|---|
| php | func_get_args() | ...$args | 形参$d=""中的$d暂时没用 |
| python | *args,**kwargs | 形参$d=""由**kwargs捕获 | |
| node/js | ...args | 形参d=""中的d暂时没用 | |
| node/js | arguments | 个别情况下,arguments变量符合要求 |
总结
更多相关经验文章:


