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 random模块(获取随机数)常用方法和使用例子
May 13 Python
Python数组条件过滤filter函数使用示例
Jul 22 Python
python中的lambda表达式用法详解
Jun 22 Python
Python算法应用实战之栈详解
Feb 04 Python
python实现rsa加密实例详解
Jul 19 Python
python处理multipart/form-data的请求方法
Dec 26 Python
python+pyqt5编写md5生成器
Mar 18 Python
pycharm修改文件的默认打开方式的步骤
Jul 29 Python
利用Python绘制有趣的万圣节南瓜怪效果
Oct 31 Python
Python基础之字符串常见操作经典实例详解
Feb 26 Python
python实现简单遗传算法
Sep 18 Python
Django xadmin安装及使用详解
Oct 26 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&&mysql)三
2006/10/09 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
2015/12/28 PHP
php实现简单的守护进程创建、开启与关闭操作
2019/08/13 PHP
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
JS 修改URL参数(实现代码)
2013/07/08 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
JavaScript中数据结构与算法(一):栈
2015/06/19 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】
2016/09/20 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
react 应用多入口配置及实践总结
2018/10/17 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
2019/02/21 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
vue-form表单验证是否为空值的实例详解
2019/10/29 Javascript
jQuery实现鼠标移入显示蒙版效果
2020/01/11 jQuery
vscode调试node.js的实现方法
2020/03/22 Javascript
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
vue-cli3 热更新配置操作
2020/09/18 Javascript
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
Python实现的径向基(RBF)神经网络示例
2018/02/06 Python
详解TensorFlow查看ckpt中变量的几种方法
2018/06/19 Python
python 读取摄像头数据并保存的实例
2018/08/03 Python
python读取指定字节长度的文本方法
2019/08/27 Python
Python 中由 yield 实现异步操作
2020/05/04 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
2021/01/29 Python
python利用opencv实现颜色检测
2021/02/23 Python
英国第一的购买便宜玩具和游戏的在线购物网站:Bargain Max
2018/01/24 全球购物
教学实验楼管理制度
2014/02/01 职场文书
幼儿园大班毕业评语
2014/12/31 职场文书
学校艾滋病宣传活动总结
2015/05/09 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书
初任公务员培训心得体会
2016/01/08 职场文书