接上一篇文章:http://www.diannaoblog.com/python/14.html
默认参数:
在定义函数时我们可以给参数添加默认值,如果调用函数时没有传入参数,函数就会使用默认值,并且不会像必须参数那样报错。例如:
def default_value(name,age=18): print("我的名字是:",name) print("我今年:",age,"岁") default_value("零一")
执行结果如下:
我的名字是: 零一 我今年: 18 岁
但是要注意的是,默认参数必须定义在最后,而且在默认参数之后定义必须参数会报错。
def default_value(age=18,name): print("我的名字是:",name) print("我今年:",age,"岁") default_value(name="零一")
执行结果如下:
SyntaxError: non-default argument follows default argument
这一执行结果告诉我们非默认参数不能跟在默认参数后面。
def student_score(name,score=60,location="shanghai"): print("姓名:",name) print("成绩:",score) print("地区:",locattion) print("----传入所有参数----") student_score("电脑网络技术记录本",100,"Beijing") print("----不传最后一个参数----") student_score("小明",80) print("----不传成绩----") student_score("小红",location="Guangzhou") print("----只穿必须参数----") student_score("胖虎") print("----只传关键字参数----") student_score(name="元太")
执行结果如下:
----传入所有参数---- 姓名: 电脑网络技术记录本 成绩: 100 地区: Beijing ----不传最后一个参数---- 姓名: 小明 成绩: 80 地区: shanghai ----不传成绩---- 姓名: 小红 成绩: 60 地区: Guangzhou ----只穿必须参数---- 姓名: 胖虎 成绩: 60 地区: shanghai ----只传关键字参数---- 姓名: 元太 成绩: 60 地区: shanghai
通过以上例子我们可以发现,默认参数非常有用,它可以帮助我们少写不少代码。如果有许多地方调用函数,但是部分参数的数值又是相同的情况下,默认参数就非常有用了。
可变参数:
在某些情况下我们不能在定义函数的时候就确定参数的数量和内容,这时候就可以使用可变参数。可变参数和前面介绍的例子有些许不同,可变参数声明时不会命名。基本语法如下:
some_func(*args,**kwargs)
参数说明:
1,"some_func" 为函数名。
2,“*args” 和 “**kwargs” 为可变参数。
让我们先看一下 "*args" 会输出什么。
def foo(*args): print(args) foo() foo(1,2) foo("电脑网络技术记录本","shanghai",20)
执行结果如下:
() (1, 2) ('电脑网络技术记录本', 'shanghai', 20)
从例子中可以看到,“*args”参数获取到的是一个元组,这也正是它能作为可变参数的原因。
让我们再看下 “**kwargs”会输出什么。
def foo(**kwargs): print(kwargs) foo() foo(name="电脑网络技术记录本")
执行结果如下:
{} {'name': '电脑网络技术记录本'}
从例子中可以看到,“**kwargs” 参数获取到的是一个字典,所以我们再调用函数时也必须要使用关键字参数的方式来传递参数。
在日常使用中,“*args” 和 "**kwargs" 经常出现,用于解决一些未知的情况。
def calculate_sum(*args,**kwargs): s = 0 for i in args: s += i print("输入的数字之和是",s) for k,v in kwargs.items(): print(k,v) calculate_sum(1,2,3,4,5,姓名="零一")
执行结果如下:
输入的数字之和是 15 姓名 零一
正如上面的示例,我们在不知道有多少数字需要求和的情况下巧妙使用了可变参数来获取参数中所有数字的和。
不止在函数定义时可以使用“*”与 “**”来声明参数,在函数调用时我们可以使用相同的方式来传递位置的参数。
def exp(*args,**kwargs): print(args) print(kwargs) l = [1,2,3,4] d = {"参数1":"args", "参数2":"args2"} exp(*l,**d)
执行结果如下:
(1, 2, 3, 4) {'参数1': 'args', '参数2': 'args2'}
由此可以看到,无论时参数调用还是函数定义的参数都能以some_func(*args,**kwargs)的形式调用。