美文网首页
python——生成器

python——生成器

作者: Jalynn葸 | 来源:发表于2018-05-09 17:33 被阅读67次
什么是生成器

不想用一下方法生成大量的数据,而是用算法先占用,在用时再取

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

相关文章

网友评论

      本文标题:python——生成器

      本文链接:https://www.haomeiwen.com/subject/cgdnrftx.html