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() 函数吗?的主要内容,如果未能解决你的问题,请参考以下文章