map with lambda vs map with function - 如何将多个变量传递给函数?
map with lambda vs map with function - how to pass more than one variable to function?
我想了解如何在 python 中使用 map
,google 搜索将我带到了 http://www.bogotobogo.com/python/python_fncs_map_filter_reduce.php,我发现这很有帮助。
该页面上的一个代码使用 for 循环并以一种有趣的方式将 map
放入该 for 循环中,并且 map
函数中使用的列表实际上采用了 2职能。这是代码:
def square(x):
return (x**2)
def cube(x):
return (x**3)
funcs = [square, cube]
for r in range(5):
value = map(lambda x: x(r), funcs)
print value
输出:
[0, 0]
[1, 1]
[4, 8]
[9, 27]
[16, 64]
因此,在该教程的这一点上,我认为 "well if you can write that code with a function on the fly (lambda), then it could be written using a standard function using def
"。所以我将代码更改为:
def square(x):
return (x**2)
def cube(x):
return (x**3)
def test(x):
return x(r)
funcs = [square, cube]
for r in range(5):
value = map(test, funcs)
print value
我得到了与第一段代码相同的输出,但令我困扰的是变量 r
是从全局命名空间中获取的,并且代码不是紧密的函数式编程。这就是我被绊倒的地方。这是我的代码:
def square(x):
return (x**2)
def cube(x):
return (x**3)
def power(x):
return x(r)
def main():
funcs = [square, cube]
for r in range(5):
value = map(power, funcs)
print value
if __name__ == "__main__":
main()
我试过这段代码,但问题在于传入函数 def power(x)
。我已经尝试了多种方法来尝试传递给这个函数,但是 lambda 能够自动将 x
变量分配给列表 funcs
.
的每次迭代
有没有办法通过使用标准的 def
函数来做到这一点,或者这是不可能的,只能使用 lambda 吗? 因为我正在学习 python 这是我的第一语言,我想了解这里发生了什么。
您可以将 power()
函数嵌套在 main()
函数中:
def main():
def power(x):
return x(r)
funcs = [square, cube]
for r in range(5):
value = map(power, funcs)
print value
因此 r
现在再次从周围范围获取,但不是全局范围。相反,它是一个 closure 变量。
但是,使用 lambda
只是另一种从周围范围注入 r
并将其传递到 power()
函数的方法:
def power(r, x):
return x(r)
def main():
funcs = [square, cube]
for r in range(5):
value = map(lambda x: power(r, x), funcs)
print value
这里r
还是非本地的,取自父作用域!
您可以使用 r
作为第二个参数的默认值来创建 lambda:
def power(r, x):
return x(r)
def main():
funcs = [square, cube]
for r in range(5):
value = map(lambda x, r=r: power(r, x), funcs)
print value
现在 r
改为作为默认值传入,因此它被视为本地。但就您的 map()
而言,这实际上并没有什么不同。
为什么不简单地将函数作为参数的一部分传递给 power()
,并使用 itertools.product
创建所需的 (value, func)
组合?
from itertools import product
# ...
def power((value, func)):
return func(value)
for r in range(5):
values = map(power, product([r], funcs))
print values
或者,如果您不希望/要求按函数对结果进行分组,而是想要一个平面列表,您可以简单地执行以下操作:
values = map(power, product(range(5), funcs))
print values
注意:签名 power((value, func))
定义 power()
以接受自动解压缩为 value
和 func
.
的单个二元组参数
相当于
def power(arg):
value, func = arg
柯里化是另一种选择。因为两个参数的函数与一个参数的函数相同 returns 另一个函数接受剩余参数,你可以这样写:
def square(x):
return (x**2)
def cube(x):
return (x**3)
def power(r):
return lambda(x): x(r) # This is where we construct our curried function
def main():
funcs = [square, cube]
for y in range(5):
value = map(power(y), funcs) # Here, we apply the first function
# to get at the second function (which
# was constructed with the lambda above).
print value
if __name__ == "__main__":
main()
为了使关系更明确一点,(a, b) -> c
类型的函数(一个接受类型 a
参数和 b
类型参数和 returns c
) 类型的值等同于 a -> (b -> c)
.
类型的函数
关于等价的额外内容
如果您想更深入地了解这种等价背后的数学原理,您可以使用一些代数来了解这种关系。将这些类型视为代数数据类型,我们可以将任何函数 a -> b
转换为 ba 并将任何对 (a, b)
转换为 a * b。由于这种联系,有时函数类型被称为 "exponentials" 而对类型被称为 "product types"。从这里,我们可以看出
c(a * b) = (cb)a
等等,
(a, b) -> c ~= a -> (b -> c)
我想了解如何在 python 中使用 map
,google 搜索将我带到了 http://www.bogotobogo.com/python/python_fncs_map_filter_reduce.php,我发现这很有帮助。
该页面上的一个代码使用 for 循环并以一种有趣的方式将 map
放入该 for 循环中,并且 map
函数中使用的列表实际上采用了 2职能。这是代码:
def square(x):
return (x**2)
def cube(x):
return (x**3)
funcs = [square, cube]
for r in range(5):
value = map(lambda x: x(r), funcs)
print value
输出:
[0, 0]
[1, 1]
[4, 8]
[9, 27]
[16, 64]
因此,在该教程的这一点上,我认为 "well if you can write that code with a function on the fly (lambda), then it could be written using a standard function using def
"。所以我将代码更改为:
def square(x):
return (x**2)
def cube(x):
return (x**3)
def test(x):
return x(r)
funcs = [square, cube]
for r in range(5):
value = map(test, funcs)
print value
我得到了与第一段代码相同的输出,但令我困扰的是变量 r
是从全局命名空间中获取的,并且代码不是紧密的函数式编程。这就是我被绊倒的地方。这是我的代码:
def square(x):
return (x**2)
def cube(x):
return (x**3)
def power(x):
return x(r)
def main():
funcs = [square, cube]
for r in range(5):
value = map(power, funcs)
print value
if __name__ == "__main__":
main()
我试过这段代码,但问题在于传入函数 def power(x)
。我已经尝试了多种方法来尝试传递给这个函数,但是 lambda 能够自动将 x
变量分配给列表 funcs
.
有没有办法通过使用标准的 def
函数来做到这一点,或者这是不可能的,只能使用 lambda 吗? 因为我正在学习 python 这是我的第一语言,我想了解这里发生了什么。
您可以将 power()
函数嵌套在 main()
函数中:
def main():
def power(x):
return x(r)
funcs = [square, cube]
for r in range(5):
value = map(power, funcs)
print value
因此 r
现在再次从周围范围获取,但不是全局范围。相反,它是一个 closure 变量。
但是,使用 lambda
只是另一种从周围范围注入 r
并将其传递到 power()
函数的方法:
def power(r, x):
return x(r)
def main():
funcs = [square, cube]
for r in range(5):
value = map(lambda x: power(r, x), funcs)
print value
这里r
还是非本地的,取自父作用域!
您可以使用 r
作为第二个参数的默认值来创建 lambda:
def power(r, x):
return x(r)
def main():
funcs = [square, cube]
for r in range(5):
value = map(lambda x, r=r: power(r, x), funcs)
print value
现在 r
改为作为默认值传入,因此它被视为本地。但就您的 map()
而言,这实际上并没有什么不同。
为什么不简单地将函数作为参数的一部分传递给 power()
,并使用 itertools.product
创建所需的 (value, func)
组合?
from itertools import product
# ...
def power((value, func)):
return func(value)
for r in range(5):
values = map(power, product([r], funcs))
print values
或者,如果您不希望/要求按函数对结果进行分组,而是想要一个平面列表,您可以简单地执行以下操作:
values = map(power, product(range(5), funcs))
print values
注意:签名 power((value, func))
定义 power()
以接受自动解压缩为 value
和 func
.
相当于
def power(arg):
value, func = arg
柯里化是另一种选择。因为两个参数的函数与一个参数的函数相同 returns 另一个函数接受剩余参数,你可以这样写:
def square(x):
return (x**2)
def cube(x):
return (x**3)
def power(r):
return lambda(x): x(r) # This is where we construct our curried function
def main():
funcs = [square, cube]
for y in range(5):
value = map(power(y), funcs) # Here, we apply the first function
# to get at the second function (which
# was constructed with the lambda above).
print value
if __name__ == "__main__":
main()
为了使关系更明确一点,(a, b) -> c
类型的函数(一个接受类型 a
参数和 b
类型参数和 returns c
) 类型的值等同于 a -> (b -> c)
.
关于等价的额外内容
如果您想更深入地了解这种等价背后的数学原理,您可以使用一些代数来了解这种关系。将这些类型视为代数数据类型,我们可以将任何函数 a -> b
转换为 ba 并将任何对 (a, b)
转换为 a * b。由于这种联系,有时函数类型被称为 "exponentials" 而对类型被称为 "product types"。从这里,我们可以看出
c(a * b) = (cb)a
等等,
(a, b) -> c ~= a -> (b -> c)