Python:next()函数

3zz*_*zzy 42 python sum next

我正在从一本书中学习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
Run Code Online (Sandbox Code Playgroud)

由于我是一个绝对的初学者,并且作者没有提供对示例或next()函数的任何解释,我不明白代码在做什么.

jtb*_*des 72

表达式(sum(row) for row in M)创建了所谓的生成器.此生成器将为sum(row)每行中的表达式()计算一次M.但是,生成器还没有做任何事情,我们只是设置它.

该语句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
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • +1:只有改进这个答案的东西才是关于生成器的文档(和官方示例)的链接:http://docs.python.org/tutorial/classes.html#generators (6认同)
  • 它包含在2.6:http://docs.python.org/2.6/library/functions.html#next中 (3认同)

Sim*_*món 10

如果你走得那么远,那么你应该已经知道了一个常见的for-in语句是如何工作的.

以下声明:

for row in M: print row
Run Code Online (Sandbox Code Playgroud)

将M视为3行(子序列)的序列,每行3个项目,并迭代M,输出矩阵上的每一行:

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

你知道,那......

你可以看到生成器就像for-in循环中的一些语法糖一样.忘掉sum()调用,在IDLE上键入这样的东西:

G = (row for row in M)
print G
for a in G: print a
Run Code Online (Sandbox Code Playgroud)

你看,生成器不能直接表示为文本,而不仅仅是序列可以表示.但是,您可以像生成序列一样遍历Generator.

您会发现一些重大差异,但基本原则是您可以使用生成器不仅返回序列中每个项的值,而是返回任何表达式的结果.在教程的示例中,表达式为sum(row).

尝试以下操作,看看会发生什么:

G = ("("+str(row[2])+";"+str(row[1])+";"+str(row[0])+")" for row in M)
G.next()
G.next()
G.next()
Run Code Online (Sandbox Code Playgroud)