首页 > 什么是生成器?

什么是生成器?

在python中, 要产生一个列表,可以这样写:

a=[]  

for i in range(10):

  a.append(i*2)

但是,这样挺麻烦的,产生一个列表,需要三行语句。所以,有人就想到能不能一行代码来表示呢?其实,也是可以的,如下:

[ i*2 for i in range(10)]

当然,我们也可以写成[func(i) for i in range(10)]

1、这样,通过一个式子就能产生一个列表,我们把这样的式子叫做生成式

生成式通过算式可以产生符合要求的列表,这个列表是预先产生存在于内存中的,如果列表元素过多,例如100万,或1000万个,就占用特别多的内存,所以,具有一定的缺点。而生成器,占用的内存却是很少的。只要将上方的列表生成式外的方框改成圆括号就算是生成器了。

2、a=(i*2 for i in range(10))

这样产生的元组就是生成器。

生成器要满足三个特眯:

(1)生成器只有在调用时才会产生相应的数据。

(2)只记住当前的位置。

(3)只有一个方法,即__next__()

3、斐波那契数列。

def fib(max):

  n,a,b=0,0,1

  while n

    #print(b)

    yield b

    a,b=b,a+b #这里相当于t=(b,a+b),a=t[0],b=t[1],和我们平常想的可能有一定的差距。

    n=n+1

  return('done')

注意:(敲黑板)只要将上方的print(b)改为yield b,此函数就变为了生成器。

变成生成器后有什么好处呢?

访问生成器fib(x)时,可以用__next__()方式随意进出,进出自由,而且读取里面的元素时不须等待时间。不象一次性生成的列表或元组。

yield b 就是返回当前生成器指针所指的值。

 

转载于:https://www.cnblogs.com/lyzfp/p/11440813.html

更多相关:

  • 生成器      为什么要将列表转化为迭代器?      因为列表太大的话用内存太大,做成迭代器可以节省空间,用的时候再拿出部分。      生成器是不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,知道遇到StopIteration异常结束。创建生成器      先看个例子当要生成的list非常大时,会...

  • 来源:http://suo.im/5HPGNT在Python中有4种内建的数据结构:列表、元组、字典、集合。今天我们将会学习如何使用它们,以及它们如何使编程变得简单。一、列表list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个 序列 的项目。假想你有一个购物列表,上面记载着你要买的东西,你就容易理解列表了。只不过在你...

  • python列表(数组)  列表(list)  就是 数组   - 列表是Python中的一个对象   - 对象(object)就是内存中专门用来存储数据的一块区域   - 之前我们学习的对象,像数值,它只能保存一个单一的数据   - 列表中可以保存多个有序的数据   - 列表是用来存储对象的对象   - 列表的使用:   ...

  • 【列表|字典】 Tcl使用列表来处理各种集合,比方一个目录中的全部文件,以及一个组件的全部选项。最简单的列表就是包括由随意个空格、制表符、换行符、分隔的随意多个元素的字符串。比方: JerryAlice Mandy David l  lindex命令: --> 获取元素 至少须要两个參数,一个列表和一个索引值。返回取得的元素...

  • 节点列表由 getElementsByTagName() 方法和 childNodes 属性返回。 实例 下面的例子使用 XML 文件 books.xml。 函数 loadXMLDoc(),位于外部 JavaScript 中,用于加载 XML 文件。 从第一个 元素获取文本 本例使用 getElementsByT... </p> </div> </div> </li><li> <div class="arcTitle clearfix"> <h3><a href="//11gx.com/wrn74zxu0k/" target="_blank">gitlab如何克隆项目到本地进行开发,如何让webstorm项目右键菜单出现Git子菜单,右下角出现Matser分支</a></h3> </div> <div class="clearfix"> <div class="arcDes"> <p>  cd 到盘符 例如D:. cd 到您的项目目录 去gitlab对应项目拷贝http的克隆地址  然后在gitlab命令窗口输入  git clone http://192.168.2.231/knowway/******.git 接下来就开干!!! 打开webstorm然后ctrl+alt+s  ... </p> </div> </div> </li><li> <div class="arcTitle clearfix"> <h3><a href="//11gx.com/xtl4rj39u1/" target="_blank">redisCommand接口的用法--利用hiredis库获取MGET命令的结果的坑!</a></h3> </div> <div class="clearfix"> <div class="arcDes"> <p>工作中遇到如下业务场景: 我需要利用大批量的key去借助MGET命令来获取redis服务器上的记录,但是我却始终获取不到。当然我可以使用GET去一条一条地获取,但是这样一来,效率不高。所以最好的方式是,大批量一次性获取这样的记录。 我有问题的这段代码是这样的: 但是在构造MGET命令时,我犯了一个很弱智的错误,就是redi... </p> </div> </div> </li> </ul> </div> </div> </div> <!-- <div class="simle_box300"></div> --> </div> </section> <div class="footer-wrapper"> <div class="footer"> <p class="text-center"> ©2024 11GX.COM </p> </div> </div></body> </html>