我来自 Matlab,发现在 Python 中理解生成器的概念有些困难。
请问以下问题:
- 生成器函数和循环的区别
- 何时应该使用它们
生成器提供了一种创建元素的方式,不需要在开始遍历之前将所有元素都保存在内存中。循环只是让生成器或其他可迭代对象逐个地返回元素。
例如:
for i in range(10):
print(i)
for
块是一个循环,range
基本上是一个生成器。在循环开始之前,range
不会创建1-10的列表,它只是创建了这些元素的生成器。你也可以想象一下range(1000000000000000000)
,因为在需要使用它们之前,没有任何元素被创建(而且不会占用内存),所以创建它也不需要时间。list
。for i in [0,1,2,3,4,5,6,7,8,9]:
print(i)
range
并不是真正的生成器,但为了简单起见,我使用了它来解释生成器的“惰性”。def my_range(n):
for i in range(n):
yield i
range_of_10 = my_range(10)
for i in range_of_ten:
print(i)
result:
0
1
3
4
5
6
7
8
9
或者
>>> range_of_ten = my_range(10)
>>> next(range_of_ten)
0
>>> next(range_of_ten)
1
etc.
>>> next(range_of_ten)
9
>>> next(range_of_ten)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
def double_loop(n, m):
for i in range(n):
for j in range(m):
yield i, j
n = double_loop(2, 4)
for i in n:
print(i)
(0, 0)
(0, 1)
(0, 2)
(0, 3)
(1, 0)
(1, 1)
(1, 2)
(1, 3)
1:1000
的工作方式与Python的range
完全相同。也就是说,MATLAB的for
循环的工作方式与此处描述的两种模式完全相同。 - Cris Luengo