原标题:「Python基础知识」Python生成器函数

对于程序而言,内存也是很重要的,因为程序中很多数据都是保存在内存中的,如果内存中存储的数据过多,那么系统就会崩溃,这是人们不希望发生的。

可以采用生成器推导式来解决内存不足的问题。例如,利用生成器推导式创建一个生成器n,数据为1~33数字,可以写成n = (i for i in range(1, 34))。这样当程序需要一个数时,程序才生成数据,可以节省内存。然而生成器推导式太过简单,只能用一行代码的形式实现,如果要创建复杂的生成器,如创建一个生成器f,生成前10个斐波那契数字,生成器推导式已经不能满足需求了,因为斐波那契数列最开始的两个数都无法赋值。

函数可以实现复杂的功能,然而要节省内存,就需要使用生成器函数。生成器函数与普通函数的区别是函数中包含关键字yield。实际上只要含有yield关键字的函数就是生成器函数。

生成器函数是用函数实现生成器。定义生成器函数的语法格式如下:

>>> def fib(): # 定义生成器函数 ... a, b = 1, 1 # 定义初始值 ... while True: ... yield a # 暂停执行,返回一个新变量值 ... a, b = b, a+b ... >>> a= fib() # 调用生成器函数 >>> for i in range(10): ... print(next(a)) # 调用生成器函数的yield生成值 ... 1 1 2 3 5 8 13 2134 55

def 函数名(参数):

函数体

yield 变量名

函数体

由语法格式可知,生成器函数与普通函数的区别在于函数体部分,生成器函数的函数体含有“yield 变量名”语句。yield的功能类似于return,return是函数返回值,yield的功能也是返回变量,但是它仅返回变量而不退出函数,因此,yield可以看作是多次返回变量且不会退出函数的return。

在调用生成器函数时,写上函数名与参数,并通过一个变量接收返回值,语法格式如下:

变量名 = 函数名(参数)

调用生成器函数的yield生成值的第一种方法如下:

next(变量名)

第二种方法如下:

变量名.__next__()

在掌握了生成器函数的定义和调用之后,就可以使用生成器函数实现生成前10个斐波那契数字的案例了。这个案例主要分为三步,第一步是定义生成器函数,第二步是调用并赋值,第三步是打印结果,代码如下:

在上述程序中,首先定义生成器函数fib(),函数内先定义斐波那契数列的两个初始值,再写一个while True死循环。这个死循环有些特别,先是用yield生成待使用的数字,再通过赋值语句“a, b = b, a+b”将b的值赋给a,将a+b的值赋给b,每次循环都是如此。然后调用生成器函数fib(),再调用生成器函数的yield生成值,最后打印结果。由于需要生成前10个斐波那契数字,因此可以采用for循环,每循环一次生成并打印一个斐波那契数字,共循环10次。第一次循环时,调用yield生成值a,即1;第二次循环时,调用yield生成值a,a被赋值成b的值,即1,而b被赋值成a+b的值,即2;第三次循环时,调用yield生成值a,a被赋值成b的值,而此时b的值是上次赋值的a+b的值,即2……以此类推,就得到了整个斐波那契数列。返回搜狐,查看更多

责任编辑:

