欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > python >内容正文

python

Python 生成器(yield)

发布时间:2025/3/12 python 21 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Python 生成器(yield) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

Python 生成器


一、生成器(generator)

  • Python 的生成器是一种特殊的程序,可以被用作控制循环的迭代行为。生成器可以暂时挂起函数,并保留函数的局部变量等数据,然后在再次调用它的时候,从上次暂停的位置继续执行下去。
  • 如果所要的序列的元素可以按照某种算法推算出来,可以采用迭代器一边循环一边计算的机制,这样就不必创建完整的序列,从而节省大量的空间。
  • Python 的生成器是迭代器的一种。
  • 协程是基于生成器实现的。

二、基于列表生成式的生成器

1、创建生成器:列表生成式的 [ ] 改成 ( )

# 创建一个生成器,查看其类型 g = (x * x for x in range(5)) print(g) >>> <generator object <genexpr> at 0x00000173441AB2B0>

2、使用生成器:next()

每次调用next(g),就计算出生成器g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误

# 获得生成器的下一个值 next(g) >>> 0 next(g) >>> 1 ...... next(g) >>> Traceback (most recent call last):File "<stdin>", line 1, in <module>StopIteration# 遍历生成器 for n in g:print(n) >>> 0 1 4 9 16

三、yield 生成器

1、创建生成器:yield

# 创建一个生成器,查看其类型 def f(n):i = 0while i < n:yield i**2i += 1return 'finish'g = f(5) print(g) >>> <generator object f at 0x000001F73626B2B0>

2、使用生成器:next()

# 遍历生成器 while True:try:x = next(g)print(x)except StopIteration as e:print('Generator return value:', e.value)break >>> 0 1 4 9 16Generator return value: finish

3、生成器传递参数:send()

  • yield 语句执行返回操作后会马上挂起,等待接收值。send() 值时会马上进行赋值,如果没有接收者,会执行代码直至 yield 语句。
  • 启动生成器:.send(None),第一次使用 send(),这时候没有 yield 接收值,执行函数的初始化代码,直到 yield 语句,返回 yield 后面的值(语句的赋值操作没有执行),生成器挂起。
  • 生成器再次传递值:.send(n),生成器会先接收值 n 赋值给 yield 语句的变量,然后执行 yield 语句之后的代码,直至遇到下一个 yield 语句把 yield 后面的值返回给调用者,生成器再次挂起,等待接收值。
# 消费者 def consumer():r = ''while True:n = yield rif not n:returnprint('[CONSUMER] Consuming %s...' % n)r = 'done'# 生产者 def produce(c):c.send(None)n = 0while n < 5:n = n + 1print('[PRODUCER] Producing %s...' % n)r = c.send(n)print('[PRODUCER] Consumer return: %s' % r)c.close()c = consumer() produce(c)>>> [PRODUCER] Producing 1...[CONSUMER] Consuming 1...[PRODUCER] Consumer return: done......[PRODUCER] Producing 5...[CONSUMER] Consuming 5...[PRODUCER] Consumer return: done

GOOD LUCK!


总结

以上是生活随笔为你收集整理的Python 生成器(yield)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。