python3.6生成器yield用法实例分析

作者:thormas1996 时间:2022-11-22 00:07:05 

本文实例讲述了python3.6生成器yield用法。分享给大家供大家参考,具体如下:

今天看源码的时候看到了一个比较有意思的函数:yield

功能与return类似,都是返回定义的函数的一个结果,不同的是return返回后这次调用函数就结束了,除了返回值,其余临时变量都会被清除。而yield会停止在当前步,并保留其余变量的值,等下次调用该函数时,从yield的下一步继续往下运行。

yield的好处是如果函数需要很大的内存,比方说需要计算并返回一个很大的数列,如果用return,我们只能用一个list来存储每一步再输出,而用yield的话,只需要一个变量的内存即可,每次输出当前步的值,下次调用函数接着从这一步继续。

文字不太好说明,看一个很容易理解的例子:(python3.6)

我们定义一个函数test(),看看return的效果


def test(n):
 for i in range(n):
   return i
   print('mark')

测试结果


for i in range(5):
 print(test(3))

输出

0
0
0
0
0

每次调用函数时碰到return就自动结束了,返回当前i值

再来看看yield的效果:


def test2(n):
 for i in range(n):
   yield i
   print('mark')

测试


for i in range(5):
 print(test2(3))

输出

<generator object test2 at 0x12d245200>
<generator object test2 at 0x12d245200>
<generator object test2 at 0x12d245200>

只要函数中含有yield,python就会默认这个函数是一个生成器,这个测试相当于重复打开了三次生成器

生成器需要用next()调用

测试


t = test2(3)
for i in range(3):
 print('i=',i)
 print(next(t))

next(t) 等同于 t.__next__()

结果

i= 0
0
i= 1
mark
1
i= 2
mark
2

可以看到,第一次返回i=0之后,第二次再调用函数时,从yield i的下一步继续,即print('mark')

生成器还支持用send()将值传递进函数:


def test3():
 value = (yield 1)
 print(value)
 print('mark1')
 value = (yield value)
 print(value)
 print('mark2')

测试


t2 = test3()
print(t2.__next__())
print('-----------')
print(t2.send(2))
print('-----------')
print(t2.send(3))

输出

1
-----------
2
mark1
2
-----------
3
mark2
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-102-56e62df29d71> in <module>()
      4 print(t2.send(2))
      5 print('-----------')
----> 6 print(t2.send(3))

StopIteration:

第一次next()返回1,并在当前停止,send(2)会将2传输给当前停止的那一步yield处,即相当于value = (yield 1)变为value = (2)

然后继续运行


print(value)
print('mark1')
value = (yield value)

碰到yield再次停止,返回此时的vlue值2,之后send(3)将3传输给当前停止那一步yield处,即第二个yield value处,继续运行


print(value)
print('mark2')

生成器运行结束后生成StopIteration

希望本文所述对大家Python程序设计有所帮助。

来源:https://blog.csdn.net/thormas1996/article/details/80830266

标签:python3.6,生成器,yield
0
投稿

猜你喜欢

  • 隐藏你的.php文件的实现方法

    2023-10-20 22:58:01
  • 解析SQL Server中SQL日期转换出错的原因

    2024-01-15 16:34:17
  • 详解利用Pytorch实现ResNet网络之评估训练模型

    2023-06-13 16:23:24
  • Git实现克隆历史的某个版本

    2023-03-24 01:39:54
  • python中常用的九种预处理方法分享

    2022-06-27 17:50:23
  • python数据类型_字符串常用操作(详解)

    2023-10-12 05:02:57
  • python多线程http压力测试脚本

    2022-12-31 16:48:37
  • 使用jupyter notebook运行python和R的步骤

    2023-03-30 18:22:50
  • 如何实现文本的卷屏浏览?

    2010-05-24 18:36:00
  • Python函数中4种参数的使用教程

    2023-03-06 23:06:03
  • Django框架基础模板标签与filter使用方法详解

    2022-10-25 18:14:43
  • PHP的PDO预定义常量讲解

    2023-06-09 13:35:54
  • 解决python执行较大excel文件openpyxl慢问题

    2021-06-25 15:58:04
  • Python3 pickle对象串行化代码实例解析

    2021-12-06 14:32:07
  • 一个asp简单购物车教程

    2007-09-17 11:02:00
  • 详解webpack编译多页面vue项目的配置问题

    2024-06-15 00:50:22
  • 520必备!这些Python表白代码祝你脱单成功

    2023-01-29 15:16:39
  • Python中的random函数实例详解

    2021-01-09 13:01:49
  • asp.net连接查询SQL数据库并把结果显示在网页上(2种方法)

    2024-01-12 13:28:10
  • 解决Python运算符重载的问题

    2022-07-04 23:09:33
  • asp之家 网络编程 m.aspxhome.com