我正在从一本书中学习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)
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)
| 归档时间: |
|
| 查看次数: |
54519 次 |
| 最近记录: |