You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用列表推导式实现函数的迭代调用

实现列表推导式中的函数迭代调用

要实现根据list1中的次数,生成对应次数的函数迭代调用列表list2,核心是针对每个次数n,重复调用函数f n次,且每次将前一次的调用结果作为下一次的输入。下面提供两种实用方案:

方案1:使用functools.reduce简化逻辑

借助reduce可以快速实现函数的链式调用,无需额外写循环:

首先定义示例函数f(根据你的实际需求调整):

def f(x=0):
    # 示例:每次调用将输入值+1,无参时默认从0开始
    return x + 1

然后用列表推导式结合reduce实现需求:

from functools import reduce

list1 = [3, 1, 2]
list2 = [reduce(lambda acc, _: f(acc), range(n), 0) for n in list1]

逻辑说明:

  • range(n):控制迭代调用的次数(n次)
  • 0:初始值,对应f()的默认参数(如果你的f无参,需要调整初始值为f()的结果)
  • lambda acc, _: f(acc):每次迭代将上一次的结果acc传入f,生成新的结果

运行后list2的结果为[3, 1, 2],对应f(f(f()))、f()、f(f())的输出。

方案2:自定义辅助函数(更直观)

如果觉得reduce不够直观,可以写一个专门处理重复调用的辅助函数:

def repeat_func_call(func, call_times, initial=None):
    result = initial
    for _ in range(call_times):
        # 第一次调用如果没有初始值,执行无参调用;后续将结果传入函数
        result = func(result) if result is not None else func()
    return result

# 定义示例函数f
def f(x=None):
    if x is None:
        return 1
    return x * 2

list1 = [3, 1, 2]
list2 = [repeat_func_call(f, n) for n in list1]

逻辑说明:

  • repeat_func_call接收三个参数:要调用的函数func、调用次数call_times、初始值initial
  • 循环call_times次,每次根据是否有初始值决定调用方式
  • 列表推导式遍历list1,生成对应次数的调用结果

运行后list2的结果为[4, 1, 2],对应f(f(f()))(1→2→4)、f()(1)、f(f())(1→2)的输出。

注意事项

  • 确保你的函数f支持接收前一次调用的结果作为参数(如果是多次迭代调用的话);如果f完全无参且每次返回相同值,多次调用无意义
  • 如果f的无参调用和有参调用逻辑不同,需要在函数内部做区分(如方案2中的示例)

内容的提问来源于stack exchange,提问作者Brian Duong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:35:20