迭代器、生成器

迭代器、生成器

1.列表生成式改为()
2.函数中存在yield关键字 ---->生成器----->迭代器(存在next(),返回下一个元素

list、tuple、set、dict、str等可以直接作用于for循环对象---->可迭代对象---->迭代器(存在next(),返回下一个元素

迭代器:
迭代是访问集合的一种方式
迭代器是可以记住遍历位置的对象
迭代的访问是从集合的第一个元素开始的,直到最后一个结束,迭代器的访问只能一直向前
iter() 和 next()是迭代器的两个最基本方法
能够调用__iter__和__next__()方法的对象都是迭代器
__iter__返回迭代器自身,__next__返回容器中的下一个值

实例:

      list1 = [1,2,3,4,5]     #list只是一个可迭代对象不是一个迭代器

      t = iter(list1)   #通过使用iter()就可以将一个可迭代对象变成一个迭代器了

      #因为迭代器可以调用next()方法

      print(next(t))   #这样就可以打印出第一个值

      如果想打印第二个值的话可以再次调用

      print(next(t))

生成器

生成器是一个特殊的迭代器,它的返回值用的是yield而不是return
生成器不需要写__iter__()和__next__()方法,只需要一个yiled关键字,生成器一定是迭代器

1.迭代器一定是迭代对象,迭代对象不一定是迭代器

2.生成器一定是迭代器,迭代器不一定是生成器

3.使用for…in…来遍历迭代对象是最常用的方式

4.可迭代对象必须可以调用__iter__方法,对于迭代器来说必须可以调用__iter__和__next__方法、

举例 :用斐波拉契数列来进行说明

def fab(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
t = fab(10)
print(type(t))
print(next(t))
print(next(t))

对于 fab函数来数它就不是一个普通的函数了,它就是一个生成器,因为它的返回不是用print打印的
而是用yield进行返回的

对于普通的函数来说我认为就是它在调用的时候就会直接返回它的一个结果,
但是对于generator函数来说它在调用的时候就不会直接生成一个结果,而是返回一个generator对象

迭代器:是一个抽象的概念,任何对象,如果它的类有 next 方法和 iter 方法返回自己本身,对于 string、list、dict、tuple 等这类容器对象,使用 for 循环遍历是很方便的。

         在后台 for 语句对容器对象调用 iter()函数,iter() 是 python 的内置函数。iter()会返回一个定义了 next()方法的迭代器对象,它在容器中逐个访问容器内元素,

        next()也是 python 的内置函数。在没有后续元素时,next()会抛出一个 StopIteration 异常。

生成器:是创建迭代器的简单而强大的工具。它们写起来就像是正规的函数,只是在需要返回数据的时候使用 yield 语句。每次 next()被调用时,生成器会返回它脱离的位置

区别:生成器能做到迭代器能做的所有事,而且因为自动创建了 iter()和 next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存

       除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出 StopIteration 异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值