python开发学习day12 (函数参数;函数对象)
2020-06-16 目录:
一、函数的参数
1.1 第一组形参与实参
1.1.1 位置形参
1.1.2 位置实参
1.1.3 关键字实参
1.1.4 默认参数
1.2 第二组形参与实参(可变长参数)
1.2.1 形参中带*与**
1.2.2 实参中带*与**
1.3 形参与实参中混用*与**
二、函数对象
2.1 可以赋值
2.2 可以当做参数传给另一个函数
2.3 可以当做函数的返回值
2.4 可以当做容器类型的元素
一、函数的参数
1.1 第一组形参与实参
1.1.1 位置形参
位置形参:按照从左到右的顺序依次定义形参 # 特点:必须被传值,多一个不行少一个也不行
1.1.2 位置实参
位置实参:按照从左到右的顺序依次定义实参 # 特点:按照位置与形参一一对应
def func(x,y): print(x,y) func(1,2) # 将1赋值给x,将2赋值给y,一一对应
1.1.3 关键字实参
关键字实参:按照key=value的形式为指定的形参传值 # 特点:指名道姓为某个形参传值,可以完全打乱顺序 def func(x,y): print(x,y) func(y=1,x=2) 注意点:可以混用位置实参与关键字实参,但是 1、不能对同一个形参重复赋值 2、关键字实参必须放在位置实参后面,否则会报错
1.1.4 默认参数
具有默认值的形参,指的是在定义函数阶段就已经为参数赋值 # 特点:在调用函数阶段可以不用为默认参数传值 def func(x,y=2): print(x,y) func(1) # 默认y=2 func(1,222) # 如果y被再次传了值,那么本次调用以当前传的值为准 # 注意点:① 位置形参必须放在默认形参的前面 ② 默认形参的值是在函数定义阶段就被固定的,如果调用时没有为默认形参传值,那么不会每次调用都重新赋值
函数的调用彼此之间应该做到没有关联,所以说默认形参通常应该是不可变类型
1.2 第二组形参与实参(可变长参数)
可变长参数:可变长指的是在调用函数时,传入的实参个数不固定,而实参是为形参赋值的
所以对应着也应该有新的形参格式来负责接收不固定长度的实参
1.2.1 形参中带*与**
① *形参名:*会负责把溢出的位置实参存成元组然后赋值给后面的形参名,形参名通常使用args
def func(x, y, *z):
print(x, y, z)
func(1, 2, 3) # >>>1 2 (3,)
func(1, 2, 3, 4, 5) # >>>1 2 (3, 4, 5) 实参个数可以溢出,但是不能少于位置实参的个数,即*z可以不被赋值
②**形参名:**会负责把溢出的关键字实参存成字典然后赋值给后面的形参名,形参名通常使用kwargs def func(x, y, **z): print(x, y, z) func(1, 2, a=111, b=222, c=333) # >>>1 2 {'a': 111, 'b': 222, 'c': 333}
注意:*与**在形参中混用,整体的顺序从左到右应该是:位置形参,默认形参,*args,**kwargs
1.2.2 实参中带*与**
① 实参中带*号:
*号后跟的那个值应该是一个可以被for循环遍历的值,
*号会把后面的值打散成位置实参,如:
func(*(111,222,333)) 就相当于 func(111,222,333)
func(*"hello") 就相当于 func("h","e","l","l","o")
② 实参中带**: **后跟的那个值应该是一个字典 **会把后面的那个值打散成关键字实参,如:
func(**{"x": 111, "y": 222, }) 就相当于 func(y=222,x=111)
1.3 形参与实参中混用*与**
def func(*args, **kwargs): print(args, kwargs) func(1, 2, a=1, b=2) # >>>(1, 2) {'a': 1, 'b': 2} func((1, 2, 3), {'a': 1, 'b': 2}) # >>>((1, 2, 3), {'a': 1, 'b': 2}) {} func(*(1, 2, 3,), **{'a': 1, 'b': 2}) # >>>(1, 2, 3) {'a': 1, 'b': 2}
形参中带*与**是汇总操作
实参中带*与**是打散操作
了解级知识点:
def func(*args, y, **kwargs): print(args, y, kwargs) func(1, 2, y=3, a=1, b=2, c=3) # >>>(1, 2) 3 {'a': 1, 'b': 2, 'c': 3} 调用时y必须被赋值,否则会报错
二、函数对象
在python里,函数是第一类对象,简称函数对象
函数对象指的就是可以把函数当做变量一样去使用
2.1 可以赋值
def func(): print('from func') print(func) f=func # 函数名func所指向的的内存地址绑定给了f f() # f()也可以进行函数调用
2.2 可以当做参数传给另一个函数
def func(aaa): # aaa=函数foo的内存地址 print(aaa) aaa() # 只能在func()内调用aaa() def foo(): print('from foo') func(foo) # 将foo赋值给了变量aaa,那么aaa()也可以当做foo()使用来调用函数
2.3 可以当做函数的返回值
def func(aaa): # aaa=函数foo的内存地址 return aaa # 返回的是函数foo的内存地址 def foo(): print('from foo') res=func(foo) # 将foo赋值给aaa print(res) res() # 相当于foo()
2.4 可以当做容器类型的元素
def foo(): print('from foo') l=[foo] print(l) l[0]() # 即 foo()