Zip 对象----构造函数返回生成器对象

Zip 对象----构造函数返回生成器对象

Zip对象不能直接通过下标操作数据,但可以通过next函数来取数据。
Zip对象返回的是一个生成器,可以通过下面的代码理解生成器。 在for里面是用yield,这就是生成器的关键。通常情况下我们习惯像genseq2中那样返回一个list,这个list对象会一直存在于内存之中。而通过生成器可以不用return 将需要return出来的元素用yield修饰。
这样通过next或list的操作可以使用iterate的方式返回genseq需要返回的内容。当genseq方法没有返回完所有的元素的时候,代码会持续停留在yield的地方,一旦返回了所有的元素,genseq方法就结束了,并且返回的元素也从内存中删除了。

更具体的理解:

  1. 当程序执行到xx=genseq(5)时,genseq中的yield并不返回
  2. 第一次调用next(xx),yield返回一个值,并且内存中保留了下一轮循坏需要的迭代器(能否认为就是一个指针?)
  3. 第二次调用next(xx),yield再返回一个值(第二个值)。。。。。一直到返回完所有的值后,再调用next就会报错。
  4. 通过list可以一次让yield返回了所有的值,这是就没有需要返回的东西,从而再次调用xx就可以看到它是一个空的列表了。
  5. 对于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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值