今天看到python的函數(shù)部分,發(fā)現(xiàn)python的函數(shù)有一個(gè)很實(shí)用的特性:支持函數(shù)調(diào)用方不按順序提供部分默認(rèn)參數(shù)。
一般的帶可選參數(shù)的函數(shù)和調(diào)用如下:
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)) #第二個(gè)可選參數(shù)可以不帶
但是如果有多個(gè)可選參數(shù),且函數(shù)調(diào)用方不想按順序提供可選參數(shù)的值,或者不按順序只提供部分可選參數(shù)的值,怎么辦?
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函數(shù)有兩個(gè)可選參數(shù),順序依次是age、city,當(dāng)調(diào)用方不想提供age,只想傳city過來時(shí),python能做到嗎?答案是肯定的,我們允許如上demo得到結(jié)果:
E:\python_study>python 1.py
('name:', 'minp')
('gender:', 'male')
('age:', 6)
('city:', 'shanghai')
感覺python確實(shí)很靈活很方便,萬能的php都做不到這一點(diǎn):
<?php
function getnums($a, $b=1,$c=4){
return $a + $b + $c;
}
$res = getnums(1, $c=2);
var_dump($res);
運(yùn)行結(jié)果為:
D:\Program Files (x86)\360\skylar6\php>php 1.php
int(7) #注意結(jié)果不是我們期待的4,說明php不支持函數(shù)調(diào)用方不按順序提供部分默認(rèn)參數(shù)的做法。
說明:當(dāng)我想提供部分默認(rèn)參數(shù)的值,且不是按順序提供的話,php是不支持的。
上面例子中,getnums函數(shù)的兩個(gè)默認(rèn)參數(shù)的順序是$b, $c,但是如果函數(shù)調(diào)用方不想提供$b, 而只想提供$c的時(shí)候,php解析器依然把提供的參數(shù)$c=4賦值給了排在前面的默認(rèn)參數(shù)$b,導(dǎo)致了錯(cuò)誤結(jié)果7而不是4.
結(jié)論:python支持這種函數(shù)調(diào)用方不按順序提供部分可選參數(shù)的做法,php不支持這一點(diǎn)。
參考:
函數(shù)的參數(shù)