Python生成器的初识

简介: Python生成器的初识

文章目录

🌉一、生成器的概念

🌉二、生成器函数的定义

🎇1、yield和return关键字的区别和相同点

✨(1)yield和return关键字的的不同点:

✨(2)yield和return关键字的的相同点:

🎇2、生成器函数初识

✨(1)什么是生成器函数

✨(2)生成器函数的好处


🌉一、生成器的概念

我们知道的迭代器有两种:一种是调用方法直接返回的,比如for循环就是Python自带的迭代器,一种是可迭代对象通过执行iter方法得到的,迭代器有的好处是可以节省内存。避免将大量数据一次性取出而导致的错误和内存不足问题。

如果在某些情况下,我们也需要节省内存,就只能自己写。我们自己写的这个能实现迭代器功能的东西就叫生成器。

简而言之:生成器就是我们自己写的迭代器

🌉二、生成器函数的定义

🎇1、yield和return关键字的区别和相同点

yield是用于生成器。什么是生成器,你可以通俗的认为,在一个函数中,使用了yield来代替return的位置的函数,就是生成器。

  • ✨(1)yield和return关键字的的不同点:

它不同于函数的使用方法是:函数使用return来进行返回值,每调用一次,返回一个新加工好的数据返回给你;yield不同,它会在调用生成器的时候,把数据生成object,然后当你需要用的时候,要用next()方法来取,同时不可逆。你可以通俗的叫它"轮转容器",可用现实的一种实物来理解:水车,先yield来装入数据、产出generator object(你执行了含有yield关键字的函数,之后调用该函数不会的到返回值而是得到一个可迭代的对象"generator object" )使用next()来释放;

好比水车转动后,车轮上的水槽装入水,随着轮子转动,被转到下面的水槽就能将水送入水道中流入田里。水车这个比方太恰当不过了,就是每次有个数据要取出来,先按照顺序将数据放进水车的水槽中,当后面在调用next函数的时候相当于使用水槽的水,并且是按照水车中原来进去的顺序进行取水的(先进先出)

  • ✨(2)yield和return关键字的的相同点:

相同点:都是返回函数执行的结果\
不同点:return 在返回结果后结束函数的运行,而yield 则是让函数变成一个生成器(或者叫做可迭代对象),生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值

用一个栗子总结:

def f1():
    return 'aaa'
    return 'bbb'

def f2():
    yield 'aaa'
    yield 'bbb'

print(f1())
print(f2())
for i in f2():
    print(i)

输出结果:
aaa
<generator object f2 at 0x000001731AFFFC10>
aaa
bbb

🎇2、生成器函数初识

  • ✨(1)什么是生成器函数

一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。

简而言之就是函数内部含有yield关键字的就是生成器函数

  • ✨(2)生成器函数的好处

生成器有什么好处就是不会一下子在内存中生成太多数据,而是你找它要它才给你值,你不向它要它也不会返回值给你。

举个栗子:\
假如我预定了2000000件秋装服,我和工厂一说,工厂应该是先答应下来,然后再去生产,我可以一件一件的要,也可以一批一批的找工厂拿。而不能是一说要生产2000000件衣服,工厂一次性生产2000000件衣服在一起给我,等回来做好了,都冬天了。。。


def produce():
    """生产衣服"""
    for i in range(2000000):
        yield "生产了第%s件衣服"%i

product_g = produce()
print(product_g.__next__()) #要一件衣服
print(product_g.__next__()) #再要一件衣服
print(product_g.__next__()) #再要一件衣服
num = 0
for i in product_g:         #要一批衣服,比如5件
    print(i)
    num +=1
    if num == 5:
        break

#到这里我们找工厂拿了8件衣服,我一共让我的生产函数(也就是produce生成器函数)生产2000000件衣服。
#剩下的还有很多衣服,我们可以一直拿,也可以放着等想拿的时候再拿

相关文章
|
17天前
|
大数据 数据处理 开发者
Python中的迭代器和生成器:不仅仅是语法糖####
本文探讨了Python中迭代器和生成器的深层价值,它们不仅简化代码、提升性能,还促进了函数式编程风格。通过具体示例,揭示了这些工具在处理大数据、惰性求值及资源管理等方面的优势。 ####
|
2月前
|
存储 索引 Python
|
24天前
|
JavaScript 前端开发 算法
python中的列表生成式和生成器
欢迎来到瑞雨溪的博客,这里是一位热爱JavaScript和Vue的大一学生的天地。通过自学前端技术2年半,现正向全栈开发迈进。如果你从我的文章中受益,欢迎关注,我将持续更新高质量内容,你的支持是我前进的动力!🎉🎉🎉
22 0
|
2月前
|
Python
Python生成器、装饰器、异常
【10月更文挑战第15天】
|
2月前
|
传感器 大数据 数据处理
深入理解Python中的生成器:用法及应用场景
【10月更文挑战第7天】深入理解Python中的生成器:用法及应用场景
62 1
|
2月前
|
存储 数据处理 Python
深入解析Python中的生成器:效率与性能的双重提升
生成器不仅是Python中的一个高级特性,它们是构建高效、内存友好型应用程序的基石。本文将深入探讨生成器的内部机制,揭示它们如何通过惰性计算和迭代器协议提高数据处理的效率。
|
1月前
|
存储 程序员 数据处理
深入理解Python中的生成器与迭代器###
本文将探讨Python中生成器与迭代器的核心概念,通过对比分析二者的异同,结合具体代码示例,揭示它们在提高程序效率、优化内存使用方面的独特优势。生成器作为迭代器的一种特殊形式,其惰性求值的特性使其在处理大数据流时表现尤为出色。掌握生成器与迭代器的灵活运用,对于提升Python编程技能及解决复杂问题具有重要意义。 ###
|
2月前
|
存储 大数据 数据处理
Python 中的列表推导式与生成器:特性、用途与区别
Python 中的列表推导式与生成器:特性、用途与区别
29 2
|
2月前
|
存储 大数据 Python
Python 中的列表推导式和生成器
Python 中的列表推导式和生成器
22 1
|
3月前
|
机器学习/深度学习 设计模式 大数据
30天拿下Python之迭代器和生成器
30天拿下Python之迭代器和生成器
21 3