什么是生成器
不想用一下方法生成大量的数据,而是用算法先占用,在用时再取
a = [x*2 for x in range(10)]
>>> a
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
创建生成器的方法1
>>> b = (x*2 for x in range(10))
>>> b
<generator object <genexpr> at 0x102a4df68>
>>> next(b)
0
>>> next(b)
2
>>> next(b)
4
它虽然会占用内存,但是不会能占用的空间远远小于直接生成数据的内存,如果再最后一个生成完再让它生成则会出现异常
创建生成器的方法2
斐波拉契数列:除了前两个,后面的一个都是前两个数之和
在python里交换a,b
a,b = b,a
def craetNum():
print("start----------")
a,b = 0,1
for i in range(10):
print("-----------1-------")
yield b
print("----2------")
a,b = b,a+b
print("-----3------")
print("---stop------")
a = craetNum()
for num in a:
print(num)
运行结果:
start----------
-----------1-------
1
----2------
-----3------
-----------1-------
1
----2------
-----3------
-----------1-------
2
----2------
-----3------
-----------1-------
3
----2------
-----3------
-----------1-------
5
----2------
-----3------
-----------1-------
8
----2------
-----3------
-----------1-------
13
----2------
-----3------
-----------1-------
21
----2------
-----3------
-----------1-------
34
----2------
-----3------
-----------1-------
55
----2------
-----3------
---stop------
None
def testp():
i = 0
while i<5:
temp = yield i
print(temp)
i+=1
t = testp()
# ret = t.__next__()
# print(ret)
# # next(t) 与下面的方法等价
# t.__next__()
for num in t:
print(num)
0
None
1
None
2
None
3
None
4
None
send("xxx")不能放在刚开始,否则会出错,send(NONE)可放在生成器开头,相当于next()
>>> def test():
... i = 0
... while i<5:
... temp = yield i
... print(temp)
... i+=1
...
>>> t = test()
>>> t.__next__()
0
>>> t.send("ahh")
ahh
1
>>> t.__next__()
None
2
>>> t.send("xjx")
xjx
3
网友评论