我们可以通过列表生成式简单直接地创建一个列表,但是受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,而且如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。

要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:>>> mylist = [ x for x in range(1, 10)]

>>> mylist

[1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> gen = (x for x in range(1,10))

>>> gen

at 0x7f1d7fd0f5a0>

创建mylist和gen的区别仅在于最外层的[]和(),mylist是一个list,而gen是一个generator(生成器)。

我们可以直接打印出list的每一个元素,但我们怎么打印出generator的每一个元素呢?

如果要一个一个打印出来,可以通过generator的next()方法:>>> gen.next()

1

>>> gen.next()

2

>>> gen.next()

3

...

>>> gen.next()

9

>>> gen.next()

Traceback (most recent call last):

File "", line 1, in

StopIteration

我们讲过,generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

其实我们可以使用for循环来代替next()方式, 这样才更符合高效的编程思路:>>> gen = ( x for x in range(1, 10))

>>> for num in gen:

...     print num

...

1

2

3

4

5

6

7

8

9

generator非常强大。如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。

比如,著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:1, 1, 2, 3, 5, 8, 13, 21, 34, ...

斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:def fib(max):

n = 0

a, b = 0, 1

while n

print b

a, b = b, a + b

n = n + 1

上面的函数可以输出斐波那契数列的前N个数:>>> fib(6)

1

1

2

3

5

8

仔细观察,可以看出,fib函数实际上是定义了斐波拉契数列的推算规则,可以从第一个元素开始,推算出后续任意的元素,这种逻辑其实非常类似generator。

也就是说,上面的函数和generator仅一步之遥。要把fib函数变成generator,只需要把print b改为yield b就可以了:def fib(max):

n = 0

a, b = 0, 1

while n

yield b

a, b = b, a + b

n = n + 1

这就是定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:>>> fib(6)

这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

举个简单的例子,定义一个generator,依次返回数字1,3,5:>>> def odd():

...     print 'step 1'

...     yield 1

...     print 'step 2'

...     yield 3

...     print 'step 3'

...     yield 5

...

>>> o = odd()

>>> o.next()

step 1

1

>>> o.next()

step 2

3

>>> o.next()

step 3

5

>>> o.next()

Traceback (most recent call last):

File "", line 1, in

StopIteration

更多:数据采集卡支持python么深入理解Python生成器(Generator)

https://www.002pc.comhttps://www.002pc.com/python/1759.html

你可能感兴趣的生成器,Python,Generator,深入,理解

js加密数据ext 代码生成器

www.002pc.com认为此文章对《ext 代码生成器》说的很在理。 代码如下: var productsgrid; var produc

mysql如何创建唯一约束条件Generator 插件开发

Generator 插件开发:简单开发实例地址:欢迎下载 http://download.csdn.net/detail/ht_00001/95149221 继承:org.mybatis.generator.api.PluginAdapter

js后台数据变慢深入理解Vue router的部分高级用法

1.路由元信息学习电脑网从深入理解Vue router的部分高级用法分析来看,对深入理解Vue router的部分高级

mysql增加只读用户MySQL SQL Tuning:深入理解Order By_MySQL

bitsCN.com

MySQL SQL Tuning:深入理解Order By 在MySQL中ORDER BY按先后顺序有2种实现方式,先走索引无排序,如果不行,则用FILESORT走索引无排序需要满足

js中的push深入理解JS中Number(),parseInt(),parseFloat()三者比较

参考阅读:学习电脑网对《深入理解JS中Number(),parseInt(),parseFloat()三者比较》总结来说,为我们帝国cms模板制作很实用。

php如何读取exe文件内容PHP生成随机密码类分享

php/** * PHP - Password Generator Class * Version 1.0.0 * */ if (@!is_object($passGen) || !

php 视频续播PHP生成随机字符串(3种方法)

如用户注册生成随机密码,用户重置密码也需要生成一个随机的密码。随机密码也就是一串固定长度的字符串,文章整理了几种生成随机字符串的方法。

方法一

1、在33 � 126中生成一个

php 打印字体使用PHP生成二维码

随着科技的进步,二维码应用领域越来越广泛,本站之前已有文章介绍通过使用jQuery插件来生成二维码,今天我给大家分享下如何使用PHP生成二维码,以及如何生成中间带LOGO图像的二维

用vs做phpphp Smarty模板生成html文档的方法

下面直接发代码 复制代码www.002pc.com从用vs做phpphp Smarty模板生成html文档的方法分析来看,对用vs做phpphp Smarty模板生成html文档的方法的结果。

0踩

0 赞

python数据采集仪_数据采集卡支持python么深入理解Python生成器(Generator)相关推荐

  1. python正则化_如何最简单、通俗地理解Python的正则化?

    目录: 一.笔记 二.我的自学路线 三.笔记目录 一.笔记 ① 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. ② 正则表达式中包含两个部分,一个是正则语法对应的字 ...

  2. 彻底理解python递归_如何最简单、通俗地理解Python的递归?

    这是从林海峰博客里面copy的.很好的解释了,python函数的递归. 那什么是递归? 在函数内部,可以调用其他函数.如果在调用一个函数的过程中直接或间接调用自身本身 递归的样子 def digui( ...

  3. 大学使用python 编辑器_[雪峰磁针石博客]2018 最佳python编辑器和IDE

    IDE没有统一的标准,自己习惯就是最好的.本文列出一些较常用的IDE,供大家参考. 一般而言,WingIDE.PyCharm.Spyder.Vim是比较常用的IDE. Spyder Spyder是Py ...

  4. 逻辑性不好可以学python吗_如果本文若未能让你学会“Python”,可能真的不适合学习Python...

    很多小伙伴们会问学习Python难学吗? python就是以他简单易学出名的.几乎是现在最简单,却可塑性最高的语言了.一般有其它编程语言基础的,自学,三小时左右就能学会.现在Python都有给小朋友的 ...

  5. Python 2.x 即将终止支持,是时候和 Python 2 讲再见了

    别再约束自己了,Python 2将在2020年寿终正寝. Python 2的报废(EOL)日期迟迟未到,不过现在终于有了眉目.自2020年1月1日起,Python 2将不再得到支持.Python的核心 ...

  6. ubuntu安装python百度经验_如何在Ubuntu 20.04上安装Python 3.9(含python编译安装和使用Apt命令安装)...

    在本文中,我们将向您展示在Ubuntu 20.04上安装Python 3.9的两种方法.第一种使用APT命令安装Python3.9,第二种是在Ubuntu20.04上编译安装Python 3.9.本教 ...

  7. python优点是代码库支持、灵活_C++和Python混合编程的利器

    Python是一种简单易学.功能强大的编程语言,它有高效率的高层数据结构,能简单而有效地实现面向对象编程.Python简洁的语法.对动态输入的支持和解释性语言的本质,使得它在很多领域的大多数平台上都是 ...

  8. excel用python数据分析_(转载)像Excel一样使用python进行数据分析

    Excel是数据分析中最常用的工具,本篇文章通过python与excel的功能对比介绍如何使用python通过函数式编程完成excel中的数据处理及分析工作.在Python中pandas库用于数据处理 ...

  9. python类加载_如何重新加载一个类在python shell?

    如果我导入一个定义了属于同一个包的同名类的模块,它将被导入为一个类,而不是一个模块,因为父包的__init__.py.详情请参见 different import results at differe ...

最新文章

  1. OSPF 疑重难要14点--转屎壳Q岛的一个文章
  2. 成功解决ModuleNotFoundError: No module named ‘sklearn.grid_search‘
  3. 远程服务器任务,远程大批量操作windows服务器的计划任务
  4. 准备程序员面试?你需要了解这 14 种编程面试模式
  5. php mysql sqlite缓存_使用sqlite作为数据缓存
  6. 特斯拉明年会有100万辆自动驾驶出租车 你敢坐吗?
  7. ORB_SLAM 编译过程详解
  8. NLP在医学领域的应用(更新中)
  9. at91sam9260 开发环境的建立
  10. 英伟达、英特尔、AMD显卡设置,减少游戏掉帧卡顿
  11. 通过CCproxy配置内网linux服务器
  12. 数据通信与网络:CH5 Analog Transmission
  13. QQ被盗后被敲诈500元怎么办
  14. 【C#】两种方式实现给PDF文件加水印,源码分享
  15. s32k144 isystem linux,S32k144 简易 Bootloader
  16. acme.sh申请Let‘s encrypt泛域名证书Docker化部署
  17. 小红书X千瓜联合发布|小红书2021年4月创作者红人榜
  18. Linux C 编程内存泄露检测工具(二):memwatch
  19. 景深决定照相机什么特性_行政执法考试题库2017 2017摄影专业考试题库
  20. espnow 例程解析

热门文章

  1. 魅族16spro锁回BL(Bootloader) 恢复微信指纹
  2. Svelte入门——Web Components实现跨框架组件复用(二)
  3. 计算机如何制作表格基础,计算机基础教程(Word表格制作)
  4. 【SAP】 SAP自定义权限对象
  5. 版本管理·玩转git(团队合作)
  6. Revit 绘制幕墙系统
  7. C++ 使用Poco库操作 json 文件
  8. 假设检验:如何理解单侧、双侧检验的拒绝域
  9. LTE-TDD资源调度(1)-QCI、GBR和Non-GBR
  10. vim全局搜索当前目录