Python 高级特效 - 生成器 ( Generator)

2024-09-01 00:52

本文主要是介绍Python 高级特效 - 生成器 ( Generator),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    生成器是一种一边循环一边计算的机制,通过列表生成式,可以直接创建一个列表,但是受到内存的限制,列表容量是有限的,当列表元素很大的时候,会很浪费内存空间。所以可以通过生成器 Generator 生成,它的作用相比列表,内存占用少,节约资源。


    创建生成器有两种方法,一种是把列表生成式的中括号 [ ] 改成小括号 ( ),一种是函数中包含yield关键字。


    1.列表生成式与生成器


    可见,列表生成式和生成器的类型分别为 列表 (list) 和 生成器(generator)



在这里插入图片描述



print(type([x * 2 for x in range(1,10)]))print(type((x * 2 for x in range(1, 10))))


    对比列表和生成器占用内存的字节,分别为 168 和 96,这好像区别不太大



在这里插入图片描述



lst = [x * 2 for x in range(1, 10)]
lst_generator = (x * 2 for x in range(1, 10))print(lst.__sizeof__())
print(lst_generator.__sizeof__())


    当选取的范围增大到10000000后,就有非常明显的差别,可见列表占用内存明显是增大好多倍,和范围值成正比,也就说明列表里的元素越多,占用的内存资源就越大。因此,生成器是有明显的优势。



在这里插入图片描述



lst = [x * 2 for x in range(1, 10000000)]
lst_generator = (x * 2 for x in range(1, 10000000))print(lst.__sizeof__())
print(lst_generator.__sizeof__())


    2.函数生成器


    假如要读取一个大文本文件,如果使用列表推导式写起来会比较麻烦,也不易于阅读,此时可以用函数来实现。



在这里插入图片描述



def read_large_file(file):with open(file=file, encoding="utf8") as f:lines = f.readlines()for line in lines:yield linefor i in read_large_file("c:/test_file.txt"):print(i)


    上一期介绍了递归中 斐波那契数列,也可以用函数生成器的写法实现。yield相当于 return 返回一个值,并且记住这个返回值的位置,下次迭代时,代码从yield的下一条语句开始执行。



在这里插入图片描述



def fib(number):"""number表示最大数量"""n, a, b = 0, 0, 1while n < number:yield ba, b = b, a + bn = n + 1for i in fib(10):print(i)


    那么,生成器怎样去实现取值呢? 生成器也有迭代的属性,也可以理解为它也是迭代器。可以用 next()函数去获取,它是Python内置的函数之一,用于迭代器对象中获取下一个元素。它接受一个迭代器对象作为参数,并返回迭代器对象的下一个数据元素。如果迭代器对象已经到达末尾,则抛出StopIteration异常。



    分别取2个值



在这里插入图片描述



generator = (x*2 for x in range(1,3))print(next(generator))
print(next(generator))


    当超出 range 取值范围时,会抛出异常



在这里插入图片描述



generator = (x*2 for x in range(1,3))print(next(generator))
print(next(generator))
print(next(generator))


    刚才说了,既然生成器也是有迭代属性,那么我们就不需要逐个用 next() 方法去获取值,直接用循环就可以了。



在这里插入图片描述



generator = (x*2 for x in range(1,3))for i in generator:print(i)


    但作为迭代器的循环和普通列表循环是有区别的,迭代器循环完成遍历后,再运行第二次循环,返回的是空值,而不像列表那样,可以无限执行循环取值。



在这里插入图片描述



generator = (x*2 for x in range(1,3))for i in generator:print(i)for i in generator:print(i)


    最后简单介绍字典作为迭代器的取值默认属性为 Key, 其中 iter() 函数是可以把有序序列转变为迭代器。



在这里插入图片描述



dict = {'one':1, 'two':2, 'three':3}
iter_dict = iter(dict)for i in iter_dict:print(i)


    同样,也可以取字典迭代器的 value, 可以通过字典取value,再转换迭代器,这里不再重复演示。

这篇关于Python 高级特效 - 生成器 ( Generator)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125483

相关文章

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

Python xmltodict实现简化XML数据处理

《Pythonxmltodict实现简化XML数据处理》Python社区为提供了xmltodict库,它专为简化XML与Python数据结构的转换而设计,本文主要来为大家介绍一下如何使用xmltod... 目录一、引言二、XMLtodict介绍设计理念适用场景三、功能参数与属性1、parse函数2、unpa

Mybatis官方生成器的使用方式

《Mybatis官方生成器的使用方式》本文详细介绍了MyBatisGenerator(MBG)的使用方法,通过实际代码示例展示了如何配置Maven插件来自动化生成MyBatis项目所需的实体类、Map... 目录1. MyBATis Generator 简介2. MyBatis Generator 的功能3

Python中使用defaultdict和Counter的方法

《Python中使用defaultdict和Counter的方法》本文深入探讨了Python中的两个强大工具——defaultdict和Counter,并详细介绍了它们的工作原理、应用场景以及在实际编... 目录引言defaultdict的深入应用什么是defaultdictdefaultdict的工作原理

Python中@classmethod和@staticmethod的区别

《Python中@classmethod和@staticmethod的区别》本文主要介绍了Python中@classmethod和@staticmethod的区别,文中通过示例代码介绍的非常详细,对大... 目录1.@classmethod2.@staticmethod3.例子1.@classmethod

Python手搓邮件发送客户端

《Python手搓邮件发送客户端》这篇文章主要为大家详细介绍了如何使用Python手搓邮件发送客户端,支持发送邮件,附件,定时发送以及个性化邮件正文,感兴趣的可以了解下... 目录1. 简介2.主要功能2.1.邮件发送功能2.2.个性签名功能2.3.定时发送功能2. 4.附件管理2.5.配置加载功能2.6.