全局变量:顾名思义,全局变量就是在函数外部定义的变量,在函数内部可以查看,即可以打印,且可以再整个文件中都可以使用,可变的如list,dict,set,在函数内部想要修改直接修改即可,但想int,str,tuple等不可变的类型的变量想要在内部函数修改时则需要使用global 变量名来进行定义
局部变量:只能在自己函数定义内使用,出去函数则无法使用,当为嵌套函数时,如果想在内层函数里改变外部函数里定义的不可变变量时,则需要使用nonlocal 变量名来定义后才能进行更改
内部函数:
即函数内嵌套函数
def 函数名():
内容
def 函数名():
内容
闭包:
三要素:
1.外部函数定义了内部函数
2.外部函数要有返回值,返回值为内部函数名
3.内部函数引用了外部函数的变量
格式为:
def 外部函数名():
pass
def 内部函数名():
pass
return 内部函数名
闭包的优缺点:
缺点:作用域不明显,闭包占用的内存资源不会被垃圾回收机制回收,所以比较耗资源
优点:延长了作用域,读取其他元素的内部变量,能使用同级的作用域,使代码变得整洁,便于阅读
装饰器使用闭包的原理
装饰器:
1.外部函数定义了内部函数
2.外部函数要有返回值,返回值为内部函数名
3.内部函数引用了外部函数的变量
4.装饰器要用函数作为外层函数的参数
装饰器时将你原来的函数添加到了一个嵌套的新函数中,返回的是一个函数,这个函数已经不是原来的函数,而是经过改变后的函数。你可以在不用修改原来函数的基础上调用原函数而产生与原来函数不同的效果
为什么不用嵌套函数而用装饰器:自己理解是如果用嵌套函数,那么你最后调用则需要用嵌套函数,而不是原函数,相当于你新写了一个函数,而使用装饰器你就可以直接调用原函数
如:
使用装饰器:
使用函数内调用函数:
这里最后调用调用的是一个新函数而不是原来的函数,且如果需要更改则需要再重新定义一个新函数
当装饰器也需要传参数的时候则在装饰器外再加一层嵌套即可
为什么装饰器要使用两层嵌套?
1.因为装饰的函数可能需要传参数
2.因为装饰器的作用是当调用被装饰的函数时装饰器里的内容才会生效,而不是无论是否调用被装饰的函数,装饰器的内容都会生效
作用域:LEGB
L:local 局部变量
E:enclosing 嵌套
G:global 全局
B:build in 内置函数库
匿名函数:
lambda表达式
lambda 变量名:内容
max(变量名,lambda)
min(变量名,lambda)
sorted(变量名,key=lambda,reverse=True or False)
ruduce(lambda,变量名):需要导入 from functools import reduce
filter(lambda ,变量名)