python学习——yield和yield from
一、先来看看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()
方法获取下一个值 - 生成器特性,既是可迭代对象,也是迭代器,可以使用
for
和next()
,生成器还有send()
、throw()
和close()
方法
五、再谈yield
- 咱们现在已经知道yield放在函数内部,会返回一个生成器,可以使用
for
或next
获取下一个值 - 那么咱们现在来看一下
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
不仅仅只有这么简单,由于还涉及到协程,所以这里就不说那么多
七、总结
yield
和yield from
都只能用于函数内部- 都会返回一个生成器对象
yield
和yield 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相关推荐
- 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 ...
- Python中yield和yield from的用法
yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...
- Python生成器实现及yield关键字
Python生成器实现及yield关键字 我在另一篇文章中介绍了Python迭代器,https://blog.csdn.net/weixin_43790276/article/details/9034 ...
- python yield from_简述 yield 和 yield from
yield 函数可以看成是一堆指令的集合.在函数中加入yield可以把一个函数变成一个generator,虽然调用的方式不一样了,但是其实现的功能和原来的函数基本是一样的. 而yield在这其中的作用 ...
- python协程--yield和yield from
字典为动词"to yield"给出了两个释义:产出和让步.对于 Python 生成器中的 yield 来说,这两个含义都成立.yield item 这行代码会产出一个值,提供给 n ...
- 从yield 到yield from再到python协程
yield 关键字 def fib():a, b = 0, 1while 1:yield ba, b = b, a+b yield 是在:PEP 255 -- Simple Generators 这个 ...
- python进阶:yield与yield from
目录 yield与生成器 send close throw yield from yield与生成器 前面我们介绍过生成器:迭代器.可迭代对象.生成器的区别和联系 使用了 yield 的函数被称为生成 ...
- python科学计数法转换_对比Python学习Go 基本数据结构
公众号文章不方便更新,可关注底部「阅读原文」博客,文章随时更新. 本篇是「对比 Python 学习 Go」[1] 系列的第三篇,本篇文章我们来看下 Go 的基本数据结构.Go 的环境搭建,可参考之前的 ...
- python基本语法语句-python学习笔记:基本语法
原标题:python学习笔记:基本语法 缩进:必须使用4个空格来表示每级缩进,支持Tab字符 if语句,经常与else, elif(相当于else if) 配合使用. for语句,迭代器,依次处理迭代 ...
最新文章
- RecycleView 各个条目的信息混乱
- es6 Promise
- Leetcode1705. 吃苹果的最大数目[C++题解]:贪心
- MSDE 1433端口
- Javascript——说说js的调试
- vb+socket 编写入侵监听程序
- java电子通讯录毕业设计_(C)JAVA001电子通讯录(带系统托盘)
- 大话 JavaScript 动画
- mvc 前段定义变量_3分钟短文 | Laravel blade模板里优雅地定义PHP变量
- linux android真机测试
- eBPF学习记录(四)使用libbpf开发eBPF程序
- Linux rmmod命令
- java语句电脑定时关机_月光软件站 - 编程文档 - Java - windows定时关机程序
- linux 输入--输出--重定向 stdin/stdout/stderr
- java sec_java.security文件
- 带有点***色彩的LanHelper网络工具的使用
- CISCO 思科2960G CONSOLE口越过登陆账号密码访问
- JuliaFEM中的数据格式——fields.jl
- 日均5亿查询量,京东到家订单中心ES架构演进
- Windows版本下安装使用Grafana教程