Skip to main content
 首页 » 编程设计

python之在循环中应用 `lambda` 和 `map`

2025年05月04日25pengyingh

我的文件命名为:

'guess-number.py', 'convert-object-to-dict.py' 

我要将它们重命名为:

import os 
import glob 
py_files = glob.glob('*.py') 

然后重命名它们:

for file in py_files: 
    os.rename(file, file.replace('-','_')) 
 
or 
des_py_file = [file.replace('-','_') for file in py_file ] 
for i, j in zip(py_files, dst_py_files: 
    os.rename(i,j) 

或者,我尝试使用 lambda 和 map 进行函数式编程

map(lambda i,j:os.rename(i,j),zip(py_files,dst_py_files)) 
or  
map(lambda i: os.rename(i, i.replace('-','_')),py_files) 

目录中的文件没有任何变化,同时输出:

<map object at 0x109b237f0> 
<map object at 0x109b23d30> 

如何用 lambda 做到这一点?

请您参考如下方法:

How to do it with lambda?

不要。 map(lambda i,j:os.rename(i,j),zip(py_files,dst_py_files)) 是滥用 map 的副作用,而且,正如你我注意到,在 Python 3 中不起作用,因为 Python 3 的 map 是延迟计算的。

您可以强制使用 list 或等效项来生成一个无用的列表,就像在 Python 2 中一样:

[*map(os.rename, py_files, dst_py_files)] 

不要。

您可以使用for 强制对其求值:

for _ in map(os.rename, py_files, dst_py_files): 
    pass 

这有好处,呃​​,。

不过,如果你真的想传递函数,你可以自己制作一个明确的目的来产生副作用:

def for_each(action, *iterables): 
    for t in zip(*iterables): 
        action(*t) 
 
 
for_each(os.rename, py_files, dst_py_files)