当前位置: 首页 > 面试题库 >

Python:为什么functools.partial是必需的?

邹俊拔
2023-03-14
问题内容

部分应用程序很酷。functools.partiallambdas无法提供哪些功能?

>>> sum = lambda x, y : x + y
>>> sum(1, 2)
3
>>> incr = lambda y : sum(1, y)
>>> incr(2)
3
>>> def sum2(x, y):
    return x + y

>>> incr2 = functools.partial(sum2, 1)
>>> incr2(4)
5

functools更有效还是更易读?


问题答案:

functools.partiallambdas无法提供哪些功能?

在额外功能方面并没有太多(但是,请参阅稍后)–可读性在旁观者的眼中。
大多数熟悉函数式编程语言的人(尤其是Lisp / Scheme系列的人)看起来都lambda很好–我说“大多数”,绝对不是全部,因为Guido和我肯定是“熟悉”的人(等) 却被认为是lambdaPython中的一个令人眼花eyes乱的异常……
他为曾经接受过Python而打算将其从Python 3中删除(作为“ Python的小故障”之一)感到re悔。
我对此表示完全支持。(我喜欢lambda Scheme ...但它在Python中有其局限性,而它只是奇怪的方式而没有’ 使用其他语言,让我的皮肤变得爬行)。


但是,对于成群的lambda恋人而言并非如此-他们在Python历史上曾发生过与叛逆最接近的事情之一,直到Guido回溯并决定离开lambda
一些可能的添加functools(以使函数返回常量,标识,等)没有发生(避免显式地复制的更多lambda功能),尽管partial当然仍然存在(这不是完全复制,也不是令人讨厌的)。

请记住,lambda的身体仅限于表达,因此有其局限性。例如…:

>>> import functools
>>> f = functools.partial(int, base=2)
>>> f.args
()
>>> f.func
<type 'int'>
>>> f.keywords
{'base': 2}
>>> 

functools.partial返回的函数装饰有用于自省的属性-它包装的函数,以及其中固定的位置和命名参数。此外,可以立即改写命名的参数(在某种意义上,“固定”在某种意义上是默认设置):

>>> f('23', base=10)
23

因此,如你所见,它绝对不像lambda s: int(s, base=2)!-)那样简单

是的,你可以扭曲你的lambda来为你提供一些帮助-例如,对于关键字覆盖,

>>> f = lambda s, **k: int(s, **dict({'base': 2}, **k))

但我非常希望,即使是最热心的- lambda情人,也不要把这种恐惧比partial电话更容易理解!-)。由于Python的“主体是单个表达式”的局限性,lambda加上“属性设置”部分的困难(加上赋值永远不能成为Python表达式的一部分的事实)……你最终“在表达式中伪造了赋值”通过将列表理解扩展到远远超出其设计限制…:

>>> f = [f for f in (lambda f: int(s, base=2),)
           if setattr(f, 'keywords', {'base': 2}) is None][0]

现在结合命名参数覆盖性,再加上三个属性的设置,到一个单一的表达,并告诉我是多么可读那将是…!



 类似资料:
  • 和(表单验证)有什么区别?

  • 问题内容: 我从节点启动这是来自node.js README.md 先决条件(仅Unix): 想知道为什么node.js需要Python?它是否在其API下使用Python 问题答案: Node.js使用GYP构建-GYP —用Python编写的跨平台构建工具。Python中还实现了其他一些构建步骤。因此,从源代码构建节点需要Python。 但是您还需要Python来构建本机插件。

  • 问题内容: 特别是在Python中,如何在线程之间共享变量? 尽管我以前从未使用过,但从未真正理解或看到过如何共享变量的示例。它们是在主线程和子线程之间共享还是仅在子线程之间共享?我何时需要使用线程本地存储来避免这种共享? 我已经看到许多有关通过使用锁在线程之间同步对共享数据的访问的警告,但是我还没有看到这个问题的一个很好的例子。 提前致谢! 问题答案: 在Python中,所有内容都是共享的,但函

  • 问题内容: 考虑以下功能: 如果使用,则会得到以下计时: 现在,如果我使用而不是使用默认值: 为什么版本使用速度这么慢? 问题答案: 使用要求向工作进程发送有关要运行的功能的信息,而不仅仅是发送要传递的参数。通过在主流程中酸洗该信息,将其发送到工作流程,然后在此处将其取消酸洗,来传输该信息。 这导致了主要问题: 用默认参数腌制一个函数很便宜 ; 它只会腌制函数的名称(加上让Python知道它是一个

  • 请考虑以下功能: 如果我使用,我将获得以下定时: 现在,如果我使用而不是使用默认值: 为什么使用的版本要慢得多?

  • //[input type=“text”placeholder=“First Name”class=“form control”ng model=“FirstName”必填项] 下面是我的代码 elemntvalue=驱动程序。FindElement(By.XPath(//input[@placeholder='First Name']); 字符串名称required=elemntvalue。Ge