python生成器简单讲解

生成器:
生成器是一个可迭代对象。
生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。
对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。
而且记录了程序执行的上下文。
生成器不仅“记住”了它的数据状态,生成还记住了程序执行的位置。

以下是生成器的一些用法笔记:

# 列表
L = [x * x for x in range(10)]
print(L)

# 生成器
g = (x * x for x in range(10))
print(g)

print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))

# 正确的方法是使用for循环,因为generator也是可迭代对象
for n in g:
    print(n)

print("*****************************************************")


# 斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b)
        a, b = b, a + b  # a, b = b, a + b 相当于  t = (b, a + b) # t是一个tuple a = t[0] b = t[1]
        n = n + 1
    return 'done'


"""
a, b = b, a + b 相当于  
t = (b, a + b) # t是一个tuple 
a = t[0] 
b = t[1]
"""

print(fib(5))


# 要把fib函数变成generator,只需要把print(b)改为yield b就可以了
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'


print("****************************************************")


def odd():
    print('step 1')
    yield 1
    print('step 2')
    yield 3
    print('step 3')
    yield 5


o = odd()
print(next(o))
print(next(o))
print(next(o))

# 用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,
# 返回值包含在StopIteration的value中

g = fib(6)
while True:
    try:
        x = next(g)
        print('g:', x)
    except StopIteration as e:
        print('Generator return value:', e.value)
        break

"""
杨辉三角定义如下:

          1
         / \
        1   1
       / \ / \
      1   2   1
     / \ / \ / \
    1   3   3   1
   / \ / \ / \ / \
  1   4   6   4   1
 / \ / \ / \ / \ / \
1   5   10  10  5   1
把每一行看做一个list,试写一个generator,不断输出下一行的list:
"""


def triangles():
    arr = [1]
    while True:
        yield arr
        arr = [1] + [arr[i] + arr[i + 1] for i in range(len(arr) - 1)] + [
            1]  # print("list+结果显示: ",([1]+[2]+[3]))  #[1,2,3]


n = 0
results = []
for t in triangles():
    results.append(t)
    n = n + 1
    if n == 10:
        break

for t in results:
    print(t)

if results == [
    [1],
    [1, 1],
    [1, 2, 1],
    [1, 3, 3, 1],
    [1, 4, 6, 4, 1],
    [1, 5, 10, 10, 5, 1],
    [1, 6, 15, 20, 15, 6, 1],
    [1, 7, 21, 35, 35, 21, 7, 1],
    [1, 8, 28, 56, 70, 56, 28, 8, 1],
    [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
]:
    print('测试通过!')
else:
    print('测试失败!')

有时间详细解读下?‍♂️


版权声明:本文为m0_46192045原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。