我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文来个大对比,看看主流编程语言中,从函数内获得所有实参的可能性。本次参与编程语言大对比的语言是:phppython、还有nodejs。参与对比的需求是:面对未知的实参个数,在函数定义内部获得所有被传递进来的实参的方式方法。

苏南大叔:主流编程语言,获得目标函数所有未知实参方式对比 - 获得实参的方法
主流编程语言,获得目标函数所有未知实参方式对比(图3-1)

大家好,这里是苏南大叔的平行空间笔记本博客,这里记录苏南大叔和计算机代码的故事。本文做个主流编程语言对比,获得所有实参的方法。测试环境:win10php@7.4.29ntspython@3.6.8nodejs@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编程语言

参考文章:

苏南大叔:主流编程语言,获得目标函数所有未知实参方式对比 - 获得实参的方法python代码
主流编程语言,获得目标函数所有未知实参方式对比(图3-2)

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编程语言

鉴于nodejavascript的亲戚性,这里就不多说了。本段代码,其实也可以在浏览器环境里面运行。
情况一:

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("苏南","大叔");

苏南大叔:主流编程语言,获得目标函数所有未知实参方式对比 - arguments
主流编程语言,获得目标函数所有未知实参方式对比(图3-3)

表格对比

编程语言获得所有实参获得剩余实参说明
phpfunc_get_args()...$args形参$d=""中的$d暂时没用
python*args,**kwargs形参$d=""**kwargs捕获
node/js...args形参d=""中的d暂时没用
node/jsarguments个别情况下,arguments变量符合要求

总结

更多相关经验文章:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php    python