迭代器和生成器
- 一、迭代器
- ① iter()
- ② next()
- ③ 自定义迭代器
- 二、生成器
- ① 创建生成器
- 1、斐波那契数列
- 2、yield 创建
- ② 使用send()
一、迭代器
迭代器是一个可以记住遍历的位置的对象,迭代器从第一个元素开始访问,直到所有元素访问结束
① iter()
通过iter()得到可迭代对象(a)中的迭代器
② next()
通过iter()得到的迭代器(iter_a),使用next()取数据
③ 自定义迭代器
由于a = [1,2,33,4,5,6,77,8] 已经是个列表,列表里面本身已经存在迭代器
而自己定义的class类对象里,里面没有迭代器,因此需要__iter__ 与 __next__,当我们使用 iter()与next()时会自动调用该类的__iter__ 与 __next__
二、生成器
generator
例如受内存限制,生成1000w个list需要大量内存,如果能通过某种算法进行推算出列表的元素,当这个元素/数据需要用的时候才被生成出来,这样就可以不一次性创建大list,从而减少内存使用
即,生成器是 指记录数据生成的方法,而不是事先生成并存储完整的数据
例子:
list1是列表,而list2是生成器
此时 将list1改为range(100000000000000000) 后,程序会崩溃并返回137内存溢出状态码,而同样对list2操作时并不会内存溢出,且还可以对list2进行for循环打印(从而实现,当数据被需要时,才生成,以此规避内存溢出)
① 创建生成器
1、斐波那契数列
import time
class Fibonacci():def __init__(self):self.a = 1self.b = 1def __iter__(self):return selfdef __next__(self):next_num = self.aself.a , self.b = self.b , self.a+self.breturn self.afib = Fibonacci()for f in fib:print(f)time.sleep(2)
2、yield 创建
def fibonacci():a = 1b = 1while 1:next_num = aa , b = b , a+byield next_numfin = fibonacci()
print(fin)
print(type(fin))
如果一个函数中有yield,此时fin = fibonacci()就变成了创建一个生成器对象,正常调next()即可生成数据
② 使用send()
可以通过send传入