这里涉及几个知识点:迭代器、生成器、yieId
先用个例子看一下迭代器与生成器的区别吧
#L是个list,迭代用for循环即可,L取出来是存放在内存中的,再多次去循环取出都可以 >>> L=[x*x for x in range(3)]>>> for i in L: print(i) 014>>> for n in L: print(n) 014 #把[]换成了()就成了生成器,只不过它只能循环出一次,因为它不是放在内存中的。它是实时生成数据的。>>> mygenerator = (x*x for x in range(3))>>> for i in mygenerator: print (i) 014 #看我再循环一次,它已是空值>>> for n in mygenerator: print(n) >>>
其实我感觉上最大差的几点有以下:
1、list函数调用直接出结果。而生成器是一个对象
>>> L = [1,2,3,4,5,6]>>> def xh(): for i in L: print(i) >>> g=xh()123456
>>> L1=[6,7,8,9,10]>>> def generator(): yield(L1) for i in L1: print(i) >>> g=generator()>>> next(g)[6, 7, 8, 9, 10]
这里有个yield的对比,大家感受一下
>>> L1=[6,7,8,9,10]>>> def generator(): yield(L1) #打印L1的意思 for i in L1: print(i) >>> g=generator() #这里是一个生成器对象>>> next(g) #用next打印出来[6, 7, 8, 9, 10]#生成器第2个例子>>> def gen2(): for i in L1: yield(i) #打印i的值 print(i) >>> g=gen2()>>> print(g)>>> for x in g: print(x) 667788991010
2、其实想想也挺简单,yield只不过就是个标识,同时打印一次该结果
经典案例:杨辉三角
#将杨辉三角的每一行看成一个list,写一个生成器(generator),不断输出下一行listdef triangel(n): L=[1] #定义一个list[1] while True: yield L #打印出该list L=[L[x]+L[x+1] for x in range(len(L)-1)] #计算下一行中间的值(除去两边的1) L.insert(0,1) #在开头插入1 L.append(1) #在结尾添加1 if len(L)>10: #仅输出10行 break#生成一个generator对象,然后通过for循环迭代输出每一行a=angel(10)for i in a: 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]