今天看到python的函数部分,发现python的函数有一个很实用的特性:支持函数调用方不按顺序提供部分默认参数。
一般的带可选参数的函数和调用如下:
def power(x, n=2):
if not isinstance(x, (int, float)):
raise TypeError('input param type error, must be a int or float')
res = 1
while n > 0:
res = res * x
n -= 1
return res
print(power(3,2))
print(power(5)) #第二个可选参数可以不带
但是如果有多个可选参数,且函数调用方不想按顺序提供可选参数的值,或者不按顺序只提供部分可选参数的值,怎么办?
def stuinfo(name, gender, age=6, city='Beijing'):
print('name:', name)
print('gender:', gender)
print('age:', age)
print('city:', city)
stuinfo('minp', 'male', city='shanghai')
stuinfo函数有两个可选参数,顺序依次是age、city,当调用方不想提供age,只想传city过来时,python能做到吗?答案是肯定的,我们允许如上demo得到结果:
E:\python_study>python 1.py
('name:', 'minp')
('gender:', 'male')
('age:', 6)
('city:', 'shanghai')
感觉python确实很灵活很方便,万能的php都做不到这一点:
<?php
function getnums($a, $b=1,$c=4){
return $a + $b + $c;
}
$res = getnums(1, $c=2);
var_dump($res);
运行结果为:
D:\Program Files (x86)\360\skylar6\php>php 1.php
int(7) #注意结果不是我们期待的4,说明php不支持函数调用方不按顺序提供部分默认参数的做法。
说明:当我想提供部分默认参数的值,且不是按顺序提供的话,php是不支持的。
上面例子中,getnums函数的两个默认参数的顺序是$b, $c,但是如果函数调用方不想提供$b, 而只想提供$c的时候,php解析器依然把提供的参数$c=4赋值给了排在前面的默认参数$b,导致了错误结果7而不是4.
结论:python支持这种函数调用方不按顺序提供部分可选参数的做法,php不支持这一点。
参考:
函数的参数
网友评论