python 生成器 send

#!/usr/bin/python3

def MyGenerator():
        value=yield 1
        yield value
        return done

gen=MyGenerator()
print(next(gen))
print(gen.send("I am Value"))

生成器内有一个方法send,可再次传入一个值。



上面那句可能听不懂,但是不要紧,我们先来看看代码,

#!/usr/bin/python3

def MyGenerator():
        value=yield 1
        yield value
        return done

gen=MyGenerator()
print(next(gen))
print(gen.send("I am Value"))

代码分析, 
在MyGenerator里,我们一共用了两次yield。 
比较奇怪的是第一个yield的语句,value=yield 1。如果没看过这一语句的,肯定不知道next回到yield后,其实是有一个值的。

到这,我们先不急,运行代码先,

[penx@ali01 python]$ ./gen_send.py
1
I am Value
[penx@ali01 python]$ 

运行过程, 
用next启动了生成器gen,知道到yield 1时返回1。

然后我们再用gen的内部方法send进入gen,而且还带回来一个值“I am Value”。这时候,继续执行yield 1后的代码“value=”,把带回来的值“I am Value”赋给value。直到遇到yield value,把value返回。



其实,send和next的执行很像,只是send可以和生成器互动,传入一个值。


生成器的启动需要next

大家有没有想过,如果生成器还没启动过,就用send,会怎样?我们来试一下。 
代码,

#!/usr/bin/python3

def MyGenerator():
        value=yield 1
        yield value
        return done

gen=MyGenerator()
print(gen.send(3))

运行,

[penx@ali01 python]$ ./gen_send.py
Traceback (most recent call last):
  File "./test.py", line 9, in <module>
    print(gen.send(3))
TypeError: can‘t send non-None value to a just-started generator
[[email protected] python]$ 

结果, 
报错,

TypeError: can’t send non-None value to a just-started generator

说生成器刚启动时,不能send一个不为None的值。

小结, 
所以呢,我们在用生成器时,第一次要用next启动


生成器启动可用send(None)

其实上面报错已经说了,can’t send non-None value。 
所以啊,我们可以用send(None)来启动生成器。 
代码,

#!/usr/bin/python3

def MyGenerator():
        value=yield 1
        yield value
        return done

gen=MyGenerator()
print(gen.send(None))
print(gen.send(3))

运行,

[penx@ali01 python]$ ./gen_send.py
1
3
[penx@ali01 python

结果, 
正常运行。

原文地址:https://www.cnblogs.com/lixufeng/p/8886295.html

时间: 2024-10-13 09:42:54

python 生成器 send的相关文章

python 生成器理解

通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了. 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间.在Python中,这种一边循环一边计算的机制,称为生成器(Generator). 简单生成器 要创建一个generator,有很

4.Python 生成器yield

常用方法: next    获取下一个值 send    发送值到生成器 throw  发送异常到生成器 python生成器模拟线程并发:

python 生成器的理解和总结

1. 生成器 利用迭代器,我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成.但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记录,进而才能根据当前状态生成下一个数据.为了达到记录当前状态,并配合next()函数进行迭代使用,我们可以采用更简便的语法,即生成器(generator).生成器是一类特殊的迭代器. 2. 创建生成器方法1 要创建一个生成器,有很多种方法.第一种方法很简单,只要把一个列表生成式的 [ ] 改成 ( ) 3. 创建生成器方法2 gene

Python 生成器和推导式

一.Python生成器和生成器函数1.生成器和生成器函数的概念    1.生成器的本质是迭代器    2.函数中包含yield,就是生成器函数 2.生成器函数的写法    def func():        a =10        yield 20    gen = func()  #没有执行,而是生成一个生成器    普通函数和生成器函数的不同    1.普通函数名()表示函数的的执行    2.生成器函数名()不是函数的执行,而是生成一个生成器 yield和return的不同    1.

020.Python生成器和生成器函数

一 生成器 1.1 基本概念 元组推导式是是生成器(generator) 生成器定义 生成器可以实现自定义,迭代器是系统内置的,不能够更改 生成器的本质就是迭代器,只不过可以自定义. 生成器有两种定义的方式: 生成器表达式 (里面是推导式,外面用圆括号) 生成器函数 1.2  元组推导式的形式来写生成器 gen = (i * 2 for i in range(5)) print(gen) from collections import Iterator print(isinstance(gen,

Python 生成器&迭代器

Python 生成器 带有 yield 的函数在 Python 中被称之为 generator(生成器),用斐波那契数列: def fab(max):     n, a, b = 0, 0, 1     while n < max:         yield b         a, b = b, a + b         n = n + 1 执行: 1 2 3 4 5 6 7 8 9 >>> for n in fab(5):     print n 1 1 2 3 5 简单地

对python生成器特性使用的好例子

1.对序列进行分组的函数(摘自web.py源码utils.py文件中) 1 def group(seq, size): 2 """ 3 Returns an iterator over a series of lists of length size from iterable. 4 5 >>> list(group([1,2,3,4], 2)) 6 [[1, 2], [3, 4]] 7 >>> list(group([1,2,3,4,5]

python生成器(笔记)

Python生成器有些难以用语言表达其概念,所以在这里用几段代码来解释~ 生成器:任何包含yield语句的函数称为生成器; 生成器是一种普通的函数语法定义的迭代器. def test2():     print 9     print 8     yield 7 test2() 上述代码什么都不返回,因为代码碰到了yield函数暂停(或冻结)了,这个暂停同时还影响了yield以上的两个print. def test2():     print 9     print 8     yield 7

Python生成器、迭代器、装饰器

Python迭代器 迭代器是访问集合内元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束. 迭代器不能回退,只能往前进行迭代.这并不是什么很大的缺点,因为人们几乎不需要在迭代途中进行回退操作. 常用的迭代方法有 .next()方法 for..in..方法 迭代器通俗的理解就是遍历集合内的所有元素 python生成器 这里先说简单的使用,然后再说自己创建生成器 range:生成一个list range(1,5)结果为:[1,2,3,4] xrange:生成一个x