一、先来看看yield返回的是什么东东

  • yield关键字只能在函数中使用,否则会抛出语法异常
  • 咱们知道只要在函数中存在yield关键字,那么这个在调用这个函数的时候,其返回值就是一个生成器对象,下图咱们引入from collections.abc import Generator生成器类,判断函数返回的是不是Generator的实例
  • 既然知道是Generator,那么要讲Generator就需要再谈谈Iterable可迭代对象和Iterator迭代器
  • 先看继承关系,Iterator是继承自Iterable,而Generator又是继承自Iterator
  • 所以说生成器具有可迭代对象和迭代器的所有特性

二、可迭代对象

  • 什么是可迭代对象?
  • 可以使用for循环遍历的,那就是可迭代对象。比如for i in range(10): print(i)会打印0-9,其中list str dict tuple等都是可迭代对象
  • 其实只要实现了__iter__魔法方法,那么它就是可迭代对象
  • 自定义一个可迭代对象,只要实现__iter__方法就行

三、什么是迭代器

  • 只要实现__iter____next__方法,就是迭代器
  • 迭代器可以使用next()方法获取下一个的值,迭代器也是一个可迭代对象,因为它继承了Iterable,而且他也实现了__iter__方法
  • list str dict tuple等虽然是可迭代对象,但是却不是迭代器
  • 他们也不能使用next()获取下一个值
  • 自定义迭代器,需要实现__iter____next__方法

三、生成器

  • 上面也说过了,生成器需要使用yield关键字,yield from也是返回一个生成器的,放在函数内部即可返回一个生成器
  • 也可以使用列表解析,不过需要将方括号[]换成中括号()

四、生成器、迭代器、可迭代对象总结

  • 生成器继承迭代器,迭代器继承可迭代对象,可迭代对象继承ABCMeta抽象基类
  • 可迭代对象特性,可以使用for循环遍历,但是不能使用next()方法
  • 迭代器特性,也是可迭代对象,自然可以使用for循环遍历,也可以使用next()方法获取下一个值
  • 生成器特性,既是可迭代对象,也是迭代器,可以使用fornext(),生成器还有send()throw()close()方法

五、再谈yield

  • 咱们现在已经知道yield放在函数内部,会返回一个生成器,可以使用fornext获取下一个值
  • 那么咱们现在来看一下yield后面能跟什么类型的值,而使用for遍历后,打印的值是什么
  • 可以看到,yield后面可以跟任意值,而且返回来的和原来一样,即yield后面是什么,返回来的值就是什么
  • 甚至可以yield一个函数

六、yield from

  • yield from也是返回一个生成器的
  • 看一下yield from后面可以跟什么类型,其实yield from后面只能跟可迭代对象iterable,虽然上图跟的是一个int类型的值,虽然没有报错,但是,咱们用for循环打印一下便知
  • 所以yield from后面必须跟一个可迭代类型
  • 咱们看看yield from和yield有什么区别,咱们yield 'abcd',打印的是’abcd’,但是yield from 'abcd'打印的却是a b c d四个分开的字母


  • 其实yield from iterable内部帮咱们这样做
  • 其实yield from不仅仅只有这么简单,由于还涉及到协程,所以这里就不说那么多

七、总结

  • yieldyield from都只能用于函数内部
  • 都会返回一个生成器对象
  • yieldyield from后面能跟的值有所差别,yield后面能跟几乎所有类型的值,而且使用for循环遍历打印之后的值和后面所跟的值一样,比如yield range(10),打印之后也是range(10);而yield from后面能跟的类型只能是可迭代对象,而且yield from内部会帮我们做一层for遍历,比如yield from range(10),其实内部是做了for i in range(10): yield i这样的一步操作,另外yield from和协程、异步有所挂钩

python学习——yield和yield from相关推荐

  1. python yield from yield_python yield和yield from用法总结详解 python yield和yield from用法总结...

    #!/usr/bin/env python # -*- coding: utf-8 -*-from inspect import isgeneratorfunction def fab(max): n ...

  2. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  3. Python生成器实现及yield关键字

    Python生成器实现及yield关键字 我在另一篇文章中介绍了Python迭代器,https://blog.csdn.net/weixin_43790276/article/details/9034 ...

  4. python yield from_简述 yield 和 yield from

    yield 函数可以看成是一堆指令的集合.在函数中加入yield可以把一个函数变成一个generator,虽然调用的方式不一样了,但是其实现的功能和原来的函数基本是一样的. 而yield在这其中的作用 ...

  5. python协程--yield和yield from

    字典为动词"to yield"给出了两个释义:产出和让步.对于 Python 生成器中的 yield 来说,这两个含义都成立.yield item 这行代码会产出一个值,提供给 n ...

  6. 从yield 到yield from再到python协程

    yield 关键字 def fib():a, b = 0, 1while 1:yield ba, b = b, a+b yield 是在:PEP 255 -- Simple Generators 这个 ...

  7. python进阶:yield与yield from

    目录 yield与生成器 send close throw yield from yield与生成器 前面我们介绍过生成器:迭代器.可迭代对象.生成器的区别和联系 使用了 yield 的函数被称为生成 ...

  8. python科学计数法转换_对比Python学习Go 基本数据结构

    公众号文章不方便更新,可关注底部「阅读原文」博客,文章随时更新. 本篇是「对比 Python 学习 Go」[1] 系列的第三篇,本篇文章我们来看下 Go 的基本数据结构.Go 的环境搭建,可参考之前的 ...

  9. python基本语法语句-python学习笔记:基本语法

    原标题:python学习笔记:基本语法 缩进:必须使用4个空格来表示每级缩进,支持Tab字符 if语句,经常与else, elif(相当于else if) 配合使用. for语句,迭代器,依次处理迭代 ...

最新文章

  1. RecycleView 各个条目的信息混乱
  2. es6 Promise
  3. Leetcode1705. 吃苹果的最大数目[C++题解]:贪心
  4. MSDE 1433端口
  5. Javascript——说说js的调试
  6. vb+socket 编写入侵监听程序
  7. java电子通讯录毕业设计_(C)JAVA001电子通讯录(带系统托盘)
  8. 大话 JavaScript 动画
  9. mvc 前段定义变量_3分钟短文 | Laravel blade模板里优雅地定义PHP变量
  10. linux android真机测试
  11. eBPF学习记录(四)使用libbpf开发eBPF程序
  12. Linux rmmod命令
  13. java语句电脑定时关机_月光软件站 - 编程文档 - Java - windows定时关机程序
  14. linux 输入--输出--重定向 stdin/stdout/stderr
  15. java sec_java.security文件
  16. 带有点***色彩的LanHelper网络工具的使用
  17. CISCO 思科2960G CONSOLE口越过登陆账号密码访问
  18. JuliaFEM中的数据格式——fields.jl
  19. 日均5亿查询量,京东到家订单中心ES架构演进
  20. Windows版本下安装使用Grafana教程

热门文章

  1. ubuntu无法使用man
  2. reactive函数实现响应式数据
  3. Basketball Dribbling
  4. 矩型窗、哈明窗、汉宁窗、莱克曼窗等一系列函数
  5. 【报错总结】无法连接Hive的MetaStore数据库
  6. JAVA开发(后端):微信小程序API调用详细分析及步骤
  7. html移动端注册流程,登录和注册移动端.html
  8. 链路追踪-SkyWalking
  9. 什么是通信协议?什么是互操作性?
  10. 1700802088 韩晓忠