生成器表达式是一种在 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
因此,生成器表达式是一种强大的工具,可以帮助我们快速创建生成器,并且节省内存。
除了使用生成器表达式来创建生成器外,还可以使用 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
总之,生成器函数是另一种创建函数的用法。生成器表达式是一种强大的工具,可以帮助我们快速创建生成器,并且节省内存。