1. 默认参数
1.1默认参数概念
默认参数指函数/方法在定义时为形参赋值,对应的形参称为默认参数。
默认参数是一个参数定义期的概念,与调用无关。
1.2默认参数作用
如果参数定义默认参数,在调用函数方法时,未对该参数进行传值,则使用默认值作为该参数的值。
1.3默认参数基本语法
定义格式:
def 函数名(形参1 = 值1,…):
函数体
……
调用格式一(同普通参数,无特殊):
函数名(实参) 使用实参作为形参的值,不使用默认值
调用格式二:
函数名() 使用默认值作为形参的值
def test(a,b=100):
pass
test(5)
1.4注意事项
1.默认参数的定义必须在位置参数的右侧
def test(b=100,a): # 位置参数在默认参数右边,报错
pass
2.默认参数在调用传值时,按照位置参数进行对待,从左至右依次赋值,不能跳过左侧的某个参数直接为后面的参数赋值
def test(a,b=100,c=5):
pass
test(5,6,7)
2. 关键字参数
2.1关键字参数概念
2.2关键字参数作用
按名称确认实参为指定的形参赋值,调用函数时使用。
2.3关键字参数基本语法
定义格式(同普通参数定义,无特殊):
def 函数名(形参 ,…):
函数体
调用格式: 函数名( 形参名 = 实参)
def test(a=5,b=100):
pass
test(b=7)
# a=5 b=7
2.4注意事项
1.关键字参数必须出现在位置参数的后面
2.不允许使用关键字参数对同一个形参进行多次赋值
3.关键字参数既可以为位置参数赋值,也可以为默认参数赋值。通常使用关键字参数解决默认参数选择性赋值问题。
3. 可变参数
3.1可变参数概念
3.2可变参数作用
3.3可变参数基本语法
定义格式
def 函数名(*args ,…):
函数体
调用格式(同普通参数,无特殊):函数名( 实参1,…… )
def sum(*args):
sums = 0
for num in args:
sums += num
print(sums)
sum(1,2,3,4,5)
3.4注意事项
def test( a , b , *args , c = 1 ):
pass
4. 字典参数
4.1字典参数概念
函数/方法在定义时,定义一个特殊的形参,用于接收未定义直接使用的关键字参数,对应的形参称为字典参数。
4.2字典参数作用
4.3字典参数基本语法
定义格式:
def 函数名(**kwargs ,…):
函数体
调用格式: 函数名( 未定义的变量名1 = 实参1,未定义的变量名2 = 实参2,…… )
def test(**kwargs):
test(a=1,b=2)
def test(m,**kwargs):
print(m)
print(kwargs)
test(x=1,y=2,m=1)
# 输出 1
# {'x': 1, 'y': 2}
4.4注意事项
1.字典参数在一个函数/方法定义中只能出现一个。
2.定义函数的参数时,先定义位置参数,再定义可变参数,然后定义默认参数,最后定义字典参数
def test( a , b , *args , c = 1 ,**kwargs):
pass test(1,2)# 输出 a = 1 b = 2
args = ()
c = 1
kwargs = {}
test(1,2,c=5)# 输出 a = 1 b = 2 args = () c = 3 kwargs = {}
test(1, 2, 3, 'a', 'b') # 输出 a = 1 b = 2 args = (3, 'a', 'b') c = 0 kwargs = {}
test(1, 2, 3, 'a', 'b', x=55)
# 输出 a = 1 b = 2 args = (3, 'a', 'b') c = 0 kwargs = {'x':55}
3.对于任意函数,都可以通过类似func(*args, **kwargs)
的形式调用它,无论它的参数是如何定义的。
使用*args
和**kwargs
是Python的习惯写法,当然也可以用其他参数名。
*args
是可变参数,*args
接收的是一个tuple
;
**kwargs
是关键字参数,**kwargs
接收的是一个dict
。
4.5其他
所有的容器都支持解包操作。
def test(a, b, c):
print(a, b, c)
list1 = [1, 2, 3]
dict1 ={'a': 1, 'b': 2, 'c': 3}
test(*list1) # 1 2 3
test(**dict1) # 1 2 3
如果要强制传入的参数为关键字参数,之后的参数必须以关键字参数的形式传递,称之为参数槽。以一个*
表示。参数槽通常和默认参数搭配使用。
def test(a, b, *, x, y):
print(a, b)
print(x, y) # TypeError: test() takes 2 positional arguments but 4 were given
test(1, 2, x=3, y=4) # 输出 1 2 3 4
5. 递归函数
5.1递归函数概念
函数/方法在执行过程中出现了对自身函数/方法的调用,称该过程为递归调用,称这样的函数为递归函数。
5.2递归函数基本语法
同普通函数
5.3递归函数定义要求
1.函数体中具有对自身函数的调用
2.函数体中具有明确的函数执行结束判定条件
"""使用递归的方法打印出前n个斐波那契数列1,1,2,3,5,8,13...."""
def fb(n):
if n == 1 or n == 2:
return 1
return fb(n - 1) + fb(n - 2)
s = fb(4)
print(s)
5.4递归函数调用要求
Python语言中函数调用最大层级为1000层,超过该层级,程序将报错,递归的效率很低,实际开发很少用。
# 如果需要设置递归深度,可以使用sys模块中的setrecursionlimit()函数修改默认的最大深度限制。
import sys
sys.setrecursionlimit(2000)
6. 匿名函数
6.1匿名函数概念
匿名函数即没有名称的函数,在python语言中,匿名函数是使用lambda
关键字定义的一个特殊表达式,也称为lambda
表达式。
6.2匿名函数基本语法
# 格式一:
# 定义: 函数名 = lambda 形参 : 返回值
# 调用: 结果 = 函数名(实参)
add = lambda a,b : a + b
c = (2,3)
# 格式二:
# 定义并调用: #结果 = (lambda 形参 : 返回值)(实参)
c=(lambda a,b : a + b)(2,3)
6.3匿名函数特殊语法
无参格式:
结果 = (lambda :返回值)()
f1 = (lambda : 100)()
多返回值格式:可使用数据存储模型返回多个数据
f2, f3 = (lambda: (3, 4))()
print(f2)
print(f3)
f4 = (lambda: [a ** 2 for a in range(5) if a % 2 == 0])()
print(f4) #输出 [0, 4, 16]
无返回值格式:必须有具体值或结果为None
x = (lambda: (print("hello"), print("python")))()print(x)