装饰器:* decorator(语法糖)*
定义:装饰器本质是函数,(装饰其他函数),就是为其他函数添加附加功能,装饰器对原函数没有任何影响。
原则:
- 1、不能修改被装饰的函数的源代码
- 2、不能修改被装饰的函数的调用方式
实现装饰器的知识储备:
- 1、函数即"变量"
- 2、高阶函数
- 3、嵌套函数
高阶函数+嵌套函数–》装饰器
装饰器之函数即变量
函数就是变量,
def test():
Pass
Test = "函数体"
Test()
和变量一样,没有门牌号【变量名,函数名】,内存立刻回收
Del没有删除内存地址的1,只是把门牌号删除了,系统会定期刷新内存,发现没有引用【门牌号】的内存,会自动清除内存。函数名就是门牌号,就是内存地址。
个人理解:当定义一个函数的时候,函数名作为门牌号,也就是函数的地址存放起来,然后将函数体(一堆字符串)放到内存中(仅仅是存放,不执行,不检查),只有当函数执行的时候,函数体才会执行,检查。函数名==》地址,函数名()==>函数执行
装饰器之高阶函数:
a:把一个函数名当做实参传给另外一个函数【函数名(内存地址)可以来回赋值】(在不修改被装饰函数源代码的情况下为其添加功能)
b:返回值中包含函数名(不修改函数的调用方式)
装饰器之嵌套函数:
嵌套函数就是函数体内部定义函数,而不是调用函数,得有def
装饰器之参数完整版:
装饰器之牛逼版:
迭代器与生成器
列表生成式(代码简洁)
生成器(* generator *)
优点:节省空间,列表元素可以通过某种算法推算出来,一遍循环,一遍计算后面的元素。
第一种表示方式:使用圆括号
生成器也是一种可迭代对象。
生成器是当你使用的时候才生成,不调用不生成,省空间。
列表是提前全部准备好,浪费空间。
生成器:只有在调用的时候才会生成相应的数据。只记住当前位置(前面的都没了,所以省内存),不能往回返,只能一步一步的往后走,
只有一个方法a.__next__() == next(a),往后走一步。2.4中为next()
但是一步一步的取很麻烦,一般用for 循环:
第二种表示方式 :当推算的算法比较复杂的时候,列表生成器的形式无法表示,这个时候要通过函数来表示。
斐波那契数列,,1,1,2,3,5,8.。。。
a,b = b,a+b ==>t = (b,a+b)tuple,a = t[0],b = t[1]
Next()是python内置方法,f.__next__()是generator的方法,二者在此处的功能是一样的。
如果一个函数定义中包含yield关键字那么这个函数就成了generator
Return:在函数中,函数值顺序执行的,遇到return语句或者最后一行语句就返回。
Yield:成为了generator,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从返回的yield语句处继续执行。(yield语句处会跳出函数,执行其他语句,再次执行next()会返回函数yield()处,相当于函数的进出口)
使用fo循环调用generator,拿不到generator的return语句返回值。迭代完成之后,会返回一个StopIteration错误,捕获错误,返回值包含在StopIteration的value中:
另外generator.send()方法可以给yield发送值
迭代器:iter()
一类是集合数据类型:list\tuple\dict\set
一类是generator
可迭代对象:直接用于for循环的对象Iterable
迭代器:可以被next()函数调用并且不断返回下一个值的对象称为迭代器Iterator
匿名函数
Def haha(n):
Print(n)
Haha(5)
等价于下面
Calc = Lambda n:print(n)
calc(5)
三元运算 lambda n:3 if n<4 else n
Filter过滤
Map 等价于列表生成式==》i*i for i in range(5)
Reduce
Zip(拉链的意思)
Json
只能处理简单的(字符串,列表,字典之类的),用于各个不同语言之间的交互,类似于xml
Pickle可以序列化所有的python数据类型(只能python中用)
Json模块提供四个功能:dumps\dump\loads\load
Pickle模块提供四个功能:dumps\dump\loads\load
Json序列化
Json反序列化
Pickle的序列化
Pickle反序列化
多级目录
Print(__file__)返回当前脚本的相对路径()
Import os
Os.path.abspath(__file__) 绝对路径
Os.path.dirname( Os.path.abspath(__file__) ) 返回当前绝对路径,不包括文件名
BASE_DIR = os.path.dirname( os.path.dirname( os.path.abspath(__file__) ) )#返回父目录
sys.path.append(BASE_DIR) #添加到环境变量中
内置参数详解 https://docs.python.org/3/library/functions.html?highlight=built#ascii