python生成器

生成器的使用场景:
通常创建了一个数据量很大的,如一百万个元素的数据,需要很大的存储空间,而我们通常仅仅需要其中的几百个或几个,而其他用不上的数据则比较占用空间,这时就需要用到生成器

  1. 生成器是特殊的迭代器
  2. 生成器只存储算法,不存储数据
  3. 生成器是一边循环一边执行的计算机制
  4. 主要作用:节省内存,提高算法效率

生成器的第一种写法(简易版)

g = (x for x in range(10))

从collections包中导入Iterable,Iterator
判断g的数据类型

print(isinstance(g,Iterator)) >>>True
print(isinstance(g,Iterable)) >>>True

都返回True,说明生成器既可以迭代,同时也是一种特殊的迭代器
可以通过next()方法唤醒生成器

print(next(g)) >>> 0
print(next(g)) >>> 1
print(next(g)) >>> 2
...

使用next()方法超出范围后,会报错 StopIteration
可用for循环去迭代,因为for循环可以自动捕获StopIteration,然后跳出,不会报错,所以通常使用for循环去迭代生成器

for i in g:print(i)

第二种生成器写法(用于复杂算法)

使用生成器实现斐波那契数列(兔子问题)

def FB(month):m = 0a, b = 0, 1while m < month:yield b # yield 是区别函数和生成器的关键字a, b = b, a + bm += 1# 一旦函数中存在有yield关键字,这个函数就是一个生成器

yield的简单理解:

yield是时停版的“return”,既具有return的返回功能,同时附加了时停的替身,每当程序运行到yield的位置时,都会先返回yield后面的值,然后暂停函数,下一次继续调用函数的时候,从yield的后面开始运行

yield生成器函数的取值 注意点

在使用next()或者__next__方式取值的时候,需要注意函数的引用问题,如果不先将函数赋值给其他变量,会导致无论打印多少次出来的值都是同一个值,如下所示:

 # 不赋值变量,直接打印数据,所有结果均为1# 相当于每一次都重新启用FB()函数,然后往里面传值print(next(FB(9)))            >>> 1print(next(FB(9)))            >>> 1print(next(FB(9)))            >>> 1print(next(FB(9)))            >>> 1print(next(FB(9)))            >>> 1print(next(FB(9)))            >>> 1print(FB(9).__next__())       >>> 1print(FB(9).__next__())       >>> 1print(FB(9).__next__())       >>> 1print(FB(9).__next__())       >>> 1print(FB(9).__next__())       >>> 1print(FB(9).__next__())       >>> 1print(FB(9).__next__())       >>> 1...

将函数赋值给变量后,再使用next()或__next__方法打印数据

 #将FB(9)赋值给变量a后,再打印数据a = FB(9)print(next(a))     >>> 1print(next(a))    >>> 1print(next(a))    >>> 2print(next(a))    >>> 3print(next(a))    >>> 5print(next(a))    >>> 8print(next(a))    >>> 13...

多个yield的用法

def sendTest():while True:v = yield 'hello world'r = yield va = yield ryield aif __name__ == '__main__':test = sendTest()print(test.__next__()) # 返回第一个yield后面的'hello world'print(test.__next__()) # 第一个yield抛出'hello world'后,为None,赋值给v,第二个yield返回Noneprint(test.__next__())# 同上print(test.__next__())# 同上# 输出结果>>> hello world>>> None>>> None>>> None

使用yield关键字的函数,配合send()方法,还支持从外部传入参数进去


def sendTest():               while True:               v = yield 'hello worldr = yield v   # 当第二个print执行的时候,send传送的‘空条承太郎’会赋值给 v,所以第二个yield抛出‘空条承太郎’后,为None     a = yield r           yield a               if __name__ == '__main__':    test = sendTest()         print(test.__next__())    print(test.send('空条承太郎'))    print(test.__next__())    print(test.__next__())    # 输出结果>>> hello world>>> 空条承太郎>>> None>>> None

在使用send()方法往里面传参的时候,如果未先使用next()或__next__方法唤醒生成器,则会报错,报错示范如下:

def sendTest():               while True:               v = yield 'hello worldr = yield v      a = yield r           yield a               if __name__ == '__main__':    test = sendTest()         print(test.send('空条承太郎'))    print(test.__next__())    print(test.__next__())  # 输出结果>>> TypeError: can't send non-None value to a just-started generator

