python中不得不知道的:迭代器与生成器理解,最简单易懂的版本

什么是可迭代对象

最直观的理解就是可以被for in 循环的对象,例如字符串,字典,列表,元组,集合等,
用另一句话来说就是实现了__iter__ 方法的就是可迭代对象(__iter__方法是python内置方法,用于返回迭代器自身)

什么是迭代器

迭代器就是一个实现了迭代方法的容器,他是一个带状态的对象,他能在你调用next的时候返回容器内的下一个值
任何实现了__iter__和__next__方法的对象都叫迭代器
iter方法返回迭代器本身,next方法返回下一个值
当所有值都返回完,没有更多值的时候,迭代器抛出StopIteration错误,此时迭代结束
相对于可迭代对象,迭代器就多了个next方法。并且,迭代器为一次性消费,next迭代出来的元素用完 不可再生,如需再次迭代使用,需要再次获取迭代器

举个栗子

#此时这个list是个普普通通的列表,也是个可迭代对象
list = [1,2,3,4,5,6]

#这时it_obj是接受了由list的iter方法返回的迭代器对象,
#众所周知iter方法可以返回一个迭代器对象
it_obj = iter(list)
#执行next方法迭代这个迭代器:
print(it_obj.__next__()) #此处输出为1
print(it_obj.__next__()) #此处输出为2

print('-'*30)

for it in it_obj:
    #此时输出结果应是从3开始,因为1,2已被迭代使用掉了,
    #迭代器的元素使用都是一次性的,所以输出3,4,5,6后抛出异常,迭代结束
    print(it)

输出:
在这里插入图片描述

for循环内部调用了迭代对象的iter方法

迭代器与跌的对象的关系就是如上所述,下面来讲讲生成器

生成器

生成器可以理解为一个特殊的迭代器,它会在执行的时候保存执行环境的上下文,并在下次循环中执行在yield函数,生成器的标志就是yield函数。
生成器看起来就像一个正儿八经的函数,特殊就特殊在它带了yield关键字,生成器没有将有序列表一次性生成,而是用一次生成一次,它可以有无穷的元素,但不需要无穷的空间,用生成器对内存优化很有帮助。

举个栗子

def get_item():
    for i in range(10):
        print('running!')
        #生成器每次运行到yield,下次调用next从yield后开始执行
        yield i
        print('again')
        
a = get_item()
print(a.__next__())
print('-'*30)
print(a.__next__())
print('-'*30)
print(a.__next__())
print('-'*30)
print(a.__next__())

运行结果:
在这里插入图片描述

总结一下:可迭代对象就是字符串,列表,字典,集合,元组这些可以用for循环迭代的东西,它们有个iter方法会被for调用出一个迭代器。这个迭代器有固定的元素总量和空间,生成器就是特殊的迭代器,它长得就是个带yield 的函数,它用一次生成一次,比普通迭代器功能强大的多,可以优化内存空间。下次有空讲讲yield关键字和异步
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值