迭代器、生成器

**迭代器:**用于循环

>>> a=[1,2,3]
>>> a=iter(a)		#把列表a转为迭代器
>>> next			#内置函数
<built-in function next>
>>> next(a)		#next() 调用迭代
1
>>> next(a)
2
>>> next(a)
3
>>> next(a)			#超出迭代范围,停止迭代
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

**生成器:**不能用类来实现,通过函数来实现
前后有下划线的都是内置函数,
def iter(self): #先定义一个迭代
def next(self): #定义下一个生成什么

>>> a=(i for i in range(3))
>>> type(a)
<class 'generator'>

>>> next(a)		#生成器、迭代器都可以用next()
0
>>> next(a)
1
>>> next(a)
2
>>> next(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration			#越界,没有可迭代对象
>>>

yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值。重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码(下一行)开始执行。return 的作用:如果没有 return,则默认执行至函数完毕,返回的值一般是yield的变量。

>>> def a():			#生成器
...     yield 1
...     yield 2
...     yield 3
...
>>> next(a())
1
>>> next(a())
1
>>> next(a())
1
>>> b=a()
>>> next(b)
1
>>> next(b)
2
>>> next(b)
3

迭代器:可以用在类里
通过实现迭代器协议对应的__iter__()和__next__()方法,可以自定义迭代器类型。对于可迭代对象,for语句可以通过iter()方法获取迭代器,并且通过next方法获得容器的下一个元素。

生成器:不可以用在类里,可以用在函数里
生成器是一种特殊的迭代器,内部支持了生成器协议,不需要明确定义__iter__() 和__next__()方法。
生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值