python生成器简单讲解

本文介绍了生成器在Python中的工作原理,通过实例展示了如何创建和使用生成器,包括列表生成式、斐波那契数列、杨辉三角和动态生成的列表。重点讲解了如何用for循环正确迭代生成器,以及如何将普通函数转换为生成器以节省内存和提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生成器:
生成器是一个可迭代对象。
生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。
对生成器函数的第二次(或第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('测试失败!')

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值