经常会看到有些代码中使用 functools.partial 来包装一个函数,之前没有太了解它的用法,只是按照别人的代码来写,今天仔细看了一下它的用法,基本的用法还是很简单的。

    functools.partial 的基本使用

    如何使用python 中的functools.partial用法! - 湘九 - 博客园 - 图1

    如何使用python 中的functools.partial用法! - 湘九 - 博客园 - 图2

    如何使用python 中的functools.partial用法! - 湘九 - 博客园 - 图3

    这个 4 是怎么来的?

    首先我们通过 add = functools.partial(addOne, 3) 定义一个新的变量 add , 它相当于 addOne(3) 的结果,此时的变量 add 是一个函数,当执行 add() 时,其实执行的是 addOne(3),结果也是 addOne(3) 的结果,这个 add() 函数返回的 4 也就是 addOne(3) 的结果,这个 4 就是这么来的。

    复杂一点的例子

    上面的 addOne 函数只有一个参数,我们多加一个参,让其返回两个参数的和

    如何使用python 中的functools.partial用法! - 湘九 - 博客园 - 图4

    print(sum(5, 6)) 这个输出 11 没有什么好说的, print(sumY(6)) 这个也输出 11,这个是怎么来的?

    当使用 sumY = functools.partial(sum, 5) 定义 sumY 变量时,其实是将 sum(x, y) 函数中的 x 值固定为 5 ,所以当调用 sumY(6) 的时候,其实是返回的是 sum(5, 6) 的值,也就是说,sumY 函数不用再传入 x 参数,而是固定为 5。

    kwargs 类型的参数

    当一个函数的参数为 k,v 的形式该怎么定义 partial 函数呢?

    如何使用python 中的functools.partial用法! - 湘九 - 博客园 - 图5

    可以在定义 partial 函数时,将对应的参数定义好,如果上面的 age=18, 则新生成的函数相当于 show(name=”yyx”, age=18)

    注意,这里如果使用 partial 定义了函数的参数,那么再调用的时候,就不能再传相应的参数了,如上面的已经在 showP 函数中定义了 age=18 了,在调用 showP() 时,只能传 name 参数,即只能使用 showP(“yangyanxing”), 不能再传入一个 age 参数, showP(“yangyanxing”, 28), 如果再加上 age 参数,则会报错。

    functools.partial 有什么用?

    从上面的使用来看,似乎使用 functools.partial 也没有什么用,只是固定了某个参数的值,使原来的调用少传一个参数罢了,但是我们可能有某种函数场景,它的参数是也一个函数,比如回调函数。

    如何使用python 中的functools.partial用法! - 湘九 - 博客园 - 图6

    我们定义一个 test 函数,它会先执行了自己的一些逻辑以后,会调用传入的 callback 函数,如果我们想将 show 函数当成 callback 参数传到 test 函数中,注意这里的 callback 函数是没有参数的,那么我们怎么将 name 和 age 参数传到 show 函数中呢?

    如何使用python 中的functools.partial用法! - 湘九 - 博客园 - 图7

    这种可以解决回调函数是 show 的情况,但是如果回调函数是别的呢?fly(h), eat(), run(date), 等等, 这种函数的参数你无法预知,你也不知道调用方会怎么调用,所以这时就可以使用 functools.partial 来生成一个新的函数

    如何使用python 中的functools.partial用法! - 湘九 - 博客园 - 图8

    如何使用python 中的functools.partial用法! - 湘九 - 博客园 - 图9

    此文转载文,著作权归作者所有,如有侵权联系小编删除!

    原文地址:https://www.tuicool.com/articles/ymUjuqY
    https://www.cnblogs.com/wxys/p/13756552.html