python程序如何执行死刑_「Python基础知识」Python生成器函数相关推荐

  1. java里面string什么意思_「Java基础知识」Java中的字符串是什么

    原标题:「Java基础知识」Java中的字符串是什么 字符串顾名思义就是一些字符组合在一起组成的一串数据,称作字符串,在Java中字符串用双引号包围起来,格式为String string = &quo ...

  2. java代码规范插件_「Java基础知识」代码规范插件怎么用

    原标题:「Java基础知识」代码规范插件怎么用 在开发中,好的编程风格可以提升团队合作能力,提升开发的效率,但是每个人都有自己的编程习惯,如何能够将大家的编程风格统一,这个在团队中也很重要; 在Jav ...

  3. python根据年月日计算天数_「每日一练」Python实现输入年月日计算第几天

    程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于2时需考虑多加一天: 前三行: year = int(input('年:\n')) mon ...

  4. python爬虫抓包工具_「docker实战篇」python的docker爬虫技术-fiddler抓包软件详细配置(七)...

    挑选常用的功能给各位老铁介绍下. fiddler 第一次进入fiddler fiddler会请求fiddler的官网,检查更新操作 布局分布 工具栏 File -capture traffic 开启爬 ...

  5. 你的app是由旧版打造_「软件测试基础知识」Web APP和原生 APP的不同

    原生APP访问和兼容的能力也比较好,可以支持在线或者离线消息推送或是进行本地资源访问,以及摄像.拨号.蓝牙.功能的调取.原生APP开发有许多的优势,如原生APP是针对不同的平台为用户提供不同的体验.节 ...

  6. java里面value_「Java基础知识」Java中包含哪些运算符

    原标题:「Java基础知识」Java中包含哪些运算符 在Java中包含的运算符有:算数运算符,逻辑运算符,关系运算符等. 算数运算符也就是我们平时的加减乘除余等操作:在Java中都是将右边的值赋值给左 ...

  7. linux 筛选文件,「Linux基础知识」grep文件内容筛选命令的使用

    原标题:「Linux基础知识」grep文件内容筛选命令的使用 grep命令用于从文档中抓取显示包含指定字符的行,grep命令的使用格式如下: grep [选项] 匹配模式 文件1 文件2 ...... ...

  8. python docker自动化_「docker实战篇」python的docker爬虫技术-移动自动化控制工具appium工具(17)...

    原创文章,欢迎转载.转载请注明:转载自 IT人故事会,谢谢! 原文链接地址: 「docker实战篇」python的docker爬虫技术-移动自动化控制工具appium工具(17) Appium是一个开 ...

  9. python列表框_「每日一练」Python列表框部件的运用

    原标题:「每日一练」Python列表框部件的运用 用Python就一定要用到界面操作,有一个好的用户界面,才会有好的用户体验,下边就开始创建我们的主窗口,并设置相应的列表框部件吧! 案例 创建主窗口, ...

最新文章

  1. 神策数据CEO桑文锋:精准采集数据,走向智能化分析
  2. Linux系统下如何安装JDK?
  3. log nginx 客户端请求大小_nginx log记录请求响应时间
  4. python dlib 年龄 性别_python dlib学习(一):人脸检测
  5. android uber启动动画,仿 Uber 视频背景登录界面以及登录动画
  6. phper需要掌握的技能(简)
  7. python安装pil库-python第三方库PIL.Image安装
  8. mysql忽略大小写 chmod_Ubuntu18.04下Mysql8.0.15关闭大小写敏感
  9. 微服务架构:统一身份认证和授权技术解决方案
  10. 创建一个简单的MFC程序
  11. win7美化_win7/8/10桌面插件美化
  12. html重复渐变包括,CSS3怎么实现重复线性渐变效果
  13. python元组是什么意思_python元组是什么意思
  14. 分组卷积与DW卷积、Residuals与Inverted Residuals、bottleneck与linearbottleneck
  15. Elasticsearch 6.4 ingest-attachment对office文件IK分词器全文检索(1) HttpAPI使用
  16. 推荐 :数据科学与大数据技术专业特色课程研究
  17. iOS10 新特性-新功能,以及ReplayKit库
  18. 一文掌握java对内存空间的划分
  19. SecureCRT标签永久显示IP地址
  20. 在jsp页面中使用My97DatePicker日期控件

热门文章

  1. mysql批量存图片_教你如何在MySQL数据库中直接储存图片(3)
  2. can总线报文是固定的吗_CAN总线负载率的计算方式
  3. arp协议的主要功能是_计算机网络之ARP协议
  4. springcloud五大组件?注解_spring cloud实现简单的微服务架构
  5. javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair
  6. 生产者消费者模式-java原生、Disruptor实现方案
  7. git 报错does not have a commit checked out
  8. Java之final关键字详解
  9. win10系统资源管理器打开反应很慢如何解决
  10. [绝对原创]从VS2003(.net1.1)升级到vs2005(.net2.0)全程跟踪记录