Python 生成器与嵌套for循环

Python 生成器与嵌套for循环,python,python-3.x,generator,generator-expression,Python,Python 3.x,Generator,Generator Expression,我有两种方法对文本文件中的数字求和。第一个有效,第二个无效。谁能解释一下第二个有什么问题吗 输入文本文件: The quick brown 123 fox 456 jumped over the 789 lazy dog. 方法#1: 这给出了正确答案1368(=123+456+789) 方法2: 这将产生以下错误: NameError: name 'line' is not defined 我在玩弄生成器,所以问题是为什么方法2中的生成器不好。我不需要关于在文本文件中添加数字的其他方法的建

我有两种方法对文本文件中的数字求和。第一个有效,第二个无效。谁能解释一下第二个有什么问题吗

输入文本文件:

The quick brown 123
fox 456 jumped over
the 789 lazy dog.
方法#1:

这给出了正确答案1368(=123+456+789)

方法2:

这将产生以下错误:

NameError: name 'line' is not defined

我在玩弄生成器,所以问题是为什么方法2中的生成器不好。我不需要关于在文本文件中添加数字的其他方法的建议。我想知道是否有一个发电机唯一的解决方案没有一个标准的循环。谢谢。

您颠倒了循环的顺序。生成器表达式(与所有Python理解语法变体一样)按块嵌套顺序从左到右列出循环

这项工作:

numbers = (int(block) for line in open(fn) for block in line.split() if block.isdigit())
因为它与正常
for
循环的嵌套顺序相匹配(前面只有每次迭代表达式):

您的代码试图访问
line.split()
,然后才能执行
for line in open(fn)
循环并设置
line

见:

理解包括一个表达式,后跟至少一个<代码>的<代码>子句和零个或多个<代码>的<代码>或<代码>如果<代码>子句。在这种情况下,新容器的元素是通过将
for
if
子句中的每个子句视为块,从左到右嵌套,并在每次到达最里面的块时计算表达式以生成元素而产生的元素


粗体强调。将块置于行中的
位置。拆分()
置于打开的行(fn)的
之后。
谢谢。现在有道理了。
NameError: name 'line' is not defined
numbers = (int(block) for line in open(fn) for block in line.split() if block.isdigit())
numbers = (int(block)
    for line in open(fn)
        for block in line.split()
            if block.isdigit())