【问题标题】:Python and functional programming: is there an apply() function?Python 和函数式编程:有 apply() 函数吗?
【发布时间】: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) 之后就没有什么用处了..
  • 如果你打算只使用一次 lambda 函数,为什么还要使用它? re.search(r"(\w+)_(\d+)", input_string).groups() 有什么问题?

标签: python functional-programming


【解决方案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)。

        【讨论】: