Python中yield的作⽤与for循环的区别,yield关键字的⽩话解析
Python中的yield
yield是什么?
yield是Python中的关键字,yield的出现⽤于构造⽣成器(generator)。Python三⼤器(装饰器、迭代器、⽣成器)中⼀种,但是⽣成器的构造⽅法不仅仅是使⽤yield关键字⼀种⽅法。还有⽣成器表达式的⽅式。
什么是⽣成器?
Python中的⽣成器的⼯作原理类似于过安检的过程。由于⼈流量较⼤,如果所有⼈⼀下⼦过安检,则会出现问题(门被堵了:阻塞,地⽅不够⽤:内存溢出)。所以就要在安检⼝安排⼯作⼈员,进⾏限流,让⼈们“间歇性”的⼀个⼀个通过。Python中的yield关键字其实就是安检⼝的⼯作⼈员。
以上是我的个⼈理解,如有问题请见谅!
Python中对⽣成器的定义如下:
⽣成器是特定的函数,允许返回⼀个值,然后“暂停”代码的执⾏,稍后恢复(从暂停状态恢复)。
说到⽣成器不得不说另⼀个东西:协同程序
协同程序是可以运⾏的独⽴函数调⽤,可以暂停或者挂起,从程序离开的地⽅继续或者重新开始。
举个栗⼦!
当协同程序暂停的时候,我们可以从中获得中间的返回值,当调⽤回到程序时可以传⼊额外或者改变了的参数。但仍能从上次离开的地⽅继续执⾏,并且恢复所有的完整状态。其实⽣成器就是⼀个协同程序。
此外,⽣成器还是可迭代对象。还有三个常⽤的⽅法:next()、send()、close()
为什么要⽤yield(⽣成器)?
有的⼩伙伴不解,⽣成器的作⽤和for循环迭代的效果是⼀样的,为什么我要⽤⽣成器?
答:
效果相当实属不假,但是在巨⼤数据集的穿越(迭代)时,资源的消耗不是⼀个数量级的。
具体来说:
for循环遍历⼀个万亿级别的长列表,会将这个列表的全部数据载⼊到内存中去,如果你的内存很⼩就会溢出,即使是内存很⼤,这个操作也是⼗分占⽤资源的。
⽽使⽤⽣成器,则会将数据的状态(例如:遍历到列表的哪个位置等等)保存到内存中,每次调⽤时去读取需要的数据。
⽣成器是⼀个内存使⽤更加友好的结构。从这点解读来看,可能⽣成器的出现就是为了⽤时间换空间。
⽣成器的Python代码⽰例
1. ⽣成器表达式:
my_generator =(i for i in range(10))
print(my_generator)
>>><generator object<genexpr> at 0x7f89afbfc4c0> print(my_generator[1])
>>> TypeError:'generator'object is not subscriptable print(next(my_generator))
>>>0
print(next(my_generator))
>>>1
for ele in my_generator:
send for是什么意思print(ele)
>>>
1
2
3
4
5
6
7
8
9
2. 函数式⽣成器:
def my_gen_func(my_list):
for i in my_list:
yield i
my_generator =[i for i in range(5)]
for ele in my_gen_func(my_generator):
print(ele)
>>>
1
2
3
4