出处  https://blog.csdn.net/Appleyk/article/details/77609114

一、什么是偏函数?

(1)在Python的functools模块众多的功能中,其中有一个就是偏函数,我们称之为 partial function

模块的概念我们下一篇在细讲。

(2)我们都听过偏将军吧,在三国时代的官制中,系将军的辅佐,与裨将军两者都为杂号将军;今天我们要讲的偏函数,其实是函数的辅佐,什么意思呢,我们借助Python的help帮助函数,看一下:

这里我们主要说下红色圈的意思:

partial 一共有三个部分:

(1)第一部分也就是第一个参数,是一个函数,这个函数可以是你定义的,也可以是Python内置函数

(2)第二部分是一个可变参数,*args,比如内置函数max的参数就是一个可变参数,max(1,2,3,4,5)=5

(3)第三部分是一个关键字参数,比如内置函数int的第二个参数就是命名关键字参数,默认base=10,表示int转换时默认是10进制的:

partial函数的作用就是:将所作用的函数作为partial()函数的第一个参数,原函数的各个参数依次作为partial()函数的后续参数,原函数有关键字参数的一定要带上关键字,没有的话,按原有参数顺序进行补充。

文字描述显得有些无力,我们下面就开始讲一下,偏函数是怎么用的

二、偏函数的使用

A、偏函数的第二个部分(可变参数),按原有函数的参数顺序进行补充,参数将作用在原函数上,最后偏函数返回一个新函数(类似于,装饰器decorator,对于函数进行二次包装,产生特殊效果;但又不同于装饰器,偏函数产生了一个新函数,而装饰器,可改变被装饰函数的函数入口地址也可以不影响原函数)

案例:我们定义一个sum函数,参数为*args可变,计算这些可变参数的和。

扩展:我们想要对sum函数求和后的结果,再加上10加上20甚至加更多,得到一个新的结果

实现:我们分别用decorator和partial来实现,对比一下二者的区别

(一)装饰器 decorator 实现

我们上一篇,刚刚学过decorator,所以这里,我们直接看demo,应该会觉得很容易上手和理解:

test.py

#/usr/bin/env Python3#-*- encoding:UTF-8 -*-

from functools importwrapsdef sum_add(*args1): #我们要给我们的装饰器decorator,带上参数

defdecorator(func):

@wraps(func)#加上这句,原函数func被decorator作用后,函数性质不变

def my_sum(*args2): #注意,参数要和原函数保持一致,真正实行扩展功能的是外层的装饰器

my_s =0for n inargs1:

my_s= my_s +n #这个是我们新加的求和结果

return func(*args2) + my_s #这个,我们在原求和函数的结果上再加上s,并返回这个值

return my_sum #返回my_sum函数,该函数扩展原函数的功能

return decorator #返回我们的装饰器

@sum_add(10,20) #启用装饰器 对sum函数进行功能扩展

def sum(*args):

s=0for n inargs:

s= s+nreturnsprint(sum(1,2,3,4,5))print(sum.__name__)

sum(1,2,3,4,5)返回的结果绝不是15,这样就失去了装饰器存在的意义,当然,这里,我们知道,sum最后返回的值应该是10+20+15 = 45,这样一来,我们的decorator就实现了我们想要的扩展功能,最后,发现,原函数sum的name属性,仍然是sum,说明,这种装饰扩展功能,不影响我们的原函数:

(二)偏函数

partial function 实现

这才是我们本篇的重点,准备好了,我们就开始:

我们先来看下普通函数,我们是怎么来实现

A:普通函数可变参数顺序执行

#/usr/bin/env Python3

#-*- encoding:UTF-8 -*-

def sum(*args):

s=0for n inargs:

s= s +nreturnsprint(sum(10,20)+sum(1,2,3,4,5))

我们如果想实现+10+20的效果,必须写两遍sum,这样写,显然是最易懂的,但是,却显得很邋遢不专业,我们看下结果:

B:普通函数可变参数加关键字参数组合

针对上面的A过程,我们改下代码,使我们的代码看起来稍显复杂,但是略显专业:

#/usr/bin/env Python3

#-*- encoding:UTF-8 -*-

def sum(*args,**others):

s=0for n inargs:

s= s +n

s1=0for k inothers:

s1= s1 + others[k] #我们还要算一下,关键字参数里蕴藏的求和结果,k是dict中的关键字key

