Python咖喱函数具有可变数量的参数

问题描述

给出n,我想创建一个函数,该函数接受n元素并将它们作为列表返回。一种方法

def g(n):
  def f(*l):
    assert len(l) == n
    return l
  return f

我的问题:我希望返回函数curried

结果将像这样工作,但对于所有n

def g(n):
    if n == 1: return lambda i: [i]
    if n == 2: return lambda i1: lambda i2: [i1,i2]
    if n == 3: return lambda i1: lambda i2: lambda i3: [i1,i2,i3]
    ...

我的第一种方法是这样的:

def g(n):
    if n == 1: return lambda i: [i]
    return lambda i: g(n-1) + [i]

这不起作用:g(n-1)返回一个函数,因此无法将其添加到列表中。有解决办法吗?

似乎我需要以某种方式将输入“传递”到g(n-1),获得g(n-1)输出,并附加到[i],但我不知道该如何“撬开” g(n-1)进行附加操作,同时保持正确的输入类型。

我尝试在python中使用Google谷歌搜索,但仅得到一些基本示例。我是函数式编程的新手,如果缺少我的术语,对不起。

解决方法

我想到了这个

def f(n,prev=None):
    if prev is None:
        prev = []

    if n == 1:
        return lambda x: prev + [x]
    else:
        return lambda x: f(n-1,prev=prev + [x])

# f(3) creates list with length 3
# other calls append one element to the list,until length 3 is reached
assert f(3)(1)(2)(3) == [1,2,3]