gpt4 book ai didi

python - 在 Python 中,部分函数应用(柯里化(Currying))与显式函数定义

转载 作者:太空狗 更新时间:2023-10-29 16:56:40 24 4
gpt4 key购买 nike

在 Python 中,它是否被认为是更好的风格:

  • 根据更通用的(可能是内部使用的)功能明确定义有用的功能;或者,
  • 使用部分函数应用来明确描述函数柯里化(Currying)?

我将通过一个人为的例子来解释我的问题。

假设有人编写了一个函数 _sort_by_scoring,它接受两个参数:一个评分函数和一个项目列表。它返回原始列表的副本,该副本根据每个项目在原始列表中的位置按分数排序。还提供了两个示例评分函数。

def _sort_by_score(scoring, items_list):
unsorted_scored_list = [(scoring(len(items_list), item_position), item) for item_position, item in enumerate(items_list)]
sorted_list = [item for score, item in sorted(unsorted_scored_list)]
return sorted_list

def _identity_scoring(items_list_size, item_position):
return item_position

def _reversed_scoring(items_list_size, item_position):
return items_list_size - item_position

函数 _sort_by_score 永远不会被直接调用;相反,它由其他单参数函数调用,这些函数将评分函数及其单独的参数(项目列表)传递给 _sort_by_scoring 并返回结果。

# Explicit function definition style
def identity_ordering(items_list):
return _sort_by_score(_identity_scoring, items_list)

def reversed_ordering(items_list):
return _sort_by_score(_reversed_scoring, items_list)

显然,这种意图用函数柯里化(Currying)更好地表达。

# Curried function definition style
import functools
identity_ordering = functools.partial(_sort_by_score, _identity_scoring)
reversed_ordering = functools.partial(_sort_by_score, _reversed_scoring)

用法(无论哪种情况):

>>> foo = [1, 2, 3, 4, 5]
>>> identity_ordering(foo)
[1, 2, 3, 4, 5]
>>> reversed_ordering(foo)
[5, 4, 3, 2, 1]

显式函数定义风格的明显优势:

  1. 可以在更通用的函数之前定义有用的函数,而不会引发 NameErrors;
  2. 可以在函数定义体中定义辅助函数(例如评分函数);
  3. 可能更容易调试;
  4. 由于“显式优于隐式”,代码看起来不错。

柯里化(Currying)函数定义风格的明显优点:

  1. 以地道的方式表达函数式编程的意图;
  2. 代码简洁,看起来不错。

为了定义“有用”的功能,两种风格中的哪一种是首选?还有其他更惯用/Pythonic/等风格吗?

最佳答案

如果您想将柯里化(Currying)函数作为公共(public)接口(interface)的一部分,请使用显式函数定义。这具有以下额外优势:

  1. 将文档字符串分配给显式函数定义会更容易。对于 partial() 函数,您必须分配给 __doc__ 属性,这有点难看。

  2. 浏览模块源代码时,真正的函数定义更容易浏览。

我会以与 lambda 表达式类似的方式使用 functools.partial(),即用于本地需要的一次性函数。

在您的特定示例中,我可能两者都不使用,删除前导下划线并调用

sort_by_score(identity_scoring, foo)

这对我来说似乎是最明确的。

关于python - 在 Python 中,部分函数应用(柯里化(Currying))与显式函数定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5091528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com