在python中提升函数

时间:2017-12-24 21:39:14

标签: python function set python-3.6

假设您有一个函数f:integers -> integers,应该能够解除此函数以对整数集进行操作。

即。 f:sets of integers -> sets of integersf({a,b,...}) = {f(a),f(b),...}

如何在python中简洁地执行此操作?也就是说,不涉及iterables(循环),可能更本地和顺序无关。

我希望f({a,b,...})是语法,但事实并非如此。也许像act(f,{a,b,...})

4 个答案:

答案 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)

您想要的工具是mapitertools

例如,要对集合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)