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())