• 周二. 2月 7th, 2023

Python 生成器表达式的详细用法

生成器表达式是一种在 Python 中快速创建生成器的方法。它们的语法类似于列表推导式,但是它们使用圆括号而不是方括号。

举个例子,下面是一个生成器表达式,它创建了一个生成器,生成 0 到 9 的平方:





squares = (x**2 for x in range(10))

生成器表达式的优势在于它们比列表推导式更加节省内存。因为生成器只在需要的时候生成值,而不是一次性生成所有值并存储在内存中。

你可以通过使用 next() 函数或者在循环中使用生成器来访问生成器中的值。例如,下面是一个使用生成器表达式的简单程序:





squares = (x**2 for x in range(10))

for i in squares:
    print(i)

输出:





0
1
4
9
16
25
36
49
64
81

生成器表达式也可以和函数结合使用,例如:





def get_squares(n):
    return (x**2 for x in range(n))

for i in get_squares(5):
    print(i)

输出:





0
1
4
9
16

因此,生成器表达式是一种简单、高效的方法,用来创建 Python 中的生成器。

成器表达式也可以使用过滤器,就像列表推导式一样。这可以帮助我们只生成我们感兴趣的值。例如,下面的生成器表达式只生成小于 50 的平方:





squares = (x**2 for x in range(100) if x**2 < 50)

for i in squares:
    print(i)

输出:





0
1
4
9
16
25
36
49

还可以将生成器表达式嵌套在其他生成器表达式中。例如,下面的代码使用两个嵌套的生成器表达式来生成质数:





def is_prime(n):
    if n in [0, 1]:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

primes = (x for x in range(100) if is_prime(x))

for i in primes:
    print(i)

输出:





2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97

因此,生成器表达式是一种强大的工具,可以帮助我们快速创建生成器,并且节省内存。

阅读  Python 单元测试方法的使用详解

除了使用生成器表达式来创建生成器外,还可以使用 yield 关键字来创建生成器。这种方法被称为生成器函数。

生成器函数和普通函数很相似,但是它使用 yield 而不是 return 来生成值。例如,下面是一个使用生成器函数生成 0 到 9 的平方的程序:





def squares(n):
    for i in range(n):
        yield i ** 2

for i in squares(10):
    print(i)

输出:





0
1
4
9
16
25
36
49
64
81

生成器函数有几个优点。首先,它们可以使用普通函数中的所有语句,例如循环、条件语句和函数调用。其次,生成器函数可以被暂停,并在下一次迭代时从上一次停止的地方继续执行。这使得它们特别适用于生成大量值的情况,因为可以节省内存。

下面是一个生成器函数的例子,它生成一个无限的斐波那契数列:





def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

for i in fibonacci():
    print(i)

输出:





0
1
1
2
3
5
8
13
21
34
55
89
144

总之,生成器函数是另一种创建函数的用法。生成器表达式是一种强大的工具,可以帮助我们快速创建生成器,并且节省内存。