参数传递
- 传不可变对象 & 传可变对象
-
def func(b):print(id(a), a) #140737041872600 234print(id(b), b) #140737041872600 234a = 234 func(a)def func(b):print(id(a), a) #1413554098560 [343]print(id(b), b) #1413554098560 [343]a = [343] func(a)def func(b):b.append(444)print(b)#[343, 444]a = [343] func(a) print(a)#[343, 444]
必须参数
- 必须接受一个实参
- 实参通常可以传位置参数,也可以传关键字参数
关键字参数
-
实参按照关键字传给对应的形参,与位置无关
-
关键字参数必须放在位置参数后面
默认参数
- 没有传实参时,使用默认值
不定长参数
- *args:接受[0, 正无穷)个位置参数,将其打包为一个元组
- **kwargs:接受[0, 正无穷)个关键字参数,将其打包为一个字典,必须放在所有形参的最后。
-
def func(a, b, *c, d=999, **k):print(a)print(b)print(c)print(d)print(k)func(1,2,3,4,5,6,6,6,) ''' 输出结果: 1 2 (3, 4, 5, 6, 6, 6) 999 {} '''
def func(a, b, *c, d=999, **k):print(a)print(b)print(c)print(d)print(k)func(1, 2, 3, 4, 5, 6, 6, 6, x=23, y=['🐱🐕']) ''' 输出结果: 1 2 (3, 4, 5, 6, 6, 6) 999 {'x': 23, 'y': ['🐱🐕']} '''
特殊参数
-
默认情况下,实参的传递形式可以是位置参数或关键字参数
-
可以用 / 和 * 来限制参数的传递形式
-
其中 / 为仅限位置参数,限制在参数的传递形式
-
其中* 为仅限关键字参数,限制在它之后的形参只能接受关键字参数
-
这两个特殊参数只是为了限制参数的传递形式,不需要为它们传入实参
def func(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):passfunc(1, 2, 3, kwd1=4, kwd2=5)
匿名函数
- 格式:lambda[arg1,...]:expression
- 匿名函数的参数可以有多个,但后面的expression只能有一个
- 匿名函数返回值就是expression的结果,而不需要return语句
- 匿名函数可以在需要函数对象的任何地方使用