return s+s1 #最终,我们实现扩展功能,顺序参数和关键字参数结果相加

D= {'value1':10,'value2':20}print(sum(1,2,3,4,5,**D))

代码看起来,是显得专业了,但是感觉冗余,没必要,复杂不是我们Python的风格,我们看下B的结果:

C:偏函数可变参数顺序填充一步到位

上面A和B我们都说过了,这两种方式都不好,显然,这么简单的事情,我们不必麻烦decorator了,那我们还有办法没?有,Python,给我们提供了偏函数,来吧,主角登场:

提示:两种使用partial功能方式

(1)import functools                        -->functools.partial(func,*args)

(2)from   functools import partial -->partial(func,*args)

我们这里选第二种,我们看下demo:

#/usr/bin/env Python3

#-*- encoding:UTF-8 -*-

from functools importpartialdef sum(*args):

s=0for n inargs:

s= s +nreturns

sum_add_10= partial(sum,10) #10 作用在sum第一个参数的位置

sum_add_10_20 = partial(sum,10,20) #10 20 分别作用在sum第一个和第二个参数的位置

print('A____________我们看下原函数sum的函数地址入口:')print(sum)print('B______我们看下partial函数返回函数的地址入口:')print(partial(sum,10))print(sum_add_10(1,2,3,4,5)) #--> 10 + 1 + 2 + 3 + 4 + 5 = 25

print(sum_add_10_20(1,2,3,4,5)) #--> 10 + 20 + 1 + 2 + 3 + 4 + 5 = 45

上面,可以看出,我们针对sum函数的求和结果,再加上10,或者加10加20,甚至加更多,都是可以通过偏函数来实现的,注意偏函数的第二部分,参数是可变的,是按顺序走的,因此,偏函数产生的新函数,sum_add_10 实际上等同于sum(10,*args):

通过几个例子,我们最终发现,还是偏函数比较方便,一行代码就搞定了,而且新定义的函数,可以根据函数名很容易知道,这个函数扩展的原函数是哪个,实现的效果是什么:

B、偏函数的第三个部分(关键字参数),按原有函数的关键字参数进行填补,参数将作用在原函数上,最后偏函数返回一个新函数

案例:我们定义一个mod求余函数,两个参数,一个是被除数,一个是除数,除数我们这里用命名关键字参数表示,默认值2

扩展:我们的除数不固定,可以是对2就行求余,也可以对3,对4,总之我们需要指定除数的值

返回结果: True 或 False

实现:原函数实现和partial函数实现

demo如下:

#/usr/bin/env Python3

#-*- encoding:UTF-8 -*-

importfunctoolsdef mod(m,*,key=2):return m % key ==0

mod_to_2= functools.partial(mod,key=2)print('A__3___使用原函数的默认关键字参数对2进行求余:')print(mod(3)) #对2进行求余-- 原函数 使用默认参数

print('B__3___使用偏函数对2进行求余:')print(mod_to_2(3)) #对2进行求余-- 新函数 --偏函数产生

mod_to_5 = functools.partial(mod,key=5)print('C__25___使用原函数的关键字参数对5进行求余:')print(mod(25,key=5)) #对5进行求余 -- 原函数

print('D__25___使用偏函数对5进行求余:')print(mod_to_5(25)) #对5进行求余 -- 新函数--偏函数产生

我们看下结果:

我们发现,实际上,偏函数的作用,其实和原函数差不多,只不过,我们要多次调用原函数的时候,有些参数,我们需要多次手动的去提供值,比如上述的对5进行求余,如果我们想知道,15,45,30这些数是否能够被5整除,那么,我们用原函数的话,就需要写三次,key=5,然而,我们用偏函数的话,只需要重复调用新产生的函数mod_to_5(15

or 45 or 30)即可,至于除数5,偏函数已经为我们设定了,因此:

当函数的参数个数太多,需要简化时,使用 functools.partial 可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。当然,decorator也可以实现,如果,我们不嫌麻烦的话。

