Python中的单迭代对象与多迭代对象

本文深入探讨Python中的生成器和迭代器概念,解析生成器函数与生成器表达式的创建方式及其区别,同时对比单迭代对象与多迭代对象的行为特征。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天再看Python学习手册20章的时候,再一次学习了迭代对象中的生成器,所谓的生成器,就是一个函数,函数中包含yeild关键字,或者一个类似于(x for x in range(10))这样的生成器表达式
生成器函数:

# -*- coding: utf-8 -*-

def fun():
  for i in range(10000):
    yield i*2

a = fun()

print a

结果:

C:\Python27\python.exe C:/python_prac/Script/pickledb_prac.py
<generator object fun at 0x00000000032E6A68>

这就说明我们写的这个函数就是一个生成器函数,

生成器表达式:

# -*- coding: utf-8 -*-

a = (x for x in range(10000))
print a

结果:

C:\Python27\python.exe C:/python_prac/Script/pickledb_prac.py
<generator object <genexpr> at 0x00000000030B6A20>

这两种结果是一样的,都会产生一个生成器,它的作用是在产生一个比较大的数据,但是我们不能马上全部产生(内存限制),所以生成器就可以按需生成,它会记录相应的代码位置和局部变量,然后按需求返回相应的值

单迭代对象:
生成器返回的都是单迭代对象,就是只能遍历一次,代码如下:

a = (x for x in range(10000))

aa,  bb = iter(a), iter(a)


print aa.next()
print aa.next()
print bb.next()

结果:

C:\Python27\python.exe C:/python_prac/Script/pickledb_prac.py
0
1
2

bb.next()值为2说明aa和bb是一个iter,这就是单迭代对象

多迭代对象

# -*- coding: utf-8 -*-

a= range(10000)
aa, bb = iter(a), iter(a)

print aa.next()
print aa.next()
print bb.next()

结果:

0
1
0

这里bb.next()值为0说明bb是一个新的迭代器,从头开始。
这里的原因时,生成器返回的时它本身,而支持多次迭代的对象返回的是一个辅助类对象而不是它们本身。
这里在对最后一句话做一下解释:

# -*- coding: utf-8 -*-

a = (x for x in range(10000))

print a == iter(a)

输出:

C:\Python27\python.exe C:/python_prac/Script/pickledb_prac.py
True

说明生成器表达式以及生成器函数本省就会返回一个迭代器

总结:至于迭代器和生成器的关系,就一句话,生成器是属于迭代器的一种,只不过它的表现形式更简单,python解释器已经为我们做了迭代器要做的事情(next,__iter__的实现),单迭代对象就是指的时没有实现返回一个辅助类对象的迭代器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值