ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python 生成器

2021-11-04 19:35:27  阅读:140  来源: 互联网

标签:函数 python 生成器 yield next num 继续执行


生成器

生成器本质上也是迭代器,但更为特殊以 list 容器为例,在使用该容器迭代一组数据时,
必须事先将所有数据存储到容器中,才能开始迭代;而生成器却不同,它可以实现在迭代的同时生成元素。

不仅如此,生成器的创建方式也比迭代器简单很多,大体分为以下 2 步:
定义一个以 yield 关键字标识返回值的函数;
调用刚刚创建的函数,即可创建一个生成器。


def intNum():
    print("开始执行")
    for i in range(5):
        yield i
        print("继续执行")
num = intNum() 

由此,我们就成功创建了一个 num生成器对象。显然,和普通函数不同,intNum()函数的返回值用的是 yield 关键字,
而不是 return 关键字,此类函数又成为生成器函数。和 return 相比,yield 除了可以返回相应的值,
还有一个更重要的功能,即每当程序执行完该语句时,程序就会暂停执行。不仅如此,即便调用生成器函数,
Python 解释器也不会执行函数中的代码,它只会返回一个生成器(对象)。

要想使生成器函数得以执行,或者想使执行完 yield 语句立即暂停的程序得以继续执行,有以下 2 种方式:

  • 通过生成器(上面程序中的 num)调用 next() 内置函数或者 next() 方法;
  • 通过 for 循环遍历生成器。

例如,在上面程序的基础上,添加如下语句:


#调用 next() 内置函数
print(next(num))
#调用 __next__() 方法
print(num.__next__())
#通过for循环遍历生成器
for i in num:
    print(i)

程序执行结果为:
开始执行
0
继续执行
1
继续执行
2
继续执行
3
继续执行
4
继续执行

执行流程:

  1. 首先,在创建有 num 生成器的前提下,通过其调用 next() 内置函数,会使 Python 解释器开始执行 intNum() 生成器函数中的代码,因此会输出“开始执行”,程序会一直执行到yield i,而此时的 i==0,因此 Python 解释器输出“0”。由于受到 yield 的影响,程序会在此处暂停。

  2. 然后,我们使用 num 生成器调用 next() 方法,该方法的作用和 next() 函数完全相同(事实上,next() 函数的底层执行的也是 next() 方法),它会是程序继续执行,即输出“继续执行”,程序又会执行到yield i,此时 i==1,因此输出“1”,然后程序暂停。

  3. 最后,我们使用 for 循环遍历 num 生成器,之所以能这么做,是因为 for 循环底层会不断地调用 next() 函数,使暂停的程序继续执行,因此会输出后续的结果。

除此之外,还可以使用 list() 函数和 tuple() 函数,直接将生成器能生成的所有值存储成列表或者元组的形式。例如:


num = intNum()
print(list(num))
num = intNum()
print(tuple(num))

开始执行
继续执行
继续执行
继续执行
继续执行
继续执行
[0, 1, 2, 3, 4]
开始执行
继续执行
继续执行
继续执行
继续执行
继续执行
(0, 1, 2, 3, 4)
通过输出结果可以判断出,list() 和 tuple() 底层实现和 for 循环的遍历过程是类似的
相比迭代器,生成器最明显的优势就是节省内存空间,即它不会一次性生成所有的数据,而是什么时候需要,什么时候生成。

标签:函数,python,生成器,yield,next,num,继续执行
来源: https://www.cnblogs.com/01black-white/p/15509854.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有