python的generator、iterator、iterable

本文深入探讨了Python中的迭代器和生成器。迭代器是节省内存的对象,可以直接用于for循环,例如list、dict等可迭代对象。而生成器是迭代器的一种,可以通过yield关键字创建,可以在for循环中使用或通过next()函数逐次获取值。斐波那契数列的生成器示例展示了其工作原理。for循环本质上是调用next()函数的连续过程。理解这些概念对于高效利用Python处理大量数据至关重要。
摘要由CSDN通过智能技术生成

##python的高级特性----迭代器 参考:python的高级特性----迭代器
迭代器主要就是节省内存

  1. 在python中可以直接作用于for循环的数据类型有以下几种:
    (1)集合类型的数据:listtupledictsetstr
    (2)generator: 包括生成器带yield 的 generator function
    上述对象可以直接作用于for循环,统称为可迭代对象:iterable,我们可以通过isinstance() 判断一个对象是否是Iterable对象:
isinstance((x*x for x in range(1,5)), Iterator)   # True, (x*x for x in range(1,5))并不是生成tuple,而是生成generator
  1. 生成器generator不但可以用for循环,还可以被next()函数或者__next__()内置方法不断获取下一个值,直到最后抛出StopIteration错误。可以被next()函数或者__next__()内置方法不断返回下一个值的对象成为迭代器Iterator生成器generator都是迭代器Iterator,但是Iterable对象不一定是迭代器Iterator,如listdictstrtupleset都不是迭代器Iterator,想要用next()函数或者__next__()内置方法得先通过iter()方法将其变成迭代器Iterator
# 斐波那契数列
a = [1, 2, 3, 4, 5]
a = iter(a)
print(type(a))   #  >>> <class 'list_iterator'>
for i in range(5):
   print(a.__next__())   # >>> 1, 2, 3, 4, 5
# 这里有个问题,如果把`iter(a)`声明在for循环里,则会出现问题,只打印第一个值,应该是每次for循# 环都会`iter(a)`一次,所以才会这样,类似于局部变量
a = [1, 2, 3, 4, 5]
print(type(a))   #  >>> <class 'list_iterator'>
for i in range(5):
   print(iter(a).__next__())   # >>> 1, 1, 1, 1,
   ```
```python
def fab(max):  # fab 是一个 generator function
   n = 0
   a, b = 0, 1
   while(n < max):
       yield b
       a, b = b, a + b
       n = n + 1

a = fab(5)   # >>> fab(5) 是一个 generator

for i in range(5):
   print(a.__next__())   # >>> 1, 1, 2, 3, 5
  1. generator__next__()内置方法。迭代器Iteratornext()函数,python3中next()函数用法为next(iterator)
  2. for循环本质上就是不断调用next()函数实现的
for x in [1,2,3,4,5]:
       pass
   等同于
   it = iter([1,2,3,4,5])
   while True:
       try:
           x = next(it)
       except StopIteration:       #遇到StopIteration时则退出循环。
           break

================================================
小结:
1、可以for循环的对象都是Iterable ,可迭代对象。
2、可以作用于next()函数或者__next__()的对象都是Iterator迭代器next()函数其实就是在调用__next__()方法。Iterator迭代器是一个惰性计算的序列。
3、集合数据类型如dictlisttuple等对象是Iterable,但是不是Iterator,但是可以通过iter()函数获得Iterator对象,iter()函数其实就是在调用__iter__()方法。需要传入一个Iterable参数,函数的返回值是一个iterator对象

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值