python 高级语法 —— 装饰器、迭代器、生成器
老是看了忘,忘了又去看,在此记录一下我的学习笔记,希望下次别忘了
装饰器
-
使用场景:接手一个新项目时,对项目中已有函数体我们最好不做修改,但是如果我们想改写复用这个函数,这时候就可用到装饰器
-
例子:
-
原代码
def add(a,b): return a+b
此处源代码实现的是计算传入参数a+b的值,假设现在有新需求,希望这个代码对用户更友好,输出一定的提示信息。我们当然可以选择直接改这个函数,但是根据前文,最好不要动原有的函数体,这时可以使用装饰器。
-
修改步骤
- 1.定义一个闭包函数
闭包函数:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。
# 这里的f是外函数的临时变量 def test_add(f): def test(a,b): print("接下来将计算您的传入参数和") # 在内函数中 用到了外函数的临时变量 ans = f(a,b) print(ans) # 外函数的返回值是内函数的引用 return test
- 2.在原函数上添加
@test_add
此处的
@test_add
其实就是将原函数add
作为参数传给test_add(f)
,即与add = test_add(add)
等价
@test_add def add(a,b): return a+b
-
测试
add(5,6)
- 输出值
接下来将计算您的传入参数和 11
-
迭代器与生成器
-
迭代器:是一种支持next()操作的对象。它包含了一组元素,当执行next()操作时,返回其中一个元素。
-
生成器:本质上就是一个函数,它记住了上一次返回时在函数体中的位置。
对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。 -
例子:
-
代码
# test是带有yield的生成器 def test(): yield f'1' yield f'2' yield f'3333' # 此时g是一个可迭代对象 g = test() # 每次next后执行到f中的yied返回的值然后暂停 # 只有下一次next才会继续执行之后的代码段并在yield返回值后再次暂停 print(next(g)) print(next(g)) print(next(g))
-
输出结果
1 2 3333
-
-