Python: next() 函数

53 投票
2 回答
62400 浏览
提问于 2025-04-15 16:00

我正在通过一本书学习Python,遇到了一个例子:

M = [[1,2,3],
     [4,5,6],
     [7,8,9]]

G = (sum(row) for row in M) # create a generator of row sums
next(G) # Run the iteration protocol

因为我还是个完全的新手,而且作者没有对这个例子或next()这个函数做任何解释,所以我不明白这段代码在干什么。

2 个回答

10

如果你已经了解这些内容,那么你应该知道常见的 for-in 语句是怎么工作的。

下面这个语句:

for row in M: print row

会把 M 看作是一个包含 3 行(子序列)的序列,每行有 3 个项目,然后遍历 M,输出矩阵中的每一行:

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]

你知道这些,对吧……

你可以把生成器看作是 for-in 循环的一种语法糖。忘掉 sum() 的调用,试着在 IDLE 中输入类似这样的内容:

G = (row for row in M)
print G
for a in G: print a

你会发现,生成器不能像文本那样直接表示,而是像序列一样。

不过,你可以像遍历序列一样遍历生成器。

你会发现一些大的不同,但基本上,你可以使用生成器来返回的不仅仅是序列中每个项目的值,而是任何表达式的结果。在教程的例子中,这个表达式就是 sum(row)。

试试下面的内容,看看会发生什么:

G = ("("+str(row[2])+";"+str(row[1])+";"+str(row[0])+")" for row in M)
G.next()
G.next()
G.next()
78

这个表达式 (sum(row) for row in M) 创建了一个叫做生成器的东西。这个生成器会对 M 中的每一行计算一次 sum(row),也就是求和。不过,这个生成器现在还没有做任何事情,我们只是把它准备好了。

当你执行 next(G) 时,实际上是让生成器开始对 M 进行计算。所以,如果你第一次运行 next(G),你会得到第一行的和。如果你再运行一次,就会得到第二行的和,依此类推。

>>> M = [[1,2,3],
...      [4,5,6],
...      [7,8,9]]
>>> 
>>> G = (sum(row) for row in M) # create a generator of row sums
>>> next(G) # Run the iteration protocol
6
>>> next(G)
15
>>> next(G)
24

相关链接:

撰写回答