Python基础教程

005_生成器与生成器表达式

生成器与生成器表达式

Python生成器的理解

Python生成器(generator)可以理解成内存中保存的一个数学公式(算法),这个公式可以生成一系列数据,每次调用时只能取出其中一个数据。这样做的好处是节省了内存(不有保存所有数据,而只需要保存生成数据的公式即可)。即Python生成器保存的是算法,而不是算法计算出来的数据。

生成器(的结果)是一种迭代器(见后面迭代器讲解),拥有next方法,可以用于for循环。

要创建一个生成器,有很2种方法。

  • 生成器函数
  • 生成器表达式

Python生成器函数

如果一个函数内部出现了yield这个关键字,那么该函数就是一个生成器函数,调用生成器函数将得到一个生成器。

def genfun(n):
    i = 0
    while i < n:
        yield i
        i += 1

generate = genfun(5)
print(type(generate))
for item in generate:
    print(item)

运行结果

<class 'generator'>
0
1
2
3
4

Process finished with exit code 0

yield相当于return,就是返回结果

def genfun():
    yield(1)
    yield(2)
    yield(3)

generate = genfun()
print(type(generate))
for item in generate:
    print(item)

运行结果

C:UsershccmaAnaconda3python.exe E:/wkp01/p00/test01/py001/t09.py
<class 'generator'>
1
2
3

Process finished with exit code 0

Python生成器表达式

Python生成器表达式与列表推导式很像,格式上把中括号换成小括号即可。

(返回值 for 元素 in 可迭代对象 if 条件)

返回一个生成器,生成器也是一个对象,属于中间值。

gen1=(x for x in range(10))
print(gen1)                          # <generator object <genexpr> at 0x0000021A8BFEC748>
print(next(gen1))                    # 0
print(next(gen1))                    # 1
print(next(gen1))                    # 2
print(next(gen1))                    # 3
gen2=(x*x for x in range(10))
print(gen2)                          # <generator object <genexpr> at 0x0000021A8C00F148>
gen3=(x*x for x in range(10) if x % 2==0)
print(gen3)                          # <generator object <genexpr> at 0x0000021A8C00F248>

生成器对象的取值只能一次一次取值。

next() 函数是Python内置函数,返回迭代器的下一个项目。

生成器可以通过迭代(循环)取值。

gen1=(x for x in range(10))
for item in gen1:
    print(item)

运行结果

C:UsershccmaAnaconda3python.exe E:/wkp01/p00/test01/py001/t09.py
0
1
2
3
4
5
6
7
8
9

Process finished with exit code 0
这篇文章对您有用吗?

我们要如何帮助您?