呆鸟的Python数据分析人工智能/模式识别/机器学习精华专题大数据,机器学习,人工智能

Python札记42_生成器generator

2019-07-13  本文已影响3人  皮皮大

先看个例子:

my_tuple = (x**x for x in range(4))
my_tuple

<generator object <genexpr> at 0x00000210B3244CF0>   # generator是生成器的意思

yield

yielf定义

在Python中定义生成器必须使用关键字yield。它作为一个关键字,是生成器的标志。

def func():
    yield 0   # 必须有关键字
    yield 1
    yield 2

>>func  
<function __main__.func()>
>>type(func)
function

>>g = func()   # 调用func函数并且赋值给g
>>g
<generator object func at 0x00000210B32447C8>

>>type(g)
generator   # 注意比较g和func类型的不同,g是生成器对象

查看生成器g的具体方法:

>>dir(g)

['__class__',
 '__del__',
 '__delattr__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__iter__',    # 说明对象是可迭代的
 '__le__',
 '__lt__',
 '__name__',
 '__ne__',
 '__new__',
 '__next__',   # 说明对象是可迭代器对象
 '__qualname__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'close',
 'gi_code',
 'gi_frame',
 'gi_running',
 'gi_yieldfrom',
 'send',
 'throw']

yield执行

通过执行上面的g生成器对象的next()方法,查看运行过程:

image.png

yield vs return

函数返回值由一个return,那么yield和return有什么区别呢?

return

def return_func(n):
    print("hell python")
    while  n > 0:
        print("before return")
        return n   # return后面的语句不会执行
        n -= 1
        print("after return")

>>res = return_func(3)
hell python
before return
image.png

yield

image.png

利用yield生成斐波那契数列

def fibs(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b   # 如果满足while条件,将b值赋给a,它们俩的和赋值给b
        n += 1    # 用来控制次数
        
if __name__ == "__main__":
    f = fibs(10)
    for i in f:
        print(i)

# 结果 
1
1
2
3
5
8
13
21
34
55
n 是否满足while条件 a(前) b(前) a(后) b(后)
0 0 1 1 1
1 1 1 1 2
2 1 2 2 3
3 2 3 3 5
4 3 5 5 8
5 5 8 8 13
6 8 13 13 21
7 13 21 21 34
8 21 34 34 55
9 34 55 55 89
上一篇 下一篇

猜你喜欢

热点阅读