Python3 实现减少可调用对象的参数个数


Posted in Python onDecember 20, 2019

问题

一个被其他python代码使用的callable对象,可能是一个回调函数或者是一个处理器,由于其参数太多,导致调用时出错。

解决方案

如果需要减少某个函数的参数个数,可以使用functools.partial() 。 partial() 函数允许给一个或多个参数设置固定的值,减少接下来被调用时的参数个数。 假设一个函数有很多参数:

def func(a, b, c, d):
  print(a, b, c, d)

使用 partial() 函数来固定某些参数值:

from functools import partial

s1 = partial(func, 1) # a = 1
print(s1(2, 3, 4))
(1, 2, 3, 4)

s2 = partial(func, d=100)  # d = 100
print(s2(1, 2, 3))
(1, 2, 3, 100)

s3 = partial(func, 1, 2, d=100) # a = 1, b = 2, d = 100
print(s3(3))
(1, 2, 3, 100)

可以看出 partial()函数固定某些参数,并返回一个新的callable对象。这个新的callable接受未赋值的参数, 然后跟之前已经赋值过的参数合并起来,最后将所有参数传递给原始函数。

讨论

假设有一个点的列表points,表示(x, y)坐标元组。现在需要以点(4, 3)为基点,根据点和基点之间的距离来排序points中所有的点。

定义一个函数,用来计算两点之间的距离:

import math

points = [(1, 2), (3, 4), (5, 6), (7, 8)]
pt = (4, 3)

def distance(p1, p2):
  x1, y1 = p1
  x2, y2 = p2
  return math.hypot(x2 - x1, y2 - y1)

列表的 sort() 排序方法,可以接受一个关键字参数,设置自定义排序的逻辑, 但是它只能接受一个单个参数的函数,很显然,distance()函数不符合条件,通过使用 partial() 函数可以解决这个问题:

points.sort(key=partial(distance, pt))
print(points)
[(3, 4), (1, 2), (5, 6), (7, 8)]

很多时候 partial() 能实现的效果,其实,lambda表达式也能实现。

points.sort(key=lambda x: distance(pt, x))
print(points)
[(3, 4), (1, 2), (5, 6), (7, 8)]

以上这篇Python3 实现减少可调用对象的参数个数就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的加密模块md5、sha、crypt使用实例
Sep 28 Python
python中ConfigParse模块的用法
Sep 29 Python
用Python将IP地址在整型和字符串之间轻松转换
Mar 22 Python
Python管理Windows服务小脚本
Mar 12 Python
Python数据分析库pandas基本操作方法
Apr 08 Python
使用python绘制二元函数图像的实例
Feb 12 Python
详解Python3 基本数据类型
Apr 19 Python
python递归下载文件夹下所有文件
Aug 31 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
Sep 26 Python
Python的历史与优缺点整理
May 26 Python
python如何爬取动态网站
Sep 09 Python
Python结合百度语音识别实现实时翻译软件的实现
Jan 18 Python
python获取引用对象的个数方式
Dec 20 #Python
Python 获取命令行参数内容及参数个数的实例
Dec 20 #Python
python 读写文件包含多种编码格式的解决方式
Dec 20 #Python
pandas 中对特征进行硬编码和onehot编码的实现
Dec 20 #Python
使用python3批量下载rbsp数据的示例代码
Dec 20 #Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
Dec 20 #Python
Python字符串、列表、元组、字典、集合的补充实例详解
Dec 20 #Python
You might like
DOTA2 玩家自创拉野攻略 特色英雄快速成长篇
2020/04/20 DOTA
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
ThinkPHP实现多数据库连接的解决方法
2014/07/01 PHP
php调用云片网接口发送短信的实现方法
2017/10/25 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
javascript字典探测用户名工具
2006/10/05 Javascript
Prototype使用指南之enumerable.js
2007/01/10 Javascript
js获取系统的根路径实现介绍
2013/09/08 Javascript
javascript 弹出的窗口返回值给父窗口具体实现
2013/11/23 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
javascript数组克隆简单实现方法
2015/12/16 Javascript
jQuery获取字符串中出现最多的数
2016/02/22 Javascript
设计模式中的组合模式在JavaScript程序构建中的使用
2016/05/18 Javascript
基于jQuery的左滑出现删除按钮的示例
2017/08/29 jQuery
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
2018/06/25 Javascript
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
linux下安装easy_install的方法
2013/02/10 Python
在Python中使用异步Socket编程性能测试
2014/06/25 Python
python监控网站运行异常并发送邮件的方法
2015/03/13 Python
tensorflow创建变量以及根据名称查找变量
2018/03/10 Python
Python中使用gflags实例及原理解析
2019/12/13 Python
Python中包的用法及安装
2020/02/11 Python
Python docutils文档编译过程方法解析
2020/06/23 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
2020/07/07 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
HTML5+CSS3绘制锯齿状的矩形
2016/03/01 HTML / CSS
英文版餐饮运营管理求职信
2013/11/06 职场文书
农村党建工作汇报材料
2014/10/27 职场文书
2014年教学管理工作总结
2014/12/02 职场文书
赔偿协议书
2015/01/27 职场文书
2015年清明节扫墓演讲稿
2015/03/18 职场文书
放假通知范文
2015/04/14 职场文书
2016优秀护士先进个人事迹材料
2016/02/25 职场文书
Vue组件更新数据v-model不生效的解决
2022/04/02 Vue.js