首页 > 解决方案 > 用 partial 和 divmod 分割的_by_5

问题描述

当尝试写一个divided_by_fivewithdivmod

In [2]: from functools import partial    

In [3]: divided_by_five = partial(divmod, divisor=5)                               

In [4]: divided_by_five(10)              
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-808446a06fa5> in <module>
----> 1 divided_by_five(10)

TypeError: divmod() takes no keyword arguments

我有点困惑,divmod即使它微不足道,也会出现在关键字列表中。更令人困惑的是,它没有除数和除数的关键字参数,这可能导致它几乎不那么微不足道(镜像到pow(base, exp).

是否有可能获得一个divided_by_fivedivmod“部分”

标签: python-3.x

解决方案


divmod不接受任何关键字参数,更不用说divisor参数了,因此你得到的错误。partial传递divisor=5divmod但它不知道如何处理它。

一般来说,partial可以使用位置参数,但前提是您需要设置第一个参数,即使那样它也容易出错。

在这种情况下,您想设置第二个,所以partial不会有帮助,因为它会给出错误的结果:

from functools import partial

divided_by_five = partial(divmod, 5)

print(divided_by_five(10))  # prints (0, 5) which is not what OP meant

它正在计算5 // 10, 5 % 10而不是10 //5, 10 % 5.

如果您坚持使用,partial则需要实施新的“divmod”:

from functools import partial

def divmod2(a, b):
    return a // b, a % b

divided_by_five = partial(divmod2, b=5)

print(divided_by_five(10))

输出

(2, 0)

此时你不妨divmod用 lambda 包装内置:

divided_by_five = lambda a: divmod(a, 5)

print(divided_by_five(10))
# (2, 0)

尽管命名的 lambdas 不受欢迎,但使用它似乎有点过头了def


推荐阅读