一,函数的定义与调用
定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":"。
def 是固定的,不能变,必须是连续的def三个字母,不能分开
def 函数名(参数): """注释:函数功能和参数说明""" 函数体 …… return 返回值
调用:函数名+()
函数的返回值:return+返回值 ,结束函数
return不带返回值相当于None
无返回值,返回一个值,返回多个值
二,函数的参数
三,函数对象
函数是第一类对象,即函数可以当做数据传递
1,可以被引用
2,可以当做参数被传递
def func(): print('func') def func2(f): print(f) f() print('func2')
3,返回值可以是函数
def func(): print('func') def func2(f): print('func2') return f fu = func2(func)
4,可以当做容器类型的元素
四,函数的嵌套
为了保护内部函数,确定内部函数只能在外部函数中被调用
def animal(): def tiger(): print('bark') print('eat') tiger() # animal()
函数名的本质:就是一个变量,保存了函数所在的内存地址
五,作用域
作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域
全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效
局部作用域:局部名称空间,只能在局部范围内生效
闭包:内部函数包含了对外部作用域而非全局作用域名字的引用,该内部函数称为闭包函数
六,装饰器
1,装饰器的本质 :闭包函数
2,功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能
3,装饰器的固定格式
def timer(func): def inner(*args,**kwargs): '''执行函数之前要做的''' re = func(*args,**kwargs) '''执行函数之后要做的''' return re return inner
4,带参数的装饰器
def outer(flag): def timer(func): def inner(*args,**kwargs): if flag: print('''执行函数之前要做的''') re = func(*args,**kwargs) if flag: print('''执行函数之后要做的''') return re return inner return timer @outer(False) def func(): print(111) func()
5,多个装饰器装饰同一个函数
def qqxing(func): #func = pipixia_inner def qqxing_inner(*args,**kwargs): print('in qqxing:before') ret = func(*args,**kwargs) #pipixia_inner print('in qqxing:after') return ret return qqxing_inner def pipixia(func): #dapangxie def pipixia_inner(*args,**kwargs): print('in pipixia:before') ret = func(*args,**kwargs) #dapangxie print('in pipixia:after') return ret return pipixia_inner #qqxing(pipixia_inner) -->dapangxie = qqxing_inner() @qqxing #dapangxie = qqxing(dapangxie) -->dapangxie = qqxing(pipixia(dapangxie)) --> @pipixia #dapangxie = pipixia(dapangxie) def dapangxie(): print("饿了么") dapangxie()