其实感觉就是为了让它能用for i in (这个东西)中,构造了一个生成器,需要一个就生成给你,例如:
这里每次生成列表中的一个数字,可以直接用for
l = [2,3,4]
def foo(list2gen):for item in list2gen:yield item
#现在就可以用for循环每次来生成一个数了
for i in foo(l):print i
2
3
4
注意,每次生成后就暂停了,知道你下次继续需要生成的时候再启用
一个函数含有yield表达式 这个函数就不是普通函数,而是生成器(generator)
def gen():print "start"m = yield 2print mn = yield 3print ntry:print "end"except StopIteration as e:print e
g = gen()
上面没有输出,说明并没有执行gen()里面的内容
g.send(3)#最开始生成器不能send非空值,所以会报错,报错如下:
---------------------------------------------------------------------------TypeError Traceback (most recent call last)<ipython-input-7-40f72939bd2f> in <module>()
----> 1 g.send(3)#最开始生成器不能send非空值,所以会报错TypeError: can't send non-None value to a just-started generator
g.send(None)
下面有输出了,代表开始工作了:
start 2
此时函数(生成器)返回了2,即只执行到第一个yield就暂停了
g.send(None)调用者把None这个消息send给上一个yield表达式,由于第一次调用,没有上一个yield,所以用None
print g.send(5)
5
3
print g.send(6)
6
end---------------------------------------------------------------------------StopIteration Traceback (most recent call last)<ipython-input-10-0a4a0fbbb629> in <module>()
----> 1 print g.send(6)StopIteration:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Fib(object):a = 0b = 1def next(self):self.a, self.b = self.b,self.a + self.bif self.a > 10000:raise StopIterationreturn self.adef __iter__(self):return self
fibs = Fib()
for f in fibs:print f
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
#!/usr/bin/env python
# -*- coding:utf-8 -*-
def fib():a,b = 0,1while True:a, b = b, a + bif a > 1000 and a < 5000:yield "1000 to 5000 don't display"continueif a > 10000:raise StopIterationyield a
for f in fib():print f
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1000 to 5000 don't display
1000 to 5000 don't display
1000 to 5000 don't display
6765
本文发布于:2024-02-04 12:23:34,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170707150555537.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |