在循环中应用`lambda`和`map`?

Alg*_*bra 1 python python-3.x

我有文件命名为:

'guess-number.py', 'convert-object-to-dict.py'
Run Code Online (Sandbox Code Playgroud)

我将它们重命名为:

import os
import glob
py_files = glob.glob('*.py')
Run Code Online (Sandbox Code Playgroud)

然后重命名它们:

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)
Run Code Online (Sandbox Code Playgroud)

或者,我尝试用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)
Run Code Online (Sandbox Code Playgroud)

Nothings发生在目录中的文件中,而输出:

<map object at 0x109b237f0>
<map object at 0x109b23d30>
Run Code Online (Sandbox Code Playgroud)

怎么做lambda

Ry-*_*Ry- 5

怎么做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)]
Run Code Online (Sandbox Code Playgroud)

别.

您可以强制进行评估for:

for _ in map(os.rename, py_files, dst_py_files):
    pass
Run Code Online (Sandbox Code Playgroud)

这有呃的优势.

但是,如果您真的想要传递函数,那么您可以创建自己的产生副作用的明确目的:

def for_each(action, *iterables):
    for t in zip(*iterables):
        action(*t)


for_each(os.rename, py_files, dst_py_files)
Run Code Online (Sandbox Code Playgroud)