生成器,迭代器,闭包,装饰器
生成器,迭代器,闭包,装饰器
一.生成器
生成器会将你要生成的数据储存起来,等到需要的时候,用一次,执行一次
1.创建生成器的第一种方式:
list = (x for x in range(5))
print(list)→(输出的是list的地址)
print(next(list))→0
print(next(list))→1
print(next(list))→2
注意:输出次数一定不要超过循环次数,否则会报错
2.yield方法:
此方法要配合函数使用,只要函数中有yield,那么这就是一个生成器
例如用循环相加举个例子
def plusnum():
a = 1
b = 1
for i in range(3):
yield b
b += a
num = plusnum()
print(next(num))
print(next(num))
它的输出为:1
2
它的执行逻辑用下面的代码看的更加明了
def plusnum():
a = 1
b = 1
print("_1_")
for i in range(3):
print("_2_")
yield b
b += a
print("_3_")
num = plusnum()
print(next(num))
print(next(num))
运行结果为:

由此可知,它的逻辑是:
yield b运行后会卡住,不会向下运行,直到下一次调用,才会继续向下执行
在代码中就是print(next(num))调用输出1,输出2,输出b然后卡住停止,第二次print(next(num))时,
先进行b = a+b的计算然后输出3,再进入循环,输出2,在输出b的值
3.send方法:
send通常是伴随yield使用,他是给(yield 变量) 这个整体赋值
用上面代码来运行:
def plusnum():
a = 1
b = 1
for i in range(3):
num = yield b
b += a
num = plusnum()
num.send("啦啦啦啦")
运行发现会报错,这是因为代码从上向下运行,遇见函数避开,那么首先执行的是num.send("啦啦啦啦")
这是函数还没调用,num这变量空间还没开创,啦啦啦啦发送不过去从而导致代码崩溃
我们只是需要提前调用一下这个生成器即可
def plusnum():
a = 1
b = 1
for i in range(3):
num = yield b
b += a
num = plusnum()
next(plusnum)
num.send("啦啦啦啦")
就可以运行出来,一定要记住send是给yield b这个整体赋值
4.多任务处理
def test1():
while True:
print("嗨嗨嗨")
yield None
def test2():
while True:
print("来了哦")
yield None
t1 = test1()→(将test1的方法地址赋值给t1)
t2 = test2()→(将test2的方法地址赋值给t2)
while True:
t1.__next__()
t2.__next__()
这样就会死循环进行两个任务
二.迭代器
可迭代的: 凡是可以通过for循环取值的都是可迭代的
凡是可以被next函数调用取值,并且返回下一个值的对象,就是一个迭代器(生成器一定是一个迭代器)
三.闭包
闭包的定义:
在一个函数中,又定义了一个函数,并且里面的函数使用了,外面的函数的参数,这个整体就是一个闭包
闭包的应用场景:
外面的函数给定了基础条件,里面的函数基于原来的基础之上进行进一步处理
def test1(number):
def test_in():
print(number+100)
return test_in
a = test1(100)
a()
这就是一个闭包,这里重要的是代码的运行逻辑
调用外面的函数返回值就是test_in的方法地址也就是里面的函数并赋值给了a
此时a指向test_in这个方法,再调用a就运行了里面函数的代码
用图片解释是:

闭包的应用:
def w1(func):
def inner():
print("权限认证中!")
func()
return inner
def f1():
print("f1")
def f2():
print("f2")
f1 = w1(f1)
f1()
f2 = w1(f2)
f2()
看懂这个,闭包基本就掌握了
四.装饰器
装饰器可以理解为闭包的升级,让代码更加简练
def w1(func):
def inner():
print("权限认证中!")
func()
return inner
@w1
def f1():
print("f1")
@w1
def f2():
print("f2")
f1()
f2()
@一下那个函数就相当于f1 = w1(f1)升级了一下.让代码更加简洁
理解闭包,修饰器就很好理解了
总之这里

浙公网安备 33010602011771号