python生成器和迭代器

本文介绍了迭代器的概念,强调了它们如何通过逐个生成数据来节省内存。Python中的列表、元组等是可迭代对象,但不是迭代器。文章还讨论了生成器的两种形式以及何时选择使用迭代器和生成器,特别是在处理大规模数据和有规律但难以用列表推导描述的情况下。

迭代器

概念:
一个类(对象)只要含有“iter”、"next"两个方法,就将其称为迭代器。
对于__iter__方法,它需要具有一个可以返回一个迭代器对象的功能(这个对象可以是自己(前提是本身就是一个迭代器),也可以是其它迭代器);
对于__next__方法,它需要标记并返回下一个迭代器对象;元组,列表,字典,字符串,集合,range都是可迭代对象,但不是迭代器。
在这里插入图片描述
执行了红框的之后,再接着红框的数据往下执行,即该生成器的原数据为0,1,1,2,3,5,8,13,调用一次少一个数据

结论1:迭代器是一个可以记住遍历位置的对象,因此不会像列表那样一次性全部生成,而是可以等到用的时候才生成,因此节省了大量的内存资源。迭代器对象从集合中的第一个元素开始访问,直到所有的元素被访问完。

结论2:可迭代对象不一定是迭代器,迭代器一定是可迭代对象。


譬如列表,元组之类的是可迭代对象,不是迭代器
在这里插入图片描述

迭代器的使用1:
在这里插入图片描述
如图1775行的lines就是一个迭代器

迭代器的使用2:
在这里插入图片描述

代码块:


class Fibonacci(object):

    def __init__(self, nums):
        self.nums = nums
        self.before = 0
        self.after = 1
        self.i = 0  # 判断在传入数字范围内

    def __iter__(self):
        return self

    def __next__(self):
        ret = self.before
        if self.i < self.nums:
            self.before, self.after = self.after, self.before + self.after
            self.i += 1
            return ret  # 返回第一个值
        else:
            print('aaa')
            # raise Exception('完成')
            return 'aaa'
if __name__ == '__main__':
    nums = 300000
    myFabonacci = []
    time1 = time.time()
    fb = Fibonacci(nums)
    for i in fb:
        if i == 'aaa':
            print('i的值', i)
            print(len(myFabonacci))
            break
        myFabonacci.append(i)
    time2 = time.time()
    print('时间1', time2 - time1)
    myFabonacci2 = []
    a = 0
    b = 1
    i = 0
    while i < nums:
        myFabonacci.append(a)
        a, b = b, a + b
        i += 1
    else:
        print(len(myFabonacci2))
    time3 = time.time()
    print('时间2', time3 - time2)

生成器

两种生成形式或者是其概念:
1、和列表推导式的定义相似,生成器表达式使用的是()而不是 [ ] ,可以称其为元组推导式;
2、只要函数中有yield关键字的就是生成器。

例如----元组推导式:
在这里插入图片描述
可以使用next()函数进行输出,如图在第五次输出的时候就报错,因为没有数据了

例如----含yield关键字的函数:
在这里插入图片描述
可以使用next()函数进行输出,如图在第五次输出的时候就报错,也是因为没有数据了

总结:生成器也是一种迭代器

什么情况下使用迭代器?

1). 如果数列的数据规模巨大
2). 数列有规律,但是依靠列表推导式描述不出来

什么时候使用生成器?

1). 节省内存
2). 流式处理数据
3). 无限的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值