4.1可变参数
形参个数不明确时,可以吧形参设置为可变参数
格式:
def 函数名 (*形参名) 方法体 return 结果 调用:函数名(实参,实参,...) 可变的形参变量被当做元组存放
4.2关键字参数
关键字参数就是调用函数的时候允许调用者传入0个或多个带有形参名的字段数据
当声明函数时,不知道调用者具体传递的字段和其对应的数据,这个时候就把这个变量声明成关键字参数
声明方式:
def 函数名(形参1,形参2,**变量名): 方法体 return 结果 **变量名在函数体中被当做字典存在 变量名 = 数据 def accept_data(name, email, **kwargs): print(name,email,kwargs) accept_data("小沐", "[email protected]", city="北京", sex="女") 输出:小沐 [email protected] {'city': '北京', 'sex': '女'}
4.3匿名函数
快捷生成一个简易函数的方式
格式:
def add(a, b): return a+b 可以使用匿名函数完成 f = lambda 形参1,形参2,...:执行语句(一般只有一条)
4.4偏函数
在某些场景下,一些场景的默认需求不能满足场景,为了便于函数的使用,在原函数的基础上,修改默认参数来满足需求
1.自定义函数,在函数内部调用原函数并修改原函数的功能
def my_print(src): print(src, end="!") my_print("abc") 输出为:abc!2.系统提供的生成偏函数的方式
import functools a = functools.partial(print,end=“!”) #此时a()具有print()方法的功能,且结束符为“!” a("asd") 输出为:asd!
4.5闭包
一个函数内有另外一个函数的声明
def out(): 外部函数体 def in(): 内部函数体内部函数只能在外部函数体重中直接调用,在函数外部不可以直接调用内部函数
def out(): print("1") def inin(): print("2") print("3") return inin a = out() a() 输出: 1 3 2 内部函数在不被调用时不会执行 在调用外部函数时把内部函数当做返回值返回,才可以在函数外部调用内部函数当内部函数要对外部函数变量进行修改时,用nonlocal修饰
装饰器:
特殊的闭包:外部函数的返回值是内部函数作用:在不改变原有功能A的基础上,调用A并增加新的功能格式:
def out(参数1): #参数:接收要添加新功能的函数 外部函数体 def inin(*value,**kwargs):#参数,外部函数接收的函数需要的参数 内部函数体 res = 参数1(*value,**kwargs) return inin @out() #此时外部函数已经被调用 def my():def out_add(add1): print("0") def in_add,输出1,并返回2+4(num1, num2): print("1") sum = add1(num1, num2) return sum return in_add @out_add # 此时,my_add被当做参数传给out_add,执行out_add()函数,并返回内部函数in_add, #之后在调用my_add()时,实际上是调用的in_add(), def my_add(a, b): return a+ b print("2") print(my_add(2,4)) print(my_add(3,4)) 输出: 0 #py文件从上往下顺序执行,先执行到@out_add,执行外部函数输出1,这时内部函数并没有被调用 2 #继续向下执行输出2 1 #第一次调用my_add,实际上调用内部函数in_add,输出1,并返回2+4 6 1 7 当为一个函数添加装饰器时,装饰器对应的外部函数只会被执行一次。@外部函数的时候执行的