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 相关文章推荐
13个最常用的Python深度学习库介绍
Oct 28 Python
pyqt5自定义信号实例解析
Jan 31 Python
对TensorFlow的assign赋值用法详解
Jul 30 Python
python pandas库的安装和创建
Jan 10 Python
java中的控制结构(if,循环)详解
Jun 26 Python
django 邮件发送模块smtp使用详解
Jul 22 Python
Django REST framework 如何实现内置访问频率控制
Jul 23 Python
如何用Python来理一理红楼梦里的那些关系
Aug 14 Python
PyQt+socket实现远程操作服务器的方法示例
Aug 22 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
Apr 12 Python
Python Mock模块原理及使用方法详解
Jul 07 Python
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
May 25 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
PHP 中的一些经验积累
2006/10/09 PHP
一个php导出oracle库的php代码
2009/04/20 PHP
php学习之运算符相关概念
2011/06/09 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
smarty内部日期函数html_select_date()用法实例分析
2015/07/08 PHP
PHP实现基于文本的摩斯电码生成器
2016/01/11 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
2016/06/13 PHP
php基于curl实现随机ip地址抓取内容的方法
2016/10/11 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
javascript 极速 隐藏/显示万行表格列只需 60毫秒
2009/03/28 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
javascript学习总结之js使用技巧
2015/09/02 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
表格展示利器 Bootstrap Table实例代码
2017/09/06 Javascript
async/await优雅的错误处理方法总结
2019/01/30 Javascript
Vue退出登录时清空缓存的实现
2019/11/12 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
[40:55]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#4Newbee VS Fnatic
2016/03/03 DOTA
[05:15]2018年度CS GO社区贡献奖-完美盛典
2018/12/16 DOTA
收藏整理的一些Python常用方法和技巧
2015/05/18 Python
如何使用七牛Python SDK写一个同步脚本及使用教程
2015/08/23 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
numpy 返回函数的上三角矩阵实例
2019/11/25 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
Django使用django-simple-captcha做验证码的实现示例
2021/01/07 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
美国新兴城市生活方式零售商:VILLA
2017/12/06 全球购物
Solaris操作系统的线程机制
2015/07/28 面试题
高中自我鉴定范文
2013/11/03 职场文书
学校开学标语
2014/10/06 职场文书
2014年项目工作总结
2014/11/24 职场文书
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
2021/07/26 Java/Android
Python如何快速找到多个字典中的公共键(key)
2022/04/29 Python