【发布时间】:2011-03-13 16:38:52
【问题描述】:
越来越多的 Python 特性变成了“惰性可执行文件”,比如生成器 表达式和其他类型的迭代器。 然而,有时我看到自己想要滚动一个单行“for”循环,只是为了执行一些操作。
真正执行循环的最 Pythonic 的事情是什么?
例如:
a = open("numbers.txt", "w")
(a.write ("%d " % i) for i in xrange(100))
a.close()
不是实际的代码,但你明白我的意思。相反,如果我使用列表生成器,我会产生一个副作用,即创建一个填充了“无”的 N 长列表。
目前我所做的是将表达式用作调用“any”或“all”的参数。但我想找到一种不依赖于循环中执行的表达式的结果的方法——“any”和“all”都可以根据评估的表达式停止。
需要明确的是,这些是我已经知道的方法,并且每种方法都有其缺点:
[a.write ("%d " % i) for i in xrange(100))]
any((a.write ("%d " % i) for i in xrange(100)))
for item in (a.write ("%d " % i) for i in xrange(100)): pass
【问题讨论】:
-
"N 长列表,里面有修女。"
-
澄清一下:我很少在生产代码中使用这样的东西——考虑到这里的反应,我可能会完全停止。但是我喜欢写单行的东西(尽管这些东西本质上是不合常规的),这是我最想念的地方。就在昨天,我花了很长时间试图为 ruby 的 1.9.2 “chunck”列表方法获得一个单行。 (单行版本很糟糕——但是在“执行的生成器”之前声明字典的多行给 Python 提供了比“chunck”更好的东西)
-
@Nas:停止随意指责人们没有做过的事情。
-
@jsbueno,对于你想要 Haskell 论坛的单行者:“sequence_ $ map print [0..99]”。嗯嗯。 :-)
-
没有不好的问题,只有不好的做法。致所有仇恨者:请停止对任何敢于回答的人投反对票!知识就是力量 - 如果你想要
forbiden fruit概念,你应该做宗教而不是编程;-)
标签: python lazy-evaluation generator