python3.8 三利器之 生成器相关推荐

  1. 【自然语言处理NLP】三句半自动生成器

    基于LSTM的三句半生成器 训练语料数据集:三句半语料数据集 实现模型:双层LSTM 运行环境:Windows+pycharm+python3.6+tensorflow2.0 模型参考:LSTM古诗生 ...

  2. Python3 中打的迭代器与生成器

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...

  3. python三大器,Python 入门之 Python三大器 之 生成器

    Python 入门之 Python三大器 之 生成器 1.生成器 (1)什么是生成器? 核心:生成器的本质就是一个迭代器 迭代器是Python自带的 生成器程序员自己写的一种迭代器 def func( ...

  4. python3中 三个点是啥意思?

    python3中 三个点是啥意思? 问题引入 前段时间 看 fastapi 代码的时候, 看类型注解的部分 经常出现 ... 这样的东西,我就不理解 这是什么意思呢? 比如 像下面这个参数 的类型注解 ...

  5. python3(函数、生成式、生成器)

    1.python内置数据结构总结 数值: bool str list tuple set dict 可变数据类型 不可变数据类型 可变数据类型:list set dict(是否可以增删改查) 有序数据 ...

  6. 在CentOS上安装Python3的三种方法

    Centos7默认自带了Python2.7版本,但是因为项目需要使用Python3.x你可以按照此文的三个方法进行安装. 注:本文示例安装版本为Python3.5, 一.Python源代码编译安装 安 ...

  7. 平板安装python_在CentOS上安装Python3的三种方法

    Centos7默认自带了Python2.7版本,但是因为项目需要使用Python3.x你可以按照此文的三个方法进行安装. 注:本文示例安装版本为Python3.5, 一.Python源代码编译安装 安 ...

  8. linux安装python3.7的步骤_centos7安装python3 的三种方式

    Centos7默认自带了Python2.7版本,但是因为项目需要使用Python3.x你可以按照此文的三个方法进行安装. 安装必要工具 yum-utils ,它的功能是管理repository及扩展包 ...

  9. 设计模式(三):生成器模式

    这是设计模式系列文章的第三篇 之前两篇的阅读效果不是很好,我一度怀疑这种题材的文章不受大家欢迎,直到前两天我面试了一个小姐姐... 面试过程中和小姐姐聊起她在上家公司做过的项目,其中有一个功能,根据小 ...

最新文章

  1. 项目开发过程中的收获与思考
  2. 我眼里的Exchange 2010 之:1—DAG
  3. python新手程序员工资-程序员吐槽新同事:连我实习水平都不到,工资是我的1.7倍...
  4. Eclipse 中 SDK无法更新---解决方法
  5. bootstrap-table表格插件的使用案例
  6. Java小结(四)——折半查找、选择排序、冒泡排序
  7. 通用网站备案常见的备案场景及要求
  8. python爬虫 去哪网数据分析
  9. 老员工恳请加薪,老板“不愿意做就辞职”
  10. 【JavaScript】运算符及其优先级
  11. html+js实现注册页面及信息验证
  12. jsp——SmartUpload上传下载
  13. 【群晖Nas开启WebDAV服务,路由器映射端口,实现Win10远程映射网路驱动器】
  14. 写空到linux文件系统,谢烟客---------Linux之文件系统及其命令
  15. Python requirement的使用
  16. 百度搜索结果的URL参数 搜索历史记录(rsv_sug)
  17. 广东省民营企业合作交流协会会长谭铭卓一行到访
  18. 联想拯救者Y7000,电源键一直红灯。还以为电池出问题了,其实....
  19. 《团队软件过程(修订版)》—第2章2.3节团队是什么
  20. 实数系的基本定理_继续学习贝叶斯定理

热门文章

  1. ps122260玉兔福满中秋中秋节ps海报
  2. 推荐几个免费dns服务器
  3. mfc对话框操作及命令行窗口隐藏
  4. IDEA 热部署快捷键
  5. java地狱_解决java回调地狱的方法
  6. 转录组高级分析和数据可视化技术研讨会(2023.9)
  7. 【Python小技巧】将pdf转为txt,并使用edge-tts将txt批量转为MP3(不想看书想听书的转过来,送源代码)
  8. Android实时监测网络连接状态及网络是否可用,类似微信的功能。
  9. javascript的findIndex()方法
  10. java tcp 心跳机制_java 心跳机制