示例:
# 此示例示意如何定义函数的缺省参数 def info(name, age=1, address="不详"): print(name, '今年', age,'岁,家庭住址:', address) info("魏明择", 35, "北京市朝阳区") info("Tarena", 15) info("张飞") # info() # 出错说明:
缺省参数必须自右至左一次存在,如果一个参数有缺省参数,则其右侧的所有参数必须有缺省参数 缺省参数可以有0个、一个或多个,甚至全部都有缺省参数例子:
def fn(a,b=10,c): #错误 pass def fn(a=0,b=None,c=False): #正确 pass 函数的可变实参和不可变实参的传递示例:
# 在函数内部对变量赋值是在函数内部创建新的局部变量 # 此赋值语句不会改变外部变量的绑定关系 L = [1, 2, 3] def f1(L): L = [4, 5, 6] # 赋值语句的作用是创建和或改变变量的绑定关系 print(L) # [4, 5, 6] f1(L) print(L) # [1, 2, 3] L = [1, 2, 3] def f1(L): # L = [4, 5, 6] # 赋值语句的作用是创建和或改变变量的绑定关系 L.append("ABC") print(L) # [1, 2, 3, "ABC"] f1(L) print(L) # [1, 2, 3, "ABC"]说明:
当一个可变通过函数实参传入函数内时,在函数内可以通过局部变量来操作可变对象(列表,字典,集合...)面试题:
#运行以下程序的结果是什么?为什么? L = [1,2] def fn(a,lst=[]) lst.append(a) print(lst) fn(3,L) #[1,2,3] fn(4,L) #[1,2,3,4] ##################### fn(5) #[5] fn(6) #[5,6] fn(7) #[5,6,7] 函数形参的定义方式位置形参
星号元组形参
命名关键字形参
双星号字典形参
位置形参语法:
def 函数名(形参变量1,形参变量2,....): 语句块 星号元组形参语法:
def 函数名(*元组形参名): 语句块作用:
收集多余的位置传参说明:
元组形参名一般命名为'args' *元组形参一个函数只能有一个示例:
# 此示例示意星号元组形参 def func(*args): print("实参的个数是:", len(args)) print("args=", args) func() # 无参 func(1,2,3,4) func(1, 2, 3, 4, 5, 6, 7, 8) s = "ABCDE" func(*s) # 等同于func('A', 'B', ....) func(a=100, b=200) # 出错 命名关键字形参语法:
def 函数名(*,命名关键字形参1,命名关键字形参2,....): 语句块 或 def 函数名(*args,命名关键字形参1,命名关键字形参2,....): 语句块作用:
强制所有的命名关键字形参都必须用关键字传参或字典关键字传参示例:
# 此示例示意命名关键字形参 def func(a, b, *, c, d): print(a, b, c, d) # func(1, 2, 3, 4) # 传参失败 func(1, 2, c=30, d=40) func(a=10, b=20, c=30, d=40) func(1, 2, **{'d':400, 'c':300}) 双星号字典形参语法:
def 函数名(**字典形参名): 语句块作用:
收集多余的关键字传参示例:
# 此示例示意双星号字典形参 def func(**kwargs): print("关键字传参的个数是:", len(kwargs)) print('kwargs=', kwargs) func(name="隔壁老王", age=35, address="朝阳区") def func(*,a, b, **kwargs): print("关键字传参的个数是:", len(kwargs)) print('kwargs=', kwargs) func(a=1, b=2, c=3, d=4)说明:
字典形参名一般命名为:'kwargs' 一个函数内字典形参最多只有一个 函数的形参说明:位置形参,缺省参数,星号元组形参,双星号字典形参可以混合使用
函数形参自左至右的定义顺序为:
位置形参
星号元组形参
命名关键字形参
双星号字典形参
示例:
def fn(a, b, *args, c, **kwargs): pass fn(1, 2, 3, 4, c=30, d=40, e=50) 函数的不定长参数星号元组形参
双星号字典形参
用不定长参数可以接收任意的传参
如:
def fn(*args,**kwargs): print(*args,**kwargs)