在python3.1中无法以函数式方式关闭文件?
我写了一行代码,使用了lambda来关闭一组文件对象,这段代码是在python2.6中写的:
map(lambda f: f.close(), files)
这段代码在python2.6中能正常工作,但在python3.1中就不行了。为什么呢?
下面是我的测试代码:
import sys
files = [sys.stdin, sys.stderr]
for f in files: print(f.closed) # False in 2.6 & 3.1
map(lambda o : o.close(), files)
for f in files: print(f.closed) # True in 2.6 but False in 3.1
for f in files: f.close()
for f in files: print(f.closed) # True in 2.6 & 3.1
2 个回答
4
因为在Python 3中,map是一个懒惰的迭代器。引用一下官方文档:
返回一个迭代器,它对可迭代对象中的每一项应用函数,生成结果。
比如,在Python 2中,map(f, seq)
相当于[f(i) for i in seq]
,但是在Python 3中,它变成了(f(i) for i in seq)
——语法上看起来有点不同,但实际意义上差别很大。要让map的变体正常工作,你需要消耗这个迭代器。因此,使用显式的for循环会更简单(而且更符合习惯:map、列表推导和生成器不应该有副作用!)。
6
map
在 Python 2 中返回一个列表,但在 Python 3 中返回一个迭代器。所以,只有当你遍历这个结果时,文件才会被关闭。
不要对有副作用的函数使用 map
或类似的“函数式”函数。Python 不是一种函数式编程语言,也永远不会变成。建议使用 for
循环:
for o in files:
o.close()