编程语言
首页 > 编程语言> > python生成器

python生成器

作者:互联网

目录

1.生成器

生成器本质上也是迭代器,不过它比较特殊。

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

也就是说,对于可以用某种算法推算得到的多个数据,生成器并不会一次性生成它们,而是什么时候需要,才什么时候生成。

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

举个例子:

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

由此,我们就成功创建了一个num生成器对象。显然,和普通函数不同,intNum()函数的返回值用的是yield关键字,而不是return关键字,此类函数又称为生成器函数。

return相比,yield除了可以返回相应的值,还有一个更重要的功能,即每当程序执行完该语句时,程序就会暂停执行。不仅如此,即便调用生成器函数,Python 解释器也不会执行函数中的代码,它只会返回一个生成器(对象)。

要想使生成器函数得以执行,或者想使执行完yield语句立即暂停的程序得以继续执行,有以下2种方式:
1.通过生成器(上面程序中的 num)调用next()内置函数或者__next__()方法;
2.通过for循环遍历生成器。

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

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

程序执行结果为:

开始执行
0
继续执行
1
继续执行
2
继续执行
3
继续执行
4
继续执行

这里有必要给读者分析一个程序的执行流程:

除此之外,还可以使用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,生成器,next,num,继续执行
来源: https://www.cnblogs.com/even160941/p/16455332.html