假设您有一个函数f:integers -> integers
,应该能够解除此函数以对整数集进行操作。
即。 f:sets of integers -> sets of integers
,f({a,b,...}) = {f(a),f(b),...}
如何在python中简洁地执行此操作?也就是说,不涉及iterables(循环),可能更本地和顺序无关。
我希望f({a,b,...})
是语法,但事实并非如此。也许像act(f,{a,b,...})
?
答案 0 :(得分:0)
Python 2.7.10
你描述的是映射;它确实涉及背景中的循环,但它实现了你的简洁。这是一个例子。
l = [1,2,3]
#f returns n^2
def f(n):
return n*n
l = map(f, l) #[1,4,9]
map
将函数f
应用于l
的每个元素。
map
也适用于集合;但是,map返回一个值列表,例如f({x1,x2,x3}) = [f(x1),f(x2),f(x3)]
,以任意顺序。您可以将返回的列表转换为集合,方法是将其包装为set
。
Python 3.6
在Python 3.6中,map
返回一个地图对象,您需要将其转换为所需的类型。此示例显示转换为列表的地图对象。
l = [1,2,3]
def f(n):
return n*n
l = list(map(f, l)) #[1,4,9]
或者,您可以使用lambda函数进一步减少代码量,使其更简洁。
l = [1,2,3]
l = map(lambda x:x*x, l)
lambda表达式具有功能f
,但仅在那里使用,之后不存在。
答案 1 :(得分:0)
例如,要对集合f
元素应用c
,您可以使用
map(f, c)
请注意,应用程序在Python 3中是懒惰的,并且在Python 2.7中非常渴望。或者,您也可以使用懒惰理解:
g(f(x) for x in c)
答案 2 :(得分:0)
您也可以传递多个参数,如下所示:
def square(*args) :
l = []
for i in args:
l.append(i**2)
return l
它会像:
一样回归>>>> square(1,2,3,4)
>>>> [1,2,9,16]
>>>> square(1)
>>>> [1]
>>>> square(1,6)
>>>> [1,36]
答案 3 :(得分:0)
在Python中,currying不是本机功能,但您可以使用functools.partial
来模拟它。例如,您可以使用partial
将函数f: A -> B
提升为函数f': [A] -> [B]
。
from functools import partial
def f(...):
...
# lift f
f_lifted = partial(map, f)