yield简介
yeild是python的关键字。如果你要了解yield的作用,你必须要了解生成器(generators),了解生成器之前你需要了解什么是可迭代对象(iterables)。
可迭代对象
当你创建一个列表,你可以遍历这个列表,读取它的每一个元素,逐个读取列表元素的过程称为迭代(iteration)。
list = [1,2,3,4]
for i in list:
print(i)
# 输出结果
1
2
3
4
当使用列表推导式时来创建一个列表的时候,就创建了一个可迭代对象,如下:
list = [x*x for x in range(3)]
for i in list:
print(i)
#输出结果
0
1
4
像这种可以使用for…in…语法去迭代的对象都是可以迭代的对象。像字典,列表,数组,字符串都是可以迭代的对象。
由于可以随意地读取这些对象中的元素,这些可迭代对象使用起来非常方便,但是这样做会把可迭代对象所有的值都存在内存中,当有很多个元素的时候**,就会占用大量的内存消耗系统资源。**
生成器
生成器是迭代器(iteratos),但是只能迭代一次,生成器不会将所有值存储在内存中,而是实时的生成这些值:
generator = (x*x for x in range(3))
for i in generator:
print(i)
将列推导式的[]变成了(),其他并没有做任何的改变。但是mygenerators已经不是列表而是生成器。生成器迭代一次之后就不能再次迭代。计算出0,然后并不保存结果和状态继续计算出1,最好计算出4,逐一生成。
除了把[]换成()之外,生成器看起来和列表推导式没有什么不同。但是,调用之后,你不能再次使用for i in generator,因为生成器只可以被迭代一次:它计算出0,然后计算出1,同时丢弃掉0,然后最终计算出4,丢弃掉1,一个接着一个
Yield 关键字
- yield是一个类似与return的关键字,只是这个函数会返回的是一个生成器(Generator)。
- 当我们调用这个函数的时候并不是返回计算的结果。而是返回一个生成器。只有迭代这个生成器的时候才会计算结果。
- yield可以返回值,但是不会结束函数的执行,如果函数后面还有代码,同样是可以执行的。例如:
def create_generator():
for i in range(3):
yield i*i
mygenerator = create_generator()
for i in mygenerator:
print(i)
for i in mygenerator:第一次循环的时候函数执行到yield关键字位置,返回ii的值,然后将函数挂起(保存函数执行的状态)。for i in mygenerator:第二次循环时,将继续执行刚才的函数(挂起的位置),也就是执行生成器里面的for循环,返回ii的值,然后再次将函数挂起。直到生成器里没有值可以返回就结束。
yield的作用
需要创建一个非常大的列表直接使用列表推导式可能会导致内存被耗尽,这代码是创建不了列表,电脑内存不足以保存这个列表。例如:
[i for i in range(1000000000)]
但是可以使用生成器创建成功,需要使用的时候再从生成器中取出。
yield的好处
1、不会将所有数据取出来存入内存中,而是返回了一个对象,可以通过对象获取数据,用多少取多少,可以节省内存空间。
2、除了能返回一个值,还不会终止循环的运行
3、再用yield的写法效率比普通的列表效率高
yield应用举例
# 应用return返回函数值
def f1_returen():
list1 = []
for i in range(1,10):
list1.append(i)
return list1
# 应用yield返回函数值
def f2_yiled():
for i in range(1,10):
yield i
# 函数调用
print("return返回的函数值",f1_returen())
function_value = f2_yiled()
print("第1次yield返回的函数值",next(function_value))
print("第2次yield返回的函数值",next(function_value))
print("第3次yield返回的函数值",next(function_value))
print("第4次yield返回的函数值",next(function_value))
print("第5次yield返回的函数值",next(function_value))
print("第6次yield返回的函数值",next(function_value))
输出结果
return返回的函数值 [1, 2, 3, 4, 5, 6, 7, 8, 9]
第1次yield返回的函数值 1
第2次yield返回的函数值 2
第3次yield返回的函数值 3
第4次yield返回的函数值 4
第5次yield返回的函数值 5
第6次yield返回的函数值 6
本文深入探讨Python中的生成器和yield关键字,解释了生成器如何通过yield逐步生成数据,而不是一次性加载所有数据到内存中,从而节省内存空间。文章对比了列表推导式和生成器表达式的使用场景,强调了yield在函数执行中的独特作用。

550

被折叠的 条评论
为什么被折叠?



