如何Pythonic地实现多次将函数作用于上一次调用的返回值
实现方案
你描述的「对初始值迭代应用同一个函数N次」的场景,正好是functools.reduce的典型适用场景,不属于语法滥用。
1. 直接用reduce实现
针对你举的PrimeChecker示例,写法如下:
from functools import reduce res = reduce(lambda acc, _: PrimeChecker(acc), range(10), 1007) print(res)
对应你原有的密码破解场景写法:
from functools import reduce res = reduce(lambda acc, _: breakSingleChar(acc), range(32), "")
参数说明:
- 第三个参数是迭代的初始值
- 第二个参数是长度为N的可迭代对象,这里用
range(N)仅用来控制迭代次数,元素本身不会用到所以用_占位 - 第一个参数是每次迭代的执行逻辑,将上一次的返回值传入目标函数得到新结果
2. 封装通用工具函数
如果经常有类似需求,可以封装成通用函数复用,可读性更高:
from functools import reduce def repeat_call(func, call_times, initial_value): return reduce(lambda acc, _: func(acc), range(call_times), initial_value) # 调用示例 res1 = repeat_call(PrimeChecker, 10, 1007) res2 = repeat_call(breakSingleChar, 32, "")
补充说明
- 如果你优先追求代码可读性,原来的for循环写法已经非常合适,逻辑清晰无学习成本,完全符合Python编码规范。
- 推导式不适用于该场景:推导式的核心作用是生成新的可迭代对象,你这个场景需要累积迭代状态,硬用推导式反而会大幅降低代码可读性。
内容的提问来源于stack exchange,提问作者NotQuiteSo1337
相关产品推荐
相关产品推荐

