Python高阶函数(HOF)中如何获取另一个HOF的输入参数?
高阶函数闭包中获取另一个HOF内部列表的实现方案
当然可以做到啦!不过得给你的现有代码做一点点小调整——毕竟当前some_func返回的闭包把内部的lst藏得严严实实的,咱们得给它开个“小门”,让它能把自己的列表交出来,这样在执行add操作时就能拿到x2对应的[2,3,4]了。
结合你的需求和测试用例,我给你两种可行的实现思路:
思路一:给闭包添加“获取列表”命令
我们可以让some_func返回的闭包支持一个额外的'get_list'命令,当收到这个命令时,它就返回自己内部的列表副本(返回副本是为了避免外部修改影响闭包的内部状态)。
补全后的完整代码如下:
def some_func(lst): def func(args): if args[0] == 'compute': return sum(lst) elif args[0] == 'add': another_hof = args[1] # 调用另一个HOF的'get_list'命令,拿到它的内部列表 another_lst = another_hof(('get_list',)) # 把两个列表的对应元素相加,生成新列表(这里假设两个列表长度一致) new_lst = [a + b for a, b in zip(lst, another_lst)] # 返回包装了新列表的高阶函数 return some_func(new_lst) elif args[0] == 'get_list': return lst.copy() # 返回副本防止外部篡改内部数据 return func # 跑一下测试用例验证效果 x1 = some_func([1,2,3]) x2 = some_func([2,3,4]) print(x1(('compute',))) # 输出6,符合预期 print(x2(('compute',))) # 输出9,符合预期 x3 = x1(('add', x2)) print(x3(('compute',))) # 输出15,和x4等价 x4 = some_func([3,5,7]) print(x4(('compute',))) # 输出15,完美匹配
当你调用x1(('add', x2))时,x1内部的func会触发x2(('get_list',)),x2作为some_func生成的闭包,会乖乖返回自己的[2,3,4]。之后我们把两个列表对应元素相加,再用some_func包装成新的HOF返回,这样x3就和x4完全等价了。
思路二:给闭包直接绑定属性
如果你觉得加命令有点麻烦,也可以直接给返回的闭包绑定一个lst属性,这样获取起来更直接:
def some_func(lst): def func(args): if args[0] == 'compute': return sum(lst) elif args[0] == 'add': another_hof = args[1] # 直接访问另一个HOF的lst属性 another_lst = another_hof.lst new_lst = [a + b for a, b in zip(lst, another_lst)] return some_func(new_lst) # 给闭包绑定lst属性,同样返回副本避免外部修改 func.lst = lst.copy() return func
这种方式代码更简洁,但要注意如果外部直接修改了func.lst,会影响闭包的内部状态,所以用副本会更安全。
内容的提问来源于stack exchange,提问作者Marcus.Aurelianus
相关产品推荐
相关产品推荐

