可迭代对象迭代器与生成器

img

一、容器

容器就是一个用来存储多个元素的数据结构,常见的容器包括【列表】、【元组】、【字典】、【集合】、【字符串】。

容器有两个特点:1、容器中的元素可通过迭代获取 2、所有容器中的元素被存储在内存中

二、可迭代对象

​ 可迭代对象,简单的说就是可以被迭代获取的对象,iterable定义了可返回迭代器的__iter__方法

​ 通过iter()方法,我们能将可迭代对象返回成迭代器。

from collections.abc import Iterable
#定义一个列表,其本身是可迭代对象
lsit = ['a','b','c']
isinstance(lsit,Iterable)
a = iter(lsit)
#对迭代器调用next()方法
print(next(a))
print(next(a))
print(next(a))
print(next(a))   #抛出StopIteration异常

三、迭代器

​ 迭代器是一个带状态的对象,迭代器内部持有一个状态,应该用于记录 当前迭代所在位置,以便于下次迭代的时候获取正确的元素。迭代器可以通过next()方法来迭代获取下一值

​ 迭代器实现了__iter__() 和 next()方法。而且,迭代器不会一次性把所有元素都加载到内存。而是需要的时候才返回结果。

使用迭代器

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

Python的for循环本质上就是通过不断调用next()函数实现的

创建一个返回数字的迭代器,初始值为1 ,逐步递增:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    x = self.a
    self.a += 1
    return x
 
myclass = MyNumbers()
myiter = iter(myclass)
 
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

#输出结果
1
2
3
4
5

四、生成器

​ 在python中,使用了yield的函数被称为生成器

​ 和普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作更简单点理解生成器就是一个迭代器。在生成器运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行next()方法时从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代对象。

使用yield实现斐波那契数列:

def fib(n): 
    a = 1
    b = 1
    while n:
        yield a
        a,b = b,a+b
        n = n-1
for ii in fib(10):
    print(ii)
总览:可迭代对象、迭代器、生成器之间的关系

= b,a+b
n = n-1
for ii in fib(10):
print(ii)

可迭代对象、迭代器、生成器之间的关系

迭代器和生成器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值