python中的yield和return—迭代器和生成器

摘要

yield和return有什么区别?什么事生成器?什么又是迭代器?他们都有什么作用?简单理解的话yield=return,返回函数体处理结果的!yield本身是一个生成器,所以使用return返回的是我们常见的一些object(eg:list、dict、等),使用yield返回的是一个迭代器对象!

yield和return

之前一篇文章【开启Scrapy爬虫之路】中,处理item时,定义函数返回值用的yield,有人问yield是干嘛的,什么意思?

相同点: 都是定义函数过程中返回值

不同点:

  • yield是暂停函数,return是结束函数; 即yield返回值后继续执行函数体内代码,return返回值后不再执行函数体内代码
  • yield返回的是一个迭代器(yield本身是生成器-生成器是用来生成迭代器的);return返回的是正常可迭代对象(list,set,dict等具有实际内存地址的存储对象)
# debug测试
def f1():
    print("第1次暂停")
    yield '第1次访问返回的结果'# yield 暂停函数的调用,返回一个结果
    print("第2次暂停")
    yield '第2次访问返回的结果'
    return 100 # reutrun结束函数的调用
    print('return直接结束,此句不执行')

生成器

如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>

在这里插入图片描述
yield 返回的是一个生成器(看成迭代器更好理解)
在这里插入图片描述

迭代器

可以直接作用于for循环的对象统称为可迭代对象:Iterable

  • 一类是集合数据类型,如list、tuple、dict、set、str等;

  • 一类是generator,包括生成器和带yield的generator function
    在这里插入图片描述

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:创建迭代器iter() 和 访问迭代器next()。

联系

yield 是一个生成器函数,返回的是一个迭代器(有说法是返回的是生成器,我感觉说成迭代器更适合),

最近思维混乱,然后写了好几篇博客但是感觉都不太好!都变成草稿了,这一篇本来也想存为草稿的,奈何我还是想在“GEEK+”原创·博主大赛挣扎下,所以发出来拉个票,后续那天清醒了再过来修改完善下,麻烦文末投票链接帮忙助力一下

原创不易,谢谢大家支持

再这里列了一些资料,有需要可以自己先研究下!!

【Python3 迭代器与生成器】
【迭代器-百度百科】
【python中yield的用法详解——最简单,最清晰的解释】
【生成器——廖雪峰】
【迭代器——廖雪峰】


写在最后的拉票环节
最近参加了CSDN官方组织的“GEEK+”原创·博主大赛
历经重重筛选,终于上榜TOP 50
原创不易,帮忙投个免费的票
支持一下:点击投票
谢谢大家!!!

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1hxfz3cazce7g

  • 13
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
迭代器生成器Python 用于处理可迭代对象的两种重要机制。 迭代器是一个实现了迭代协议的对象,它通过定义 `__iter__()` 和 `__next__()` 方法来实现。`__iter__()` 方法返回迭代器本身,而 `__next__()` 方法返回下一个元素。当没有更多元素时,`__next__()` 方法会引发 `StopIteration` 异常。可以使用内置的 `iter()` 函数从可迭代对象获取迭代器生成器是一种特殊的迭代器,它使用函数来创建。生成器函数使用 `yield` 语句来产生一个值,并在下次调用时从离开的地方继续执行。与普通函数不同,生成器函数在调用时不会立即执行,而是返回一个生成器对象。可以使用 `next()` 函数或 `for` 循环来迭代生成器对象。 使用生成器可以有效地处理大型数据集或无限序列,因为它们按需生成值,而不需要一次性将所有值存储在内存。 下面是一个迭代器生成器的示例代码: ```python # 迭代器示例 class MyIterator: def __init__(self, data): self.data = data self.index = 0 def __iter__(self): return self def __next__(self): if self.index >= len(self.data): raise StopIteration value = self.data[self.index] self.index += 1 return value my_iter = MyIterator([1, 2, 3]) for num in my_iter: print(num) # 生成器示例 def my_generator(data): for num in data: yield num my_gen = my_generator([1, 2, 3]) for num in my_gen: print(num) ``` 输出结果为: ``` 1 2 3 1 2 3 ``` 希望以上内容能对你有所帮助!如果你还有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诡途

你的鼓励是我 创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值