Zip 对象----构造函数返回生成器对象
Zip对象不能直接通过下标操作数据,但可以通过next函数来取数据。
Zip对象返回的是一个生成器,可以通过下面的代码理解生成器。 在for里面是用yield,这就是生成器的关键。通常情况下我们习惯像genseq2中那样返回一个list,这个list对象会一直存在于内存之中。而通过生成器可以不用return 将需要return出来的元素用yield修饰。
这样通过next或list的操作可以使用iterate的方式返回genseq需要返回的内容。当genseq方法没有返回完所有的元素的时候,代码会持续停留在yield的地方,一旦返回了所有的元素,genseq方法就结束了,并且返回的元素也从内存中删除了。
更具体的理解:
- 当程序执行到xx=genseq(5)时,genseq中的yield并不返回
- 第一次调用next(xx),yield返回一个值,并且内存中保留了下一轮循坏需要的迭代器(能否认为就是一个指针?)
- 第二次调用next(xx),yield再返回一个值(第二个值)。。。。。一直到返回完所有的值后,再调用next就会报错。
- 通过list可以一次让yield返回了所有的值,这是就没有需要返回的东西,从而再次调用xx就可以看到它是一个空的列表了。
- 对于genseq方法返回的值xx,如果连续两次调用两次list函数,第二次就会返回一个空的list。 Zip对象的构造应该就是返回的生成器对象,从而调用一次list后,它就会变成一个空list了。
代码
def genseq(N):
for i in range(N):
yield i ** 2
for i in genseq(5):
print(i, end=" : ")
xx=genseq(5)
print(next(xx))
print(next(xx))
print(next(xx))
print(next(xx))
print(list(xx)) #cautions
#print(next(xx)) #end iterator exception
def genseq2(N):
a = []
for i in range(N):
a.append(i)
return a
yy = genseq2(5)
print(yy)
print(list(yy))
print(list(yy))