关于python3 的高级特性yield用法与实践

针对于理解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]

代码不是很完善,有错误还请指正,定当修改~

原文地址:https://www.cnblogs.com/spider3658/p/14511136.html