使用 lambda 和列表理解时的惰性评估
Lazy evaluation when use lambda and list comprehension
这是示例 python 代码。
f_list = [lambda x : x ** i for i in range(5)]
[f_list[j](10) for j in range(5)]
我认为输出是:
[1, 10, 100, 1000, 10000]
但我得到的是这个:
[10000, 10000, 10000, 10000, 10000]
我想知道当我 运行 这段代码时到底发生了什么。与懒惰评估有什么联系。
这里有一个很好的例子来说明为什么柯里化很好,你可以像这样柯里化你的函数来实现你的目标:
f_list = [(lambda y : lambda x : x ** y)(i) for i in range(5)]
r = [f_list[j](10) for j in range(5)]
结果将是:
=> [1, 10, 100, 1000, 10000]
柯里化:
理解 curry 对我来说是什么的简单方法是下一个,而不是给一个函数它需要的所有参数,你创建一个函数,它总是接收一个参数,returns另一个再次接受一个参数的函数,在最后一个函数中,您使用所有参数进行所需的转换
一个小例子:
sum_curry = lambda x : lambda y : x + y
这里你有一个简单的求和函数,但假设你想要函数 plus_one,好的,你可以像这样重用上面的函数:
plus_one = sum_curry(1)
这是示例 python 代码。
f_list = [lambda x : x ** i for i in range(5)]
[f_list[j](10) for j in range(5)]
我认为输出是:
[1, 10, 100, 1000, 10000]
但我得到的是这个:
[10000, 10000, 10000, 10000, 10000]
我想知道当我 运行 这段代码时到底发生了什么。与懒惰评估有什么联系。
这里有一个很好的例子来说明为什么柯里化很好,你可以像这样柯里化你的函数来实现你的目标:
f_list = [(lambda y : lambda x : x ** y)(i) for i in range(5)]
r = [f_list[j](10) for j in range(5)]
结果将是:
=> [1, 10, 100, 1000, 10000]
柯里化:
理解 curry 对我来说是什么的简单方法是下一个,而不是给一个函数它需要的所有参数,你创建一个函数,它总是接收一个参数,returns另一个再次接受一个参数的函数,在最后一个函数中,您使用所有参数进行所需的转换
一个小例子:
sum_curry = lambda x : lambda y : x + y
这里你有一个简单的求和函数,但假设你想要函数 plus_one,好的,你可以像这样重用上面的函数:
plus_one = sum_curry(1)