Python 和函数式编程:有 apply() 函数吗?

Posted

技术标签:

【中文标题】Python 和函数式编程:有 apply() 函数吗?【英文标题】:Python and functional programming: is there an apply() function? 【发布时间】:2015-11-21 19:48:33 【问题描述】:

Scala 有 apply() 函数。

我是 Python 新手,我想知道我应该如何编写以下单行代码:

(part_a, part_b) = (lambda x: re.search(r"(\w+)_(\d+)", x).groups())(input_string)

这样的话我会感觉更好:

(part_a, part_b) = input_string.apply(lambda x: re.search(r"(\w+)_(\d+)", x).groups())

从 FF 的角度来看,我错了吗? Python中有这样的构造吗?

编辑:我知道选不好的 sn-p。

【问题讨论】:

不,没有,但编写自己的代码很容易,part_a, part_b = apply(lambda ...: ..., input_string) 可以工作。 这将要求所有对象都有一个 apply 方法,而他们没有。所以我担心你不得不忍受它。请注意,如果您使用更长的方式来编写相同的内容,您会感觉更好。 Python 从一开始也有一个apply 函数,但是自从apply(fn, args, kwargs) == fn(*args, **kwargs) 之后就没有什么用处了.. 可能是functools.partial()? 如果你打算只使用一次 lambda 函数,为什么还要使用它? re.search(r"(\w+)_(\d+)", input_string).groups() 有什么问题? 【参考方案1】:

写 Haskell 的时候写 Haskell。写 Python 时只写 Python:

part_a, part_b = re.search(r"(\w+)_(\d+)", input_string).groups()

【讨论】:

【参考方案2】:

如果您使用的是没有apply 的 Python,您始终可以自己编写...

def apply(fn, args=(), kwargs=None):
    if kwargs is None:
        kwargs = 
    return fn(*args, **kwargs)

仅仅因为你可以,并不意味着你应该......

【讨论】:

【参考方案3】:

Python 没有这样的结构;重点是什么? lambda x: ... 是一个函数,因此它应该像普通函数一样使用,即,就像你的第一个 sn-p 中的 (lambda x: ...)(input_string) 一样。

但是,就您而言,我认为您甚至没有理由为 lambda 烦恼;做吧:

(part_a, part_b) = re.search(r"(\w+)_(\d+)", input_string).groups()

【讨论】:

【参考方案4】:

如果您担心重用,您可以编译正则表达式:

rx = re.compile(r"(\w+)_(\d+)")
a, b = rx.search(input_string).groups()

【讨论】:

我倾向于将其用于文档而不是性能(假设我可以给rx 一个信息性名称)。【参考方案5】:

Python 曾经有一个 apply 函数 (docs),但它已在 python 3 中被删除,因为它是不必要的,并且违反了 python 的原则,即应该只有一种方法来做特定的事情。

比如说,我们有一个名为“func”的函数,我们可以很容易地调用 func(*args) 而不是 apply(func, args)。

【讨论】:

以上是关于Python 和函数式编程:有 apply() 函数吗?的主要内容,如果未能解决你的问题,请参考以下文章

python之函数式编程与函数闭包

Python函数式编程

Swift函数式编程十三(函子适用函子单子)

Swift函数式编程十三(函子适用函子单子)

Swift函数式编程十三(函子适用函子单子)

高阶函数式编程三:在 Kotlin 中“实现”应用函子(Applicative)