迭代器和生成器

本文介绍了Python中的迭代器和生成器,包括如何使用iter()和next()获取和遍历数据,自定义迭代器的实现,以及生成器在内存管理上的优势,以斐波那契数列为例详细讲解了生成器的创建和send()方法的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、迭代器

迭代器是一个可以记住遍历的位置的对象,迭代器从第一个元素开始访问,直到所有元素访问结束

① 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 = 1
        self.b = 1

    def __iter__(self):
        return self

    def __next__(self):
        next_num = self.a
        self.a , self.b = self.b , self.a+self.b
        return self.a

fib = Fibonacci()

for f in fib:
    print(f)
    time.sleep(2)

在这里插入图片描述

2、yield 创建

def fibonacci():
    a = 1
    b = 1
    while 1:
        next_num = a
        a , b  = b , a+b
        yield next_num

fin = fibonacci()
print(fin)
print(type(fin))

在这里插入图片描述
如果一个函数中有yield,此时fin = fibonacci()就变成了创建一个生成器对象,正常调next()即可生成数据
在这里插入图片描述

② 使用send()

在这里插入图片描述
可以通过send传入
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值