python偏函数_Python--偏函数(Partial)相关推荐

  1. python异常处理_Python基础语法案例(Fibonacci):选择结构、循环结构、异常处理结构、代码优化...

    推荐图书: <Python程序设计基础(第2版)>,ISBN:9787302490562,董付国,清华大学出版社,第16次印刷,清华大学出版社2019年度畅销图书 图书购买链接(京东):配 ...

  2. python画代码-Python教程_Python画Mandelbrot集 代码

    Python教程_Python画Mandelbrot集 代码 作者:Comet 来源: 课课家 www.kokojia.com点击数:278发布时间:2015-06-19 11:17:19 曼德勃罗集 ...

  3. c语言实现爬虫功能,用C/C 扩展Python语言_python 调用c语言 python实现简单爬虫功能_python实现简单爬虫...

    用C/C 扩展Python语言 Python是一门功能强大的脚本语言,它的强大不仅表现在功能上,还表现在其扩展性上.她提供大量的API以方便程序员利用C/C++对Python进行扩展.因为执行速度慢几 ...

  4. python functools partial_浅谈python标准库--functools.partial

    一.简单介绍: functools模块用于高阶函数:作用于或返回其他函数的函数.一般而言,任何可调用对象都可以作为本模块用途的函数来处理. functools.partial返回的是一个可调用的par ...

  5. python编程语言_python编程语言的简要历史

    python编程语言 The Python programming language is a general-purpose programming language that has carved ...

  6. 2019最新Python学习教程(Python视频教程_Python学习教程_Python学习路线):你心目中编程界的MVP是谁?

    2019最新Python学习教程(Python视频教程_Python学习教程_Python学习路线):你心目中编程界的MVP是谁?编程界的王者是渐落寞的Java还是大火的Python? 是不是你们也喜 ...

  7. python中的偏函数

    偏函数: 当一个函数有很多参数时,调用者就需要提供多个参数.如果减少参数个数,就可以简化调用者的负担.比如,int()函数可以把字符串转换为整数,当仅传入字符串时,int()函数默认按十进制转换,但i ...

  8. Python中的偏函数和函数柯里化

    偏函数(partial)和函数柯里化(currying)是函数式编程中常用的技术.有时候我们在复用已有函数时可能需要固定其中的部分参数,这除了可以通过默认值参数来实现之外,还可以使用偏函数.例如有个函 ...

  9. python学习之偏函数

    什么是偏函数? 实际上,偏函数主要辅助原函数,作用其实和原函数差不多,不同的是,我们要多次调用原函数的时候,有些参数,我们需要多次手动的去提供值.而偏函数便可简化这些操作,减少函数调用,主要是将一个或 ...

  10. Python进阶之偏函数

    偏函数 本文整理自慕课网廖学峰老师的python视频教程 当一个函数有很多参数时,调用者就需要提供多个参数.如果减少参数个数,就可以简化调用者的负担. 比如,int()函数可以把字符串转换为整数,当仅 ...

最新文章

  1. NVIDIA GPU上的Tensor线性代数
  2. hdu-3015 Disharmony Trees---离散化+两个树状数组
  3. ARM Keil MDK开发STM32工程模板
  4. 出现特殊分隔符无法分隔解决方案
  5. 第十四章:监测和维护活动目录(四)
  6. 柯马机器人示教器编程_COMAU柯马机器人示教器无显示维修过程
  7. 使用教育邮箱享正版Jetbrains 套件,IDEA正版webstrom正版
  8. yaml 格式错误 did not find expected key
  9. SAP PI PO XSLT Mapping of Adapter-Specific Message Attributes
  10. java-net-php-python-jsp刺绣作品展示网站计算机毕业设计程序
  11. android基带版本,Android - 基带版本为未知时自动隐藏
  12. iis8.0php套件包,iis 8.0 express-IIS8.0安装包下载 官方免费版--pc6下载站
  13. CSS重叠解决边框相邻变粗问题
  14. PPI_DPI 对比
  15. 海康威视错误代码说明
  16. Eclipse中同时打开多个控制台(Console)
  17. 直播电商购物消费者满意度在线调查报告(三)
  18. android 播放器 sma,SMA测评app
  19. ios 通讯录 通过电话号码 查询姓名
  20. 数据结构学习笔记(基本概念)

热门文章

  1. [开源]Qt图片调整之亮度调节
  2. 玩转CPU Topology
  3. mysql聚簇索引详解
  4. 一位数码管进行数字和字母的显示
  5. SLAM暑期实习求职经验贴(转载知乎)
  6. 高通骁龙632芯片怎么样?骁龙632处理器参数详细介绍
  7. wps合并所有sheet页_wps多个sheet表格合并为一张表
  8. java midi 解析_从java访问MIDI
  9. 设计模式之我爱我家(下)
  10. SSH服务器远程登录虚拟机及传输文件