python中的生成器

python中的生成器其实就是一个特殊的迭代器,相比于每次迭代获取数据获得(通过next()函数)时生成元素,迭代的位置,数值返回等都需要我们设计。我们可以采用更加简洁的语法即生成器(generator)。

通过列表生成式,我们可以直接创建一个列表。但是,如果我们说我们可能会通过算法根据前面的999999个数推出100w个数,但是我们此时只需要使用到前几个数,那么通过列表保存100w个数来备用就会用到巨大的空间。而我们却不一定会用到第100w个数,白白浪费了庞大的空间。因此我们就需要用到了生成器了。

生成器并不保存所有元素,保存的是算法,每调用依次next方法就根据算法返回下一个元素的值。如果没有值就抛出StopIteration异常。这样就有一有一个好处,生成器会根据你需要的个数来返回元素的个数,不会浪费空间。因此生成器是惰性的序列。

创建生成器有俩种方法:

第一种和列表生成很相似,将[]换成了()。a此时是一个生成器对象。

第二种:

一个函数中只要有yield这个关键词,那么这个函数就变成了生成器。生成器通过next()开启,运行到yield暂停挂起。

yield有俩个作用:当运行到yield时保存当前运行状态,然后挂起。

返回yield后面表达式返回的值,相当于return。

当再次调用next()函数的时候会返回之前挂起的运行位置继续往下运行,直到运行到下一个yield为止,如果没有就会抛出StopIteration异常。

唤醒生成器除了用next()函数外也可以使用send()函数。send()方法不仅可以返回yield断点还可以传入一个值。需要注意的是生成器第一次唤醒不能使用send()方法。

在之前用迭代器实现斐波那契数列打印的时候,可以看出斐波那契数列是通过特定的算法(a,b = b, a+b)推算出下一个值的。这就跟生成器保存算法的原则就很类似了,因此用生成器实现斐波那契数列打印更加简单。

  

时间: 2024-10-05 04:19:35

python中的生成器的相关文章

Python学习-39.Python中的生成器

先回顾列表解释 1 lista = range(10) 2 listb = [elem * elem for elem in lista] 那么listb就将会是0至9的二次方. 现在有这么一个需求,需要存储前10个斐波那契数到硬盘. 那么先写产生斐波那契数的函数: 1 def fib(max): 2 n,a,b = 0,0,1 3 while n < max: 4 print(b) 5 a,b = b,a + b 6 n+=1 这样就会打印出前max个斐波那契数了.接着我们再修改一下.(因为我

python中的生成器函数是如何工作的?

以下内容基于python3.4 1. python中的普通函数是怎么运行的? 当一个python函数在执行时,它会在相应的python栈帧上运行,栈帧表示程序运行时函数调用栈中的某一帧.想要获得某个函数相关的栈帧,则必须在调用这个函数且这个函数尚未返回时获取,可能通过inspect模块的currentframe()函数获取当前栈帧. 栈帧对象中的3个常用的属性: f_back : 调用栈的上一级栈帧 f_code: 栈帧对应的c f_locals: 用在当前栈帧时的局部变量; 比如: >>&g

python中的生成器(二)

一. 剖析一下生成器对象 先看一个简单的例子,我们创建一个生成器函数,然后生成一个生成器对象 def gen(): print('start ..') for i in range(3): yield i print('end...') G=gen() print(type(G)) >> <type 'generator'> 表示G是一个生成器对象,我们来剖析一下,里面到底有什么 print(dir(G)) >>['__class__', '__delattr__',

python中的生成器和迭代器

1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 1.1 使用迭代器的优点 对于原生支持随机访问的数据结构(如tuple.list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值).但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式. 另外,迭代器的一大优点是不要求事

python中的生成器(generator)总结

1.实现generator的两种方式 python中的generator保存的是算法,真正需要计算出值的时候才会去往下计算出值.它是一种惰性计算(lazy evaluation). 要创建一个generator有两种方式. 第一种方法:把一个列表生成式的[]改成(),就创建了一个generator: >>> L = [x * x for x in range(10)] >>> L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>

深入理解Python中的生成器

生成器(generator)概念 生成器不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIteration异常结束. 生成器语法 生成器表达式: 通列表解析语法,只不过把列表解析的[]换成()生成器表达式能做的事情列表解析基本都能处理,只不过在需要处理的序列比较大时,列表解析比较费内存. Python 1 2 3 4 5 6 7 8 9 10 11 >>> gen = (x**2 for x in range(5)) >>>

详解Python中yield生成器的用法

yield是生成的意思,但是在python中则是作为生成器理解,生成器的用处主要可以迭代,这样简化了很多运算模型(还不是很了解是如何简化的). yield是一个表达式,是有返回值的. 当一个函数中含有yield时,它不再是一个普通的函数,而是一个生成器.当该函数被调用时不会自动执行,而是暂停, 参考:http://www.aichengxu.com/view/64610  见第一个例子: 例1: >>> def mygenerator(): ... print 'start...' ..

python中的生成器yield

生成器yield:使用yield语句 可以让函数生成一个结果序列而不仅仅是一个值 def  countdow(n):      print("Start!");      while n>0:           yield n;           n -= 1; c = countdow(5); print(c.__next__())  print(c.__next__()) 输出结果: Start! 54__next__()方法使生成器函数一直运行到下一条yield语句为止

详解Python中的生成器表达式(generator expression)

介绍 1.生成器表达式(generator expression)也叫生成器推导式或生成器解析式,用法与列表推导式非常相似,在形式上生成器推导式使用圆括号(parentheses)作为定界符,而不是列表推导式所使用的方括号(square brackets). 2.与列表推导式最大的不同是,生成器推导式的结果是一个生成器对象.生成器对象类似于迭代器对象,具有惰性求值的特点,只在需要时生成新元素,比列表推导式具有更高的效率,空间占用非常少,尤其适合大数据处理的场合. 3.使用生成器对象的元素时,可以