Python Generator

  本文对《Python Cookbook》中对于生成器部分的讲解进行总结和分析:

  对于生成器我们一般这样使用:

lxw Python_Cookbook$ p
Python 3.4.0 (default, Apr 11 2014, 13:05:18)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def countdown(n):
...     print("Start to count from", n)
...     while n > 0:
...          yield n
...          n -= 1
...     print("Done!")
...
>>> c = countdown(3)
>>> c
<generator object countdown at 0xb7234c5c>
>>> for item in c:
...     print(item)
...
Start to count from 3
3
2
1
Done!

  我想说的是, 让我们来看一下生成器的底层工作机制(underlying mechanics):[接上面的代码]

>>> d = countdown(3)
>>> d
<generator object countdown at 0xb711a43c>
>>> next(d)
Start to count from 3
3
>>> next(d)
2
>>> next(d)
1
>>> next(d)
Done!
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> 
时间: 2024-10-13 23:22:08

Python Generator的相关文章

python generator用法

转自:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00138681965108490cb4c13182e472f8d87830f13be6e88000 生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白

Python: generator, yield, yield from 详解

1.Generator Expressions 生成器表达式是用小括号表示的简单生成器标记法: generator_expression ::= "(" expression comp_for ")" 生成器表达式产生一个生成器对象,它的语法和for类似,出了它是被"()"包含,而不是[]或{}: 生成器表达式中变量的计算被延迟到__next__()函数的调用,然而最左边for循环子句被立即计算,这样,如果他有错误的话可以被立即看到.后面的for

python generator next send

*******oi********oi********oi 上面  *  符号 代表 一系列的代码, oi 代表 一个 [yield]关键字引出的 [数据交换,称之为 oi ] 在一个有[yield]的 function 里: 在出现[yield]的地方有一个[oi]的过程,为什么不是[io]呢,因为它就是先[o]再[i]的. [o]代表从 generator 里出来一个 value. [i]代表 generator 从外界收到一个 value. 一般,在外界可以使用 next 或者 send.

python generator iterator和iterable object

1 iterable object list.dict.set.tuple.file(在每行上iterate)等都是iterable object,但是它们不是iterator.但是它们可以转换成iterator,通过两种方式: 第一,显式的使用iter()函数; 第二,隐式的使用for 2 iterator iterator也是iterable的. 3 generator 3.1 种类 有两种类型的generators 3.2 使用yield来返回的函数形式的generator 使用yield

python generator: next , sent(msg)区别

对于普通的生成器,第一个next调用,相当于启动生成器,会从生成器函数的第一行代码开始执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数. 然后第二个next调用,进入生成器函数后,从yield语句的下一句语句(第5行)开始执行,然后重新运行到yield语句,执行后,跳出生成器函数, 后面再次调用next,依次类推.下面是一个列子: 1 def consumer(): 2 r = 'here' 3 for i in xrange(3): 4 yield r 5 r = '200 O

Python Generator 运行细节验证

今天来__next__和send, 改天来throw和close class A: def __setattr__(self, key, val): print('set %s to %s'%(key, val)) self.__dict__[key] = val def G(): e = A() i = 0 while 1: e.x = (yield i) print(' e.x is %s'%e.x) i+=1 def p(s): print(' out put: %s\n'% s) g =

python generator(生成器)

a=(x*2 for x in range(1000)) # print(a.next())#python2使用 print(a.__next__()) #python3使用 print(next(a)) #python2和python3均可使用

Python generator 的yield (enumerate)

生成杨辉三角 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 def triangles(max): 2 L = [1,] 3 while len(L) - 1 < max: 4 yield L #### yield 会print 然后会停止循环, 接下来不会得到下一个L 5 L.append(0) 6 L = [L[x] + L[x - 1] for x,y in enumerate(L)] #找规律 下标直接用enmerate 而不用ij ## 7

发现一个python generator生成器特殊例子,理解了好久

def scq(): for i in range(3): yield i g = scq() for n in [1, 10]: g = ((n+k) for k in g) print(list(g)) 开始代码是这样,光靠眼睛一看觉得结果肯定是[11,12,13] 但是代码一运行却发现结果并不是这样,而是[20,21,22] 这一下子我奇了怪了,为什么比预想的多出了就,后来各种尝试,甚至改了下面for循环的条件,发现只要不动列表的第二个数字,结果就不会发生变化. 后来开了debug一步一步