在python3.1中无法以函数式方式关闭文件?

5 投票
2 回答
507 浏览
提问于 2025-04-16 03:58

我写了一行代码,使用了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()

撰写回答