上一篇我们主要描述了函数的一些基本语法,查看上篇请点击这里本篇侧重于描述函数各种参数形式的使用,废话不多说,开始!
一、不定长参数
不定长参数就是函数传入的参数个数不固定,能够提升函数的稳定性,用*args来表示,以元组形式去接收。如:
def func(*args):
print(args)
func(1,2,3,4,5,6,7,8,9,10)
输出结果为:(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
也可以搭配固定参数来使用,如:
def func(a,b,*args):
print(a)
print(b)
print(a*b)
print('*'*50)
multi = a * b
for i in args:
multi *= i
return multi
输出结果为:
1
2
(4, 5, 6)
**************************************************
240
二、关键字参数
不确定参数接收,必须是【关键字+值】, 形态是字典。如:
def func(**kwargs):
print(**kwargs)
for key in kwargs:
print(key,kwargs[key])
func(x=1,y=2,z=3)
输出结果为:
{‘x’: 1, ‘y’: 2, ‘z’: 3}
x 1
y 2
z 3
由上可以确定**kwargs形态是字典。
注意
1、*和***同时使用时,*要排在**的前面。
2、实参为*args时,函数参数前面要加*
3、实参为**kwargs时,函数参数前面要加**
如:
1、
def func(*args,**kwargs):
print(args,kwargs)
2、
def func(a,b,c,d):
print(a,b,c,d)
l = [1,2,3,4]
func(*l)
输出为:1,2,3,4
3、
def func(**kwargs):
print(kwargs)
dic = {'name':'xxx','age':'12'}
func(**dic)
输出为:{‘name’: ‘xxx’, ‘age’: ‘12’}
三、可变参数和不可变参数
3.1 不可变参数
顾名思义,不可变参数就是参数类型不可变,主要有元组、字符串、整型。不可变参数不会影响参数本身,如:
def cInt(a):
a = 10
b = 2
cInt(b)
print(b)
输出为:2
3.2 可变参数
可变参数就是参数类型可变,主要有列表、集合和字典。可变参数会影响到参数本身。如:
def change_list(l):
l.append(888)
print("函数内的列表:", l)
l = [1,2,3,4,5]
change_list(l)
print("函数外的列表:", l)
输出结果为:
[1,2,3,4,5,888]
[1,2,3,4,5,888]
四、匿名函数
关键字lambda
匿名函数比def定义的函数要简单的多,在大多情况下作为参数使用,如排序算法等。
4.1 普通定义
add = lambda a,b:a+b
print(add(1,2))
输出:3
4.2 直接使用
(lambda x,y:x+y)(1,2)
输出:3
4.3 带有默认参数
add = lambda a=20, b=30:a+b
print(add())
输出:50
4.4 无参数
a = 20
b = 30
c = lambda:a+b
print(c())
输出:50
五、递归函数
递归函数是在函数中自己调用自己,如计算阶乘可以这样定义一个递归函数
def fact(n):
if n == 1:
return 1
return n*fact(n-1)
优缺点
优缺点 | 描述 |
---|---|
优点 | 定义简单,逻辑清晰 |
缺点 | 调用深度过深时会极大的占用计算机资源 |
注意
使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出