首页 技术 正文
技术 2022年11月7日
0 收藏 684 点赞 722 浏览 3363 个字
C#的yield已经忘得差不多了。又遇到python的yield。
iterator
def testYield():
print 'yield1'
m = yield 1
print 'm =' , m
print 'yield2'
yield 5
for a in testYield():
print 'test'
result = testYield()
result.send('test')
print list(result)

OUTPUT:

yield1
test
m = None
yield2
test

File “C:\pytest\Sele\Generator.py”, line 36, in <module>
result.send(‘test’)
TypeError: can’t send non-None value to a just-started generator
[Finished in 0.2s with exit code 1]

参考这里面的说:

http://www.jb51.net/article/15717.htm

send(something) and next()

第一次调用,send不能传非空值,不知道为什么,以后再搞明白

yield 在函数里出现,说明这个函数是generator,生成器,会被区别对待。

举个栗子~

def testYield():    m = yield 1
print type(m)
print m
m2 = yield 5
yield 88result = testYield()
print result.next()
print result.send('fighting')
result.next()
print result.next()
# print list(result)
print result.next() A:给我做一块蛋糕, 并打包 
哒哒哒,进入函数工厂
计算机: 好的,做好了。给你1print.send('fighting') B:给我做一块蛋糕,让‘fighting’来做,并打包
哒哒哒,进入函数工厂
计算机:好的,这就让fighting去做。给你5result.next()C:给我做一块蛋糕, 并打包
哒哒哒,进入函数工厂
计算机:好的,做好了。给你88,哎?人呢?
print result.next() D:给我做一块蛋糕, 并打包 
哒哒哒,进入函数工厂
计算机: 没有原料了,做不出来蛋糕了,停止售卖 stop iteration
print list(result) E:看看你们能做啥
哒哒哒,进入函数工厂
计算机:我们空了 输出【】正儿八经的输出是:

1
<type ‘str’>
fighting
5

File “C:\pytest\Sele\Generator.py”, line 39, in <module>
print result.next()
StopIteration

result = testYield()

result.next() #启动了这个生成器,直到第一个yield语句 hold

你去取这个 result.next(),比如print result.next(), 这个值才真正生成了,result.next()的type是int

result.send(something), 这个something会被传到yield表达式中,m= ‘something’。type(m) is str. print m才能获得你用send传入的值。

说明什么呢?

你用send传什么东西,如果你在方法里并不用,就没什么用了。我暂时是这么想的。

result.send(something)继续寻找下一个yield,并hold

跟next()类似,send也会使得生成器停在那里。

print result.send(something) 出来的并不是something。print的是generator找到的下一个yield的值。

这翻译的生成器,就是生成函数的返回值对吧,yield英文是啥意思?produce生产一个东西

再看一个栗子~

def h():
print 'Wen Chuan'
m = yield 5 # Fighting!
print 'm=', m
d = yield 12
print 'We are together!'
print d
test = yield 35
print test
c = h()
current = c.next() # start generator, stop at the first yield
print current
current = c.send('Fighting!') # send current yield 'fighting', stop at the next yield
print current
c.send('got it')
print list(c)
print list(h())

输出:

Wen Chuan
5
m= Fighting!
12
We are together!
got it
None
[]
Wen Chuan
m= None next() = send(None)
We are together!
None
None
[5, 12, 35]

【时隔快一年,之前学习的python忘得差不多了。于是打算重新学】

http://anandology.com/python-practice-book/iterators.html

说点正常人能看懂的。之前写的我自己都看不懂。。下面英文是摘抄。

Generators simplifies creation of iterators. A generator is a function that produces a sequence of results instead of a single value.

Each time the yield statement is executed the function generates a new value.

So a generator is also an iterator. You don’t have to worry about the iterator protocol.

The word “generator” is confusingly used to mean both the function that generates and what it generates. In this chapter, I’ll use the word “generator” to mean the genearted object and “generator function” to mean the function that generates it.

Can you think about how it is working internally?

When a generator function is called, it returns a generator object without even beginning execution of the function. When next method is called for the first time, the function starts executing until it reaches yield statement. The yielded value is returned by the next call.

The following example demonstrates the interplay between yield and call to next method on generator object.

好的这段话说得不错,我来翻译一下。

说啊这个Generators是简化iterator的创建的。一个Generator是用来生成一串结果的方法,而不是仅返回一个值。

每次呢,yield语句一旦执行,这个方法就生产出一个新的值。

所以呢,这个generator也是一个迭代器。你就别担心iterator的规则它是否适用,答案是肯定的。

这个词”generator”到底意思是它的作用是生成还是说它生成的东西呢?这一点让人困惑。在俺们这里,我用generator来表示生成的对象,用generator function来表示它生成东西的这个作用。

当一个generator function被调用的时候呢,它会返回一个generator 对象,只是返回个对象,并不干其他的事情,甚至都没开始执行这个方法。

当next 方法第一次被调用的时候,这个方法才开始执行,直到它遇到了一个yield语句。这个yield(量产)的值作为next的返回值。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,088
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,564
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,412
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,185
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,822
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905