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。

一开始,generator 停在 function 开始的地方。就像这样(【】这个符号代表指令执行的位置):

  【】**********oi*********oi**********oi

然后,第一次必须用 next 来让 generator 走到【o】的位置,也就是说,这个时候 generator 已经送出一个 value 了。

不过,这个时候【i】却还没有被执行。就像这样:

  **********【o】i*********oi**********oi

你如果继续使用 next ,可以,并且你会得到这样的:

  **********oi*********【o】i**********oi

也就是说,你的 generator 已经到了第二个【o】的地方,已经送出了第二个 value,并且在第一个【i】的时候,这个 generator 已经被送入了一个 None value。也就是说,使用 next 只能往这个 generator 里面送入一个 None value。

这个时候,你换 send,例如 gen.send(1)。 会变成这样:

  **********oi*********oi**********【o】i

你的 generator 停在了第三个【o】的地方,注意是已经执行过这【第三个o了】。而且,你送入了一个整型 value 1,注意,是送给了第二个【i】。

时间: 2024-10-08 01:09:56

python generator next send的相关文章

Python:generator的send()方法流程分析

先来一个简单地例子: def foo(): print('starting') while True: r = yield 2 print(r) f = foo() print(f.send(None)) print(f.send(1)) 结果如下: starting 2 1 2 讲解: 1   f = foo()  这句表示生成一个generator对象 f = foo() print(type(f)) #<class 'generator'> 2   f.send(None) 的作用与 n

Python生成器及send用法讲解

- 生成器 我们调用一个普通的Python函数时,一般是从函数的第一行代码开始执行,结束于return语句.异常或者函数结束(可以看作隐式的返回None).一旦函数将控制权交还给调用者,就意味着全部结束.函数中做的所有工作以及保存在局部变量中的数据都将丢失.再次调用这个函数时,一切都将从头创建. 对于在计算机编程中所讨论的函数,这是很标准的流程.这样的函数只能返回一个值,不过,有时可以创建能产生一个序列的函数还是有帮助的.要做到这一点,这种函数需要能够"保存自己的工作". 我说过,能够

python生成式的send()

随便在网上找了找,感觉都是讲半天讲不清楚,这里写一下. def generator(): while True: receive=yield 1 print('extra'+str(receive)) g=generator() print(next(g)) print(g.send(111)) print(next(g)) 输出: 1 extra111 1 extraNone 1 为什么会这样呢,点进send就能看到一句话send:Resumes the generator and "send

Python: generator, yield, yield from 详解

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

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

本文对<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 inform

python generator用法

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

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 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