默认参数
引用的思想
函数/方法在定义时为形参赋值,对应的形参称为默认参数
默认参数是一个参数定义期的概念,与调用无关。
默认参数的作用
如果参数定义默认参数,在调用函数/方法时,未对该方法进行传值,则使用默认值作为该参数的值
默认参数定义格式
def 函数名(形参1 = 值1, . . .):
函数体
. . .
调用格式一(同普通参数,无特殊):
函数名(实参) 使用实参作为形参的值,不使用默认值
调用格式二
函数名() 使用默认值作为形参的值
def test(a=2, b=5):
print(a)
print(b)
test()
注意事项
-
默认参数的定义必须在位置参数的右侧(位置参数 必须在 默认参数 前面)
-
默认参数在调用传值时,按照位置参数进行对待,从左至右依次赋值,不能跳过左侧的某个参数,直接为后面的参数赋值。
默认参数的应用场景
减少函数/方法中大量反复的固定值的传参
为用户预留可操作的入口
关键字参数
函数/方法在调用时为指定名称的形参进行赋值,对应实参称关键字参数。
关键字参数是一个参数调用期的概念,与定义无关
关键字参数的作用
按照名称确认实参为指定的形参赋值
关键字参数格式混用
调用时 关键字在后写 位置参数在前面
不允许使用关键字参数对同一个形参进行多次赋值
关键字参数既可以为位置参数赋值,也可以为默认参数赋值。通常使用关键字参数解决默认参数选择性赋值问题
定义 def test1(位置参数,默认参数):
函数体
. . .
调用格式:
test1(位置参数,关键字参数)
可变参数:
函数/方法在定义时使用一个形参可以接收调用时传入的任意参数量的实参,对应的形参称为可变参数。
作用:
简化函数定义过程,定义可以接收无数个实参的形参
形参接受到的语法,无论数量多少,包装成一个元组对象
基本语法
def sum(*args)
print(args) # 元组
sum(1,2,3,4,5)
# 自动组包
参数格式混用三?
☞可变参数在一个函数中只能出现一次
def test(a, b, *args):
print(a)
print(b)
print(args)
test(1,2,3,4,5)
位置参数自动取值,可变参数可放最后
可变参数后 用关键字参数
def test(*args,c,d):
print(args)
print(c)
print(d)
test(1,2,3,c=4,d=5)
函数/方法的形参定义顺序(从左向右):
a,*args,x=1
函数/方法的形参调用传参顺序(从左向右):
1,2,3,4,5,x=2
函数/方法的调用规则:
-
位置参数根据位置和数量进行赋值
-
可变参数接收位置参数后默认参数前的所有值
-
默认参数如需传值使用关键字参数的形式写在可变参数的后面
参数格式混用
定义函数时各个参数的位置关系:
函数名(位置参数,可变参数,默认参数)
调用函数时:
位置参数通过对应位置传参
默认参数使用关键字参数指定名称传参
位置参数与默认参数之间的所有参数由关键字参数接收
可变参数在一个函数定义中只能出现一次
顺序 位置参数 默认参数 关键字参数 可变参数
字典参数
函数/方法在定义时,定义一个特殊的形参,用于接收未定义直接使用的关键字参数,对应的形参称为字典参数。
字典参数作用
简化函数定义过程,接收未定义直接使用的关键字参数
在多层级调用间进行关键字参数的逐级传递
未定义的关键字参数,无论数量多少,接收后包装成一个字典。
基本语法
定义:
# 定义:
def test(**kwargs):
print(kwargs) # 字典
# 调用:
test(a = 1,b = 2)
def test(**kwargs):
print(kwargs)
for key, value in kwargs.items():
print(key, value)
test(a=1,b=2)
参数格式混用?
位置,可变,默认,字典
位置 可变 关键 字典
所有容器都支持解包操作
函数/方法的形参定义顺序(从左向右?):
a, *args, x=1, **kwargs
函数/方法的形参调用传参顺序(从左向右?)
1, 2, 3, 4, 5, x=2, m=1, n=2
递归函数
概念 :函数/方法 在执行过程中出现了对自身函数/方法的调用,称该过程为递归调用,称该过程为递归调用,称这样的函数为递归函数
递归函数制作要点
1.函数体中具有对自身函数的调用
2.函数体中具有明确的函数执行结束判定条件
Python语言中函数调用最大级为1000层,超过该层级,程序将报错⚠
求1+2+3...+100
# 求1+2+3...+100
def sum(num):
# 设置结束标志 递归出口
if num == 1:
return 1
return sum(num-1)+num 递归点
print(sum(100))
使用递归求斐波那契数列第24位
# 使用递归求斐波那契数列第24位
def Feibo(n):
# 递归出口
if n == 1:
return 0
if n == 2:
return 1
#递归点
return Feibo(n-1) + Feibo(n-2)
print(Feibo(24))
# 非递归写法
i = 0
a = 0
b = 1
while i < 24:
print(a)
a, b = b, a + b
i += 1
使用递归求1到10的乘积
# 使用递归求1到10的乘积
def cj(n):
if n == 1:
return 1
return cj(n-1) * n
print(cj(10))
递归函数
递归函数的函数体中具有 自己 的调用
递归函数必须设置 明确执行结束体条件 方可结束执行
python语言中递归函数的最大级为1000层
匿名函数
匿名函数即没有名称的函数,在Python语言中,匿名函数是使用lambda 关键字定义的一个特殊表达式,也称为lambda表达式。
匿名函数基本语法
格式一:
定义: 函数名 = lambda 形参 : 返回值
调用: 结果 = 函数名(实参)
格式二:
定义并调用: 结果 = (lambda 形参 : 返回值)(实参)
匿名函数特殊语法
无参格式: 结果 = (lambda :返回值)()
多返回值格式: 无,可使用数据存储模型返回多个数据
无返回值格式: 无,必须有具体值或结果为None
无参数匿名函数
f1 = (lambda : 100) ( )
print(f1) # 返回 100
?不允许多返回值
无返回值◀不成立
如果函数没有返回值 调用时返回 None
数据存储模型
f4 = (lambda :[a for a in range(5)]) ( )
print(f4)
注意事项:
-
匿名函数可以无参数
-
匿名函数不存在无返回值的结果
-
匿名函数仅能返回单一值,不支持自动组包
4.可以通过返回数据存储模型代替多值
5.数据存储模型支持推导式
exit(?)