主流编程语言,获得目标函数所有未知实参方式对比
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
本文来个大对比,看看主流编程语言中,从函数内获得所有实参的可能性。本次参与编程语言大对比的语言是: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')
None
python
代码里面,目前使用*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 变量符合要求 |
总结
更多相关经验文章:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。