gpt4 book ai didi

python - map with lambda vs map with function - 如何将多个变量传递给函数?

转载 作者:太空狗 更新时间:2023-10-30 02:10:32 26 4
gpt4 key购买 nike

我想了解如何在 python 中使用 map,然后谷歌搜索将我带到了 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]

因此,在该教程的这一点上,我想“好吧,如果您可以使用一个函数 (lambda) 编写代码,那么它可以使用标准函数使用 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 现在再次从周围范围中获取,但不是全局的。相反,它是一个闭包变量。

但是,使用 lambda 只是另一种从周围作用域注入(inject) 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() 而言,这实际上并没有什么不同。

关于python - map with lambda vs map with function - 如何将多个变量传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29318557/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com