python中不按顺序传递默认参数与php的不同

  • 原创
  • 发布时间: 3个月前
  • 收藏数: 0 / 点赞数: 0 / 阅读数: 29

今天看到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不支持这一点。

评论