yield 关键字的作用是?

要理解 yield,就不得不先理解生成器,要理解生成器就不得不先理解可迭代对象。
可迭代对象:
列表是可迭代对象的一种,对于可迭代对象,我们可以一个接一个访问其中的元素,这种一个接一个访问元素的方式称为迭代。例如:

>>> my_list = ['Jan', 'Feb', 'Mar']
>>> for mon in my_list:
...     print(mon)
...
...
Jan
Feb
Mar

上面例子中 my_list 是一个可迭代对象。使用列表推导式可以生成一个列表同时也是一个可迭代对象。例如:

>>> mylist = [x*x for x in range(3)]
>>> for i in mylist:
...     print(i)
...
...
0
1
4

使用可迭代对象,可以很方便地访问其中的值,但是可迭代对象需要将所有的值放在内存中,当可迭代对象中的值较多时,将所有的值存储在内存中并不是我们想要的。
生成器:
生成器是可迭代对象的一种,和常规可迭代对象不同的是,生成器只可遍历一次。生成器并不会将所有的值存储在内存中,而是在遍历的过程中生成值。例如:

>>> my_generator = (x*x for x in range(3))
>>> for i in my_generator:
...     print(i)
...
...
0
1
4

生成生成器的表达式和列表推导式唯一不同的是,列表推导式使用的是 (),而生成器使用的是 []。另外,我们不能对生成器进行再次遍历。
yield 关键字:
yield 的使用和 return 很像,不同的是 yield 会返回一个生成器。例如:

>>> def create_generator():
...     mylist = range(3)
...     for i in mylist:
...         yield i*i
...
...
>>> my_generator = create_generator()
>>> my_generator
<generator object create_generator at 0x7f7bd15f8a50>
>>> for i in my_generator:
...     print(i)
...
...
0
1
4

上面例子中,调用 create_generator() 返回的是一个生成器,需要对生成器 my_generator 进行遍历,才能得到值。对生成器进行第一遍遍历时,会执行 create_generator() 函数中的代码直到 yield i*i,这时会返回第一个值,紧接着第二遍遍历会返回第二个值,直到生成器为空。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值