python3.6教程案例分析,python3.6生成器yield用法实例分析

本文实例讲述了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))

输出

只要函数中含有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)

in ()

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程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值