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的__builtin__模块中的一些要点知识
May 02 Python
python中lambda()的用法
Nov 16 Python
python和flask中返回JSON数据的方法
Mar 26 Python
Python基于socket模块实现UDP通信功能示例
Apr 10 Python
使用Python实现租车计费系统的两种方法
Sep 29 Python
pip install python 快速安装模块的教程图解
Oct 08 Python
Python帮你识破双11的套路
Nov 11 Python
Python 实现将数组/矩阵转换成Image类
Jan 09 Python
Python 读取xml数据,cv2裁剪图片实例
Mar 10 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
Jun 29 Python
Python基础之教你怎么在M1系统上使用pandas
May 08 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
文件上传的实现
2006/10/09 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
浅谈PHP各环境下的伪静态配置
2019/03/13 PHP
JavaScript入门教程(5) js Screen屏幕对象
2009/01/31 Javascript
JavaScript 类的定义和引用 JavaScript高级培训 自定义对象
2010/04/27 Javascript
JavaScript高级程序设计 错误处理与调试学习笔记
2011/09/10 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
使用node.js半年来总结的 10 条经验
2014/08/18 Javascript
jQuery实现的网页右下角tab样式在线客服效果代码
2015/10/23 Javascript
CSS中position属性之fixed实现div居中
2015/12/14 Javascript
Move.js入门
2017/02/08 Javascript
JavaScript中数组Array方法详解
2017/02/27 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
React-router中结合webpack实现按需加载实例
2017/05/25 Javascript
js canvas实现适用于移动端的百分比仪表盘dashboard
2017/07/18 Javascript
JScript实现表格的简单操作
2017/08/15 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
jQuery实现每日秒杀商品倒计时功能
2019/09/06 jQuery
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
基于python 处理中文路径的终极解决方法
2018/04/12 Python
python读写Excel表格的实例代码(简单实用)
2019/12/19 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
2020/01/17 Python
在django admin中配置搜索域是一个外键时的处理方法
2020/05/20 Python
Python中三维坐标空间绘制的实现
2020/09/22 Python
浅析HTML5 Landmark
2020/09/11 HTML / CSS
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
介绍一下Java中标识符的命名规则
2014/02/03 面试题
初中生期末评语大全
2014/04/24 职场文书
群众路线学习心得体会范文
2014/11/05 职场文书
先进个人事迹材料
2014/12/29 职场文书
幼儿园中班教师个人工作总结
2015/02/06 职场文书
2019已经过半,你知道年中工作总结该怎么写吗?
2019/07/03 职场文书