Python中的迭代器和生成器

一、迭代器

1、迭代

迭代是一种重复获取数据集合中元素的过程,一次只获取一个元素,直到遍历完所有元素,通过for···in···语句实现。

2、可迭代对象

只要定义了__iter__()方法,我们就说该对象是可迭代对象。

在python中,for循环可用于任何“可迭代对象”。换句话说,可使用for循环遍历元素的数据集合,都是可迭代对象 iterable,如列表/元组/字典/生成器等。

可以使用 isinstance() 判断一个对象是否是 Iterable 对象。

from collections.abc import Iterable

print(isinstance(123,Iterable))        #False
print(isinstance("123",Iterable))      #True
print(isinstance([1,2,3],Iterable))    #True

3、迭代器

使用迭代器,每次只从对象中读取一条数据,不会造成内存的过大开销。

迭代器是一个可以记住遍历的位置的对象,它实现了迭代协议,即拥有__iter__和__next__方法,以有序的方式访问集合中的元素。__iter__返回迭代器本身,而__next__返回集合的下一个元素。迭代器在没有更多元素时抛出StopIteration异常。任何类只要实现了__iter__和__next__方法,就满足了迭代器协议。

可以使用 isinstance() 判断一个对象是否是 Iterator 对象。

from collections.abc import Iterator

print(isinstance(123,Iterator))         #False
print(isinstance(iter("123"),Iterator)) #True
print(isinstance([1,2,3],Iterator))     #True

使用内建的工厂函数iter(iterable)可以获取迭代器对象,使用next()方法访问下一个元素,python处理迭代器越界是抛出StopIteration异常。

next(n) == n._ next _() ,iter(n) == n._ iter _() 。

a=[1,2,3]       #可迭代对象
b=iter(a)       #获取迭代器对象

print(b)        #<list_iterator object at 0x000001B5252C68E0>
print(next(b))  #获取第一个元素:1
print(next(b))  #获取第二个元素:2
print(next(b))  #获取第三个元素:3
print(next(b))  #没有元素了,抛出异常:StopIteration

在Python中,我们经常使用的 for 循环,本质上就是通过不断调用 next() 实现的。 

二、生成器

生成器(generator)是一个特殊的迭代器,只能用于迭代操作。生成器具有和迭代器一样的特性,都是迭代器对象,都可以使用next()和iter()方法,但它们在实现方式上不一样。

迭代器和生成器都是容器,迭代器元素确定了,生成器没有确定。迭代器用来存储元素,生成器一般用来存储生成元素的算法,然后一边生成一边运行;通过生成器一个个去生成元素,而不是一下子生成全部的元素。

1、生成器表达式

生成器表达式类似列表推导式。列表推导式返回的是一个列表对象,而生成器表达式返回的是一个生成器对象。

a=[i for i in range(5)] #列表推导式
print(a)                #[0,1,2,3,4]
print(type(a))          #<class 'list'>

b=(i for i in range(5)) #生成器表达式
print(b)                #<generator object <genexpr> at 0x000001E620C50CF0>
print(type(b))          #<class 'generator'>

print(next(b))          #0
print(next(b))          #1
print(next(b))          #2

2、生成器函数

普通函数使用return返回一个值,生成器函数使用yield返回一个值。

def test1():
    return 1

def test2():
    yield 1

print(type(test1()))    #<class 'int'>

print(type(test2()))    #<class 'generator'>

对于普通函数,按顺序执行时遇到 return 或最后一行函数语句就会返回;对于有 yield的生成器函数,每次调用 next() 方法遇到 yield 语句才返回,如果再次调用 next() 方法,就会从上次返回的 yield 语句位置继续执行。

对于生成器,可使用next()函数或for循环打印数据集中的元素。

b=(i for i in range(5))

for j in b:
    print("元素:",j)

'''
元素: 0
元素: 1
元素: 2
元素: 3
元素: 4
'''

使用生成器来实现斐波那契数列。

def fibonacci(n):
    a,b=0,1
    while n>0:
        yield b
        a,b=b,b+a
        n-=1

f=fibonacci(15)
for i in f:
    print(i,end=' ')    #1 1 2 3 5 8 13 21 34 55 89 144 233 377 610

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

武当豆豆

为国家GDP快速增长做贡献

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

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

打赏作者

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

抵扣说明:

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

余额充值