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

标签 python python-3.x

我的文件命名为:

'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)

或者,我尝试使用 lambdamap 进行函数式编程

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)

关于python - 在循环中应用 `lambda` 和 `map`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46763393/

相关文章:

python - 使用 scipy optimize 进行最优控制

python - 是否有Python3内置用于格式化表示多项式首项系数的字符串?

python - 获取列表中重复元素的索引范围

python - 使用flask和python3的GET方法和较大的文本

python 属性装饰器

python - 我是否针对 Keras 中的 LSTM 优化了输入数据的格式?

python-3.x - 哪个声谱图最能代表基于 CNN 模型的音频文件的特征?

c - Python 对字节的解释。 (C 内存复制)

Python Mongodb 通过批量大小限制超时

python - 如何使用 Python 从网站中提取表格