说一说Generator和Iterator

说一说Generator和Iterator

On the way of Pythonic...

Generator和iterator相伴相生,却不尽相同。

生成器(generator)

generator通常也是可迭代的,但并非是一次性生成所有迭代成员的列表,而是在循环的过程中通过next()方法不断获取后续元素。所以generator的存在可以节省内存资源(假如需要迭代一个包含海量数据的列表,那所占用的内存也会是不可忽略的)

下面的代码就可以获得一个generator:

from types import GeneratorType
from collections import Iterable, Iterator

g = (x for x in range(10))
print(isinstance(g, GeneratorType))
print(isinstance(g, Iterable))
print(isinstance(g, Iterator))

>>>
True
True
True

我们也可以自己定义一个generator,当然这就要用到yield关键字

from types import GeneratorType
from collections import Iterable, Iterator
def fib(max):
   a, b = 0, 1
   while True:
       if b > max:
           return
       else:
           yield b
           a, b = b, a+b
           print(a, b)
 
print(isinstance(fib(5), GeneratorType))
print(isinstance(fib(5), Iterable))
print(isinstance(fib(5), Iterator))

for f in fib(5):
   print f

>>>
True
True
True
1
(1, 1)
1
(1, 2)
2
(2, 3)
3
(3, 5)
5
(5, 8)
  • fib(5)就是一个generator, 同样也是一个iterator,所以支持用for来进行迭代。
  • yield和return同样都返回函数的值,区别在于return的返回是一次性的。yield只是返回了generator的一次迭代值, 函数的代码在yield返回迭代值后就会停止本次执行,yield之后以及之前的代码都只会在下次迭代执行。
  • generator在迭代完所有的值后,再次迭代(执行next()方法)会自动抛出StopIteration异常。但在for循环中无需处理该异常, 循环能够正常结束。

迭代器(iterator)

可以通过next()方法不断调用下一个迭代值的对象成为迭代器,迭代器支持for循环进行迭代。

  • 可迭代(Iterable)的数据类型包括,list, tuple, dict, set, str等,但这些数据类型并不是Iterator
  • Generator同样也是一个iterator,并且也是一种Iterable的数据类型
from types import GeneratorType
from collections import Iterable, Iterator
print(isinstance([], GeneratorType))
print(isinstance([], Iterable))
print(isinstance([], Iterator))
print(isinstance(iter([]), Iterator))
>>>
False
True
False
True
  • 如果有必要,可以使用iter()函数将Iterabe的对象转换成Iterator对象。

说一说Generator和Iterator

To be continue...

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lemon2050

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值