Python yield关键字 和 Generator(生成器)

Generators functions allow you to declare a function that behaves like an iterator, i.e. it can be used in a for loop. https://wiki.python.org/moin/Generators 翻译:生成器功能允许你声明一个行为类似于迭代器的函数,它也能用在for循环中。

Python Yield关键字

yield关键字类似于return,不同之处在于Python的return返回一个值(或者一个set),而yield返回的是一个生成器对象,下面将详细解释什么是生成器。

Python Generator

Python生成器是Python独有的高级特性,其也是用来实现迭代的操作,生成器自动实现了迭代器协议,是可迭代对象之一,它的存在增强了Python的简便性。

定义生成器有2种方法:

方法一:生成器表达式

类似于列表表达式,只要将列表表达式的[列表形式 生成规则]的“[]”改为“()”,就得到了一个生成器的表达式,返回一个生成器对象。这里不再介绍生成器表达式,参见列表表达式。

>>> (x * x for x in range(1,11))
<generator object <genexpr> at 0x03740CF0>  #是个对象
>>> list((x * x for x in range(1,11)))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>>

方法二:生成器函数

即以定义函数的形式定义生成器,区别在于return关键字改成yield,返回值是一个generator对象。

>>> def generator():
...     list = range(6)
...     for i in list:
...         yield i * i
...
>>> print(generator())
<generator object generator at 0x03740F60>  #是个对象
>>> g = generator()
>>> for i in g:
...     print(i)
...
0
1
4
9
16
25
>>>

需要注意的地方

生成器函数和普通的函数执行流程不一样,函数是顺序执行,碰到return即返回,而生成器函数也可以像Java迭代那样可以用next()函数来取下一个值,取到穷尽也会报错。 但是,如果一个函数里有yileld关键字,那么当你调用这个函数时,函数内部代码并不会立即执行,仅仅返回一个空的对象。函数代码真正执行在使用for语句进行迭代时,每次迭代返回一个值后,然后进行下一次循环,yield关键字将挂起该生成器函数的状态,并且保留函数信息。这样做的好处是,所有的结果并不是在一瞬间产生的,而是有所延迟,在大规模数据处理中将受益无穷。

参考资料https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317799226173f45ce40636141b6abc8424e12b5fb27000

http://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html 摘录: 迭代是一个实现可迭代对象(实现的是 iter() 方法)和迭代器(实现的是 next() 方法)的过程。可迭代对象是你可以从其获取到一个迭代器的任一对象。迭代器是那些允许你迭代可迭代对象的对象。

翻译自stackoverflow。

补充内容

语法上和函数类似:生成器函数和常规函数几乎是一样的。它们都是使用def语句进行定义,差别在于,生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值

自动实现迭代器协议:对于生成器,Python会自动实现迭代器协议,以便应用到迭代背景中(如for循环,sum函数)。由于生成器自动实现了迭代器协议,所以,我们可以调用它的next方法,并且,在没有值可以返回的时候,生成器自动产生StopIteration异常

状态挂起:生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行

Python生成器有什么优点 https://www.zhihu.com/question/24807364

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏老马说编程

计算机程序的思维逻辑 (8) - char的真正含义

看似简单的char 通过前两节,我们应该对字符和文本的编码和乱码有了一个清晰的认识,但前两节都是与编程语言无关的,我们还是不知道怎么在程序中处理字符和文本。 ...

1796
来自专栏有趣的Python

6-Java常用工具类-集合排序

http://www.runoob.com/java/java-generics.html

873
来自专栏Albert陈凯

scala 隐式详解(implicit关键字)

掌握implicit的用法是阅读Spark源码的基础,也是学习Scala其它的开源框架的关键,implicit 可分为: 隐式参数 隐式转换类型 隐式调用...

3019
来自专栏小小挖掘机

由问题入手,步步爬出Python中赋值与拷贝的坑

1、问题的引出 之前遇到了一个求数组中出现次数最多的k个元素的题,我们参照如下的思路进行求解,首先利用一个dict记录所有元素出现的次数,key:value中的...

38910
来自专栏编程

宝宝都能学会的python编程教程2:数据类型和变量

数据类型 了解一门编程语言最开始就是了解它的数据类型了,python基本的数据类型分为如下几类: 整数 Python可以处理任意大小的整数,当然包括负整数,在程...

20710
来自专栏三流程序员的挣扎

Python 自学二——类型

', '.join(['cats', 'rats', 'bats']) # 以 `, ` 分隔 'cats, rats, bats' s = 'cat ra...

1503
来自专栏河湾欢儿的专栏

第五节正则

872
来自专栏C/C++基础

字符数组的初始化与赋值

C语言中表示字符串有两种方式,数组和指针,字符数组是我们经常使用的方式。变量的定义包括指明变量所属类型、变量名称、分配空间以及初始化。可以看出,变量的初始化是变...

1802
来自专栏cs

c++13.0 STL[stack,queue,set,dequeue]

set相关知识点: ---- set:集合,红黑树实现 特点: 1.0 内部的元素根据其值自动排序。 2.0 内部元素只能出现一次。 set数据结...

2336
来自专栏PHP在线

PHP部分字符串函数汇总

我们大家知道无论哪种语言,字符串操作都是一个重要的基础,往往是简单而重要。PHP给我们提供了大量的字符串操作函数,功能强大,使用也比较简单,这里为大家总结九类字...

3386

扫码关注云+社区

领取腾讯云代金券