python-生成器,闭包,装饰器

 

生成器第一种方式:
a = (i for i in range(10))
next(a)或者for循环取数
第二种:函数内有yield,yield相当于两步:1、程序停止,2、return yield后边的值
例如:
def fib4():
print("---start---")
a, b = 0, 1
for i in range(5):
print("---1---")
yield b
print("---2---")
a, b = b, a + b
print("---stop---")

a = fib4()
a.send("测试")相当于将"测试"赋值给yield b这个整体
a.send(None)或者先调用一次next()后再调用send()

闭包:
函数内定义函数,return内部函数的引用
例:
def test1(num):
def test1_in(num_in):
print(num+num_in)
return test_in

ret = test1(100)
ret(100)

def line(a,b):
def line_in(x):
return a*x+b
return line
line1 = line(1,2)
y = line1(5)
print(y)

装饰器:装饰函数
只要解释器执行到了装饰器就会自动进行装饰,而不是等到调用的时候才装饰
多个装饰器同时装饰一个函数时,实际上是从下往上装饰
def auth(func):
def inner():
print("auth")
func()
return inner

@auth
def f1():
print("f1")

@auth
def f2():
print("f2")

f1()
f2()

例:
def w1(func):
def inner():
func()
return inner
@w1
def f1():
print("f1)

例:
def w1(func):
print("正在装饰w1")

def inner():
print("正在调用w1")
func()

return inner


def w2(func):
print("正在装饰w2")

def inner():
print("正在调用w2")
func()

return inner


@w1
@w2
def f3():
print("f3")

结果:
正在装饰w2
正在装饰w1
正在调用w1
正在调用w2
f3

通用装饰器
类装饰器
class Test():
def __call__(self):
print("---test---)

t = Test()
t()

posted on 2021-05-13 22:13  ClarenceSun  阅读(37)  评论(0编辑  收藏  举报

导航