【问题标题】:Python: next() functionPython:下一个()函数
【发布时间】:2010-12-16 12:32:08
【问题描述】:

我正在从一本书中学习 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() 函数提供任何解释,所以我不明白代码在做什么。

【问题讨论】:

    标签: python sum next


    【解决方案1】:

    表达式(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
    

    另见:

    【讨论】:

    • 另外提到'next()' 直到 Python 2.7 才被添加为内置函数。
    • 它一定是更早存在的,因为我的电脑有2.6.1并且它可以工作。
    【解决方案2】:

    如果您已经走到了这一步,那么您应该已经知道常见的 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()
    

    【讨论】:

      猜你喜欢
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      • 2022-12-08
      • 1970-01-01
      相关资源
      最近更新 更多