Python中的yield关键字做了什么

要理解yield做了什么,就必须明白生成器(generators)为何物,而在明白生成器之前还要知道迭代器(iterables)。

1.迭代器

当我们创建一个list的时候,我们可以一个接一个的读取它的成员。这种一个接一个读取的行为叫做迭代:

>>>mylist = [1, 2, 3]

>>>for i in mylist:

... print(i)

1

2

3

mylist就是一个迭代器。当我们使用列表推导式(亦称列表生成式,list comprehension)时,我们创建了一个list,同时还有一个迭代器:

>>>mylist = [x*x for x in range(3)]

>>>for i in mylist:

... print(i)

0

1

4

我们可以使用“ for … in …”的任何事物都是迭代器,如:列表、字符串、文件等。

这些迭代器很便利,我们可以想读取多少就读取多少,但是我们要在内存中储存所有的可取值,然而当我们有太多的值时我们不总是希望如此。

2.生成器

生成器(generators)也是迭代器,但是我们只能对其迭代一次。这是因为生成器并没有在内存中存储所有的值,而是要靠动态生成。

>>> mygenerator = (x*x for x in range(3))>>> for i in mygenerator:... print(i)014

我们用圆括号()代替了方括号[],除此之外是相同的。但是,我们不能重复执行for i in mygenerator,因为生成器只能使用一次:先计算出0,然后就忘了这个0并计算出1,最终计算出4。

3.yieldyield是一个关键字,使用起来类似return,但是使用的函数会返回一个生成器。

>>> def createGenerator():... mylist = range(3)... for i in mylist:... yield i*i...>>> mygenerator = createGenerator() # 创建一个生成器>>> print(mygenerator) # mygenerator是一个对象!>>> for i in mygenerator:... print(i)014

这是一个没用的例子,但是当我们知道我们的函数要返回一个庞大的值集合,而这些值我们只会迭代读取一次时,这样使用是很方便的。

要掌握yield,我们必须理解当我们在调用函数的时候,我们在函数体中写的代码并没有执行。函数仅返回了一个生成器对象,这有点意想不到。

然后,当for每次使用生成器的时候,我们的代码都会被执行一次。

重要的细节部分:

第一次for调用由我们的函数创建的生成器时,会从头执行我们函数中的代码直到遇见yield关键字,然后会返回循环的第一个值。其后每次调用都会再一次运行我们在函数中写的循环,返回下一个值,以此一直到再没有返回值。

一旦函数运行但不再激发yield时,就可以认为生成器已经空了。这可能是由于循环已经结束,或者由于我们不再满足“if/else”的条件判断。

本文版权归传智播客人工智能+Python学院所有,欢迎转载,转载请注明作者出处。谢谢!

作者:传智播客人工智能+Python学院

python里的关键字有哪些_Python中的yield关键字做了什么?相关推荐

  1. python中关键字参数含义_python中接受任意关键字的参数

    1.*args args是非关键字参数,可以理解为形参,为了方便记忆我理解它是arguments的缩写. 2.*kwargs kwargs是键值对参数,为了方便记忆我理解它是key word argu ...

  2. python里的shell是什么_python中的shell操作

    http://blog.csdn.net/meng_tianshi/article/details/6682317 首先介绍一个函数: os.system(command) 这个函数可以调用shell ...

  3. python3 yield和iter的区别_Python中的yield关键字

    Yield? 总的来说,yield关键字和return关键字有相似之处,但其工作机制却大相径庭.想要完整地理解yield的工作机制,我们首先需要明白什么是generator.而为了明白什么是gener ...

  4. python里dir是什么意思_python中dir什么作用

    python中dir的作用是:1.dir函数传入数据类型返回该数据类型的所有内置方法:2.dir函数传入模块名返回该模块的所有属性和方法. dir() 内置函数的作用 python 内置方法有很多,无 ...

  5. python里object是什么类型_Python中的object这个叫做基类的类,它的属性和行为都有哪些?...

    声明:以下仅为个人学习Python过程中总结的比较自洽的理解,事实上Python面向对象模型可能没那么简单.经查阅,Python在以前的版本还有不继承自object的类,叫做经典类. 用dir(obj ...

  6. python里randint是什么意思_Python中random.randint方法(精选)

    Python中 random.randint方法的具体用法?Python 中random.randint怎么用?Python 中random.randint使用的例子?以下例子或许可以帮助到你: 示例 ...

  7. python里的log怎么表示_python中的对数log函数表示及用法

    在数学运算中,如果没有计算器,对于很大的数字相乘,我们花费大量的时间计算,而且一旦出错,就要重新计算,很是麻烦.其实对于数字相乘,不依靠靠计算器,想要准确简单的运算的方法不是没有,那就是对数和指数,他 ...

  8. python里raise是什么意思_Python中raise与raise...from之间有何区别?

    本篇文章给大家带来的内容是关于Python中raise 与 raise ... from之间有何区别?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 起步 Python 的 raise ...

  9. python里try和except用法_Python中的错误和异常处理简单操作示例【try-except用法】...

    本文实例讲述了Python中的错误和异常处理操作.分享给大家供大家参考,具体如下: #coding=utf8 print ''''' 程序编译时会检测语法错误. 当检测到一个错误,解释器会引发一个异常 ...

最新文章

  1. VLOG丨树莓派Raspberry Pi 3安装PLEX并挂载USB硬盘打造最牛的微型家庭影音服务器2018...
  2. sql语句的简单记录
  3. http请求curl
  4. 笔试题 - 阶乘问题
  5. ModelMapper 中高级使用 java
  6. 腾讯开源大规模X光预训练模型及代码 |MICCAI 2020
  7. linux脚本定时运行脚本,linux定时运行命令脚本——crontab
  8. WebService学习总结(三)——使用JDK开发WebService
  9. 30+岁、没转管理、加不动班,我的竞争力从哪里来?
  10. 2018年英语计算机职称考试,2018年高级职称计算机考试内容介绍
  11. 《深入理解计算机系统》CSAPP第三章知识点归纳(看完一遍复习专用)
  12. 阿里 Java 性能调优手册,简直yyds
  13. 基于javaweb+jsp的户籍管理系统(JavaWeb MySQL JSP Bootstrap Servlet SSM SpringBoot)
  14. 2021阿里云开发者大会——时隔两年平头哥有哪些杰作?
  15. Unity制作RPG游戏——补充
  16. 苹果审核状态为Metadata Rejected下的问题
  17. http请求发送工具类
  18. python+tkinter创作老黄历,窗口化显示:择吉,五行,财福喜神
  19. php symfony 安装,symfony安装详细教程
  20. 【源代码】关于D_S证据理论和可信度的计算

热门文章

  1. optee3.8 qemu_v8的环境搭建篇
  2. 菜鸟学前端之遍寻名师
  3. (69)番外 —— 编写一个简易的反调试引擎
  4. 无源码修改exe文件图标
  5. Windows进程与线程学习笔记(四)—— 等待链表调度链表
  6. 系统调用001 API从三环进零环的过程
  7. 1、MySQL约束概述
  8. Ksenia and Pan Scales(思维题)
  9. 1135 Is It A Red-Black Tree (30 分)【难度: 难 / 知识点: 红黑树 未完成】
  10. P3865 【模板】ST 表【又称RMQ】