迭代器与生成器

可迭代对象可以 直接作用于for循环的对象 统称为 可迭代对象(返回迭代器的对象) ,即Iterable。
  # 一是集合数据类型,如list、tuple、dict、set、str等;

  # 二是generator,包括生成器和带yield的generator function。

容器:简单来说容器是一系列元素的集合

容器是一种把多个可以逐个地迭代获取元素组织在一起并存储在内存中的数据结构;可以用innot in关键字判断元素是否包含在容器中。并不是所有的元素都放在内存,比如迭代器和生成器对象

在Python中,常见的容器对象有:list.dict.tupe.set.str

迭代器任何实现了__iter____next__()方法的对象都是迭代器,__iter__返回迭代器自身,__next__返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常,

la=[1,2,3,4]
# for i in la: for循环
#     print(i)结果:1 2 3 4
print(next(la))
print(next(la))
print(next(la))  结果TypeError: 'list' object is not an iterator#可迭代对象不一定是迭代器

la=[1,2,3]
print(type(la))   结果<class 'list'>
la=iter(la)      #通过iter()函数可以把可迭代对象转换成迭代器
print(type(la))   结果<class 'list_iterator'>
print(next(la))
print(next(la))
print(next(la))
print(next(la))      结果StopIteration

生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。它不需要再像上面的类一样写__iter__()__next__()方法,只需要一个yiled关键字。因此任何生成器也是以一种懒加载的模式生成值

#iter(可迭代对象)  ===> 迭代器-->Iterator。
#迭代器内部持有一个状态,该状态用于记录当前迭代所在的位置,
#以方便下次迭代的时候获取正确的元素
#斐波那契(Fibonacci)演示 迭代器 和 生成器
def fab(max):
    n,a,b=0,0,1

    while n<max:
        yield b       #yeild将b转换为生成器对象,
        a,b=b,a+b
        n=n+1;
      #没有return
         #生成器一定是迭代器,反之不成立
l= fab(10)    #l表示生成器
for i in l:
    print(i)

#可迭代类
class Fab(object):

    def __init__(self,max):
        self.max=max;
        self.n,self.a,self.b=0,0,1;

    def __iter__(self):#迭代器生成方式:1、iter()将可迭代对象转化成迭代器
        return self;  #             2、实现iter()和next()两个函数

    def __next__(self):
       if self.n<self.max:
           r= self.b;
           self.a,self.b=self.b,self.a+self.b;
           self.n+=1
           return r;
       raise StopIteration();
# f=Fab(10);#f表示迭代器
# for i in f:
#     print(i)
# print( next(f))#nest可以直接操作迭代器(可迭代对象不可以除非用iter()转换一下)
# print( next(f))
# print( next(f))
# print( next(f))
# print( next(f))
# print( next(f))

    • 迭代器持有一个内部状态的字段,用于记录下次迭代返回值,它实现了__next____iter__方法,迭代器不会一次性把所有元素加载到内存,而是需要的时候才生成返回结果。
    • 生成器是一种特殊的迭代器,它的返回值不是通过return而是用yield

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值