11

python 中的functools.partial用法

 3 years ago
source link: https://www.yangyanxing.com/article/useage-partial.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

functools.partial 的基本使用

假设我们有一个函数, 返回传入参数加1的结果

1
2
def addOne(x):
return x+1

正常调用这个函数很简单

1
2
f = addOne(3)
print(f)

会输出4, 这个很简单。

如果我们再根据addOne 生成一个新的函数

1
2
3
4
5
6
7
def addOne(x):
return x+1

add = functools.partial(addOne, 3)

# 调用add函数
print(add())

这时也会输出 4。

这个4是怎么来的?

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

复杂一点的例子

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

1
2
3
4
5
6
7
8
def sum(x, y):
return x+y

print(sum(5, 6))

sumY = functools.partial(sum, 5)

print(sumY(6))

输出结果:

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函数呢?

1
2
3
4
5
6
7
def show(name="yyx", age=100):
return (name, age)


showP = functools.partial(show, age=18)

print(showP("yangyanxing"))

可以在定义 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 也没有什么用,只是固定了某个参数的值,使原来的调用少传一个参数罢了,但是我们可能有某种函数场景,它的参数是也一个函数,比如回调函数。

1
2
3
4
5
6
7
def show(name, age):
print("my name is {} and age is {} ".format(name, age))


def test(callback):
print("do some opt....")
callback()

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

我们可以改写test()函数

1
2
3
def test(callback, name, age):
print("do some opt....")
callback(name, age)

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

1
2
3
4
5
6
7
8
9
10
11
12
def show(name, age):
print("my name is {} and age is {} ".format(name, age))


showP = functools.partial(show, "yangyanxing", 19)

def test(callback):
print("do some opt....")
callback()


test(showP)

这样就可以在调用方自己来控制了函数的参数了。

上面的输出结果为

1
2
do some opt....
my name is yangyanxing and age is 19



About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK