python generator iterator_Python的iterator和 generator

Iterator

迭代器是实现了迭代方式的容器,python的迭代器需要实现 next()方法和__iter__()方法,next()方法返回容器的下一个项目,

__iter__()方法返回迭代器本身。

python有一个built-in函数 iter()用来从序列对象,如String, list中生成迭代器。

a4efe6fb3ac5b831b090907985d8bc70.png

当序列达到末尾时,将会抛出StopIteration异常。for...in...循环会捕获这个异常从而得知循环结束。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.pngView Code

Generator

生成器使用yield关键字,使函数在执行中中断并返回中间的结果。

1 def fibonacci():

2 a, b = 0, 1

3 while True:

4 yield b

5 a, b = b, a+b

generator对象是特殊的一种iterator,它会在执行过程中保存执行的上下文环境,并在下次执行中从yield语句后继续计算。

generator不需要抛出StopIteration异常,函数并没有将序列项一次生成,所以generator在实现上可以有无穷个元素,而不需要无穷的存储空间。

Generator 和 Coroutine

generator有三个方法可以用来实现协程,send()、throw()、close()

generator函数使用send(),能够传入参数

throw()抛出异常

close()退出generator

multitask模块使用generator来实现coroutine

1 import multitask

2 import time

3 def coroutine_1():

4 for i in range(3):

5 print 'c1'

6 yield i

7

8 def coroutine_2():

9 for i in range(3):

10 print 'c2'

11 yield i

12

13 multitask.add(coroutine_1())

14 multitask.add(coroutine_2())

15

16 multitask.run()

c1

c2

c1

c2

c1

c2

List Comprehension and Generator Expressions

有两种相似的写法:

1 a = [x**2 for x in range(10) if x % 2 == 0]

2 b = (x**2 for x in range(10) if x % 2 == 0)

如果使用type显示对象类型的,a为list,b为generator,b的这种写法是简化的generator,而a仅仅是一个列表对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值