生成器第一种方式:
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()