文章目录
前言
生成器是Python中非常有用的一种迭代器(迭代器和生成器有何区别,后续详解),其可以实现惰性计算和节省内存的特性。
本文将深入讲解生成器的定义、使用和注意事项,并附有实用的示例代码。
一、生成器的定义
生成器是一种能够实现惰性计算、延迟执行和节省内存的迭代器。在Python中,通过yield语句实现生成器。
生成器中的函数不是直接返回一个值,而是返回一个生成器对象。取值时,通过next()方法或for循环操作获取生成器对象中的值。
二、生成器的使用场景
生成器适合于处理大数据量和耗时操作的场景,例如遍历文件或网络数据流、CPU密集型计算、图像处理等。生成器可以逐个读取大文件,并且不必将整个文件加载到内存中,避免了内存消耗和IO操作的额外开销。
三、如何定义生成器
生成器可以使用多种方式进行定义,包括通过函数、生成器类以及生成器表达式等。
1. 使用函数实现生成器
使用函数实现生成器是一种常见的方式,示例如下:
def fib(max):a, b = 0, 1while a < max:yield aa, b = b, a + bfor n in fib(1000):print(n, end=“,”)
其中,使用yield语句实现惰性计算,返回一个生成器对象。在for循环中迭代生成器对象输出斐波那契数列。
2. 使用生成器类实现生成器
使用生成器类可以实现更为复杂的生成器,例如在遍历数据库查询结果时,需要返回多个字段。示例如下:
class QueryResutl:def init(self):self.items = []self.index = 0def query(self):while True:if self.index >= len(self.items):raise StopIterationresult = self.items[self.index]self.index += 1yield resultdef add(self, item):self.items.append(item)
上述案例中,QueryResutl类包含了一个items列表和一个索引index,通过query()方法实现返回一个生成器对象。在add()方法中添加新的元素,query()方法中使用yield语句实现惰性计算和延迟执行。
3. 使用生成器表达式实现生成器
生成器表达式是一种简洁、方便的生成器定义方式,其语法类似于列表推导式。示例如下:
gen = (i ** 2 for i in range(1, 10))for n in gen:print(n, end=“,”)
其中,使用生成器表达式定义了一个生成器对象gen,包含1~9的平方值,并迭代输出结果。
四、生成器实现简单的异步操作和携程调度
下面是一个用生成器实现异步操作和携程调度的简单案例,供参考:
import timedef task1():while True:print(“task 1”)yieldtime.sleep(1)def task2():while True:print(“task 2”)yieldtime.sleep(1)def main():t1 = task1()t2 = task2()while True:next(t1)next(t2)if name == “main”:main()
运行效果
在上述代码中,我们定义了两个任务函数task1和task2,它们都采用了生成器的形式。每个生成器循环调用时,打印当前任务的名称,然后暂停1秒钟。在main()函数中,我们通过创建两个任务的生成器t1和t2,依次轮流执行它们,来模拟异步操作和携程调度。
我们运行上述程序后可以看到,输出结果会交替显示 “task 1” 和 “task 2”,说明两个任务在进行携程调度,而且不会阻塞程序的执行。
需要注意的是,生成器的yield语句实现了协程的特性,它取决于next()方法来驱动生成器函数的执行。因此,在main()函数中先执行t1的next()方法,再执行t2的next()方法,反复循环调度任务。
当然,也可以使用asyncio库等更高级的工具来实现异步操作和协程调度。
五、使用生成器注意事项
Python生成器是一种非常实用的编程技巧,可以实现惰性计算、延迟执行和节省内存等特性。但使用时需要注意下面几点:
生成器中的函数不会一次性执行完,而是通过yield语句实现惰性计算。对于一些需要及时释放资源的操作,应在代码中显式调用close()方法,以释放内存。yield语句中的表达式计算结果不会直接返回,而是暂停函数的执行,并返回生成器对象,等待下个next()方法或for循环的调用。生成器可以实现迭代器的所有功能,包括__next__()和__iter__()方法。可以通过使用__iter__()方法返回自身实例来实现无限迭代器。(后续介绍)生成器可以实现协程的功能,用于异步操作和携程调度。通过准确地使用生成器,可以极大地提高程序的效率和可读性。怎么样,这个技能你GET到了吗?
-END-
一、Python入门
下面这些内容是Python各个应用方向都必备的基础知识,想做爬虫、数据分析或者人工智能,都得先学会他们。任何高大上的东西,都是建立在原始的基础之上。打好基础,未来的路会走得更稳重。所有资料文末免费领取!!!
包含:
计算机基础
python基础
Python入门视频600集:
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
二、Python爬虫
爬虫作为一个热门的方向,不管是在自己兼职还是当成辅助技能提高工作效率,都是很不错的选择。
通过爬虫技术可以将相关的内容收集起来,分析删选后得到我们真正需要的信息。
这个信息收集分析整合的工作,可应用的范畴非常的广泛,无论是生活服务、出行旅行、金融投资、各类制造业的产品市场需求等等,都能够借助爬虫技术获取更精准有效的信息加以利用。
Python爬虫视频资料
三、数据分析
清华大学经管学院发布的《中国经济的数字化转型:人才与就业》报告显示,2025年,数据分析人才缺口预计将达230万。
这么大的人才缺口,数据分析俨然是一片广阔的蓝海!起薪10K真的是家常便饭。
四、数据库与ETL数仓
企业需要定期将冷数据从业务数据库中转移出来存储到一个专门存放历史数据的仓库里面,各部门可以根据自身业务特性对外提供统一的数据服务,这个仓库就是数据仓库。
传统的数据仓库集成处理架构是ETL,利用ETL平台的能力,E=从源数据库抽取数据,L=将数据清洗(不符合规则的数据)、转化(对表按照业务需求进行不同维度、不同颗粒度、不同业务规则计算进行统计),T=将加工好的表以增量、全量、不同时间加载到数据仓库。
五、机器学习
机器学习就是对计算机一部分数据进行学习,然后对另外一些数据进行预测与判断。
机器学习的核心是“使用算法解析数据,从中学习,然后对新数据做出决定或预测”。也就是说计算机利用以获取的数据得出某一模型,然后利用此模型进行预测的一种方法,这个过程跟人的学习过程有些类似,比如人获取一定的经验,可以对新问题进行预测。
机器学习资料:
六、Python高级进阶
从基础的语法内容,到非常多深入的进阶知识点,了解编程语言设计,学完这里基本就了解了python入门到进阶的所有的知识点。
到这就基本就可以达到企业的用人要求了,如果大家还不知道去去哪找面试资料和简历模板,我这里也为大家整理了一份,真的可以说是保姆及的系统学习路线了。
但学习编程并不是一蹴而就,而是需要长期的坚持和训练。整理这份学习路线,是希望和大家共同进步,我自己也能去回顾一些技术点。不管是编程新手,还是需要进阶的有一定经验的程序员,我相信都可以从中有所收获。
一蹴而就,而是需要长期的坚持和训练。整理这份学习路线,是希望和大家共同进步,我自己也能去回顾一些技术点。不管是编程新手,还是需要进阶的有一定经验的程序员,我相信都可以从中有所收获。
资料领取
上述这份完整版的Python全套学习资料已经上传网盘,朋友们如果需要可以微信扫描下方二维码输入“领取资料” 即可自动领取
或者
【点此链接】领取
![](https://i-blog.csdnimg.cn/blog_migrate/4666915b951516b61b37afd669761da0.png)