执行地图返回列表而不是列表

时间:2014-12-07 23:56:50

标签: python functional-programming

我正在尝试实现我自己的Python版本的地图功能。我称之为my_map。约束是使用函数式编程(如果允许语句,则不使用循环)。

以下是实施:

# f is the function it takes in, and ls is the list to apply this function over.
def my_map(f, ls):
    if len(ls) != 1:
        ret = my_map(f, ls[1:])
        return [f(ls[0])] + [ret]
    else:
        return f(ls[0])

但是当我使用以下输入运行时:

def f(x):
    return x * x

my_map(f, [1,2,3,4])返回[1, [4, [9, 16]]]

map(f, [1,2,3,4])返回[1, 4, 9, 16],这就是我所期望的。

关于如何获得预期结果的任何想法?

1 个答案:

答案 0 :(得分:3)

return [f(ls[0])] + [ret]

应该是

return [f(ls[0])] + ret

。您正在从ret创建一个新的单元素列表,但只有第一个列表应该是单元素列表。

此外,发电机可能效率更高。你正在制作很多部分名单。

def my_map(f, ls):
    it = iter(ls)

    def go():
        yield f(next(it))
        yield from go()

    return list(go())