针对于理解yield,那么首先了解迭代器,生成器,最后去了解yield
# 执行函数
mylist = [1,2,3] for i in mylist: print(i)
输出结果:
1
2
3
这里的mylist是一个可迭代对象,当你使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代的对象:
# 使用列表生成式新增的一个mylist2
mylist2 = [x*x for x in range(1,4)] for j in mylist2: print(j)
生成器是可以迭代的,但是你只可以读取它一次 , 因为它并不把所有的值放在内存中,它是实时地生成数据,栗子:
def CreateGenerator(): mylist = (x * x for x in range(1, 4)) for z in mylist: yield z if __name__ == '__main__': mygenerator = CreateGenerator() for i in mygenerator: print(i)
CreateGenerator()这个函数就是生成器,我把它赋值给一个变量mygenerator ,在使用for循环输出,也可以在python consele控制台进行next(mygenerator)进行一个一个的输出;
tips:
迭代是一个实现可迭代对象(实现的是 `__iter__()` 方法)和迭代器(实现的是 `__next__()` 方法)的过程。
可迭代对象是你可以从其获取到一个迭代器的任一对象。迭代器是那些允许你迭代可迭代对象的对象。
因为迭代器的数据不在内存中,一次只给出一个返回值,使用return(返回全部的)无法获取到我们想要的值,所以使用yield可以中断并返回这个值;
举个栗子,实现杨辉三角10层:
# 杨辉三角的实现@@@@@@@ def CreatGenerator(): x = [1] for i in range(0,10): yield x x.append(0) x = [x[k] + x[k-1] for k in range(i+2)] zz = CreatGenerator() for i in zz: print(i)
输出结果为:
[1] [1, 1] [1, 2, 1] [1, 3, 3, 1] [1, 4, 6, 4, 1] [1, 5, 10, 10, 5, 1] [1, 6, 15, 20, 15, 6, 1] [1, 7, 21, 35, 35, 21, 7, 1] [1, 8, 28, 56, 70, 56, 28, 8, 1] [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
代码不是很完善,有错误还请指正,定当修改~