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中字典的setdefault()方法教程
Feb 07 Python
Django实现的自定义访问日志模块示例
Jun 23 Python
Python多进程并发与多线程并发编程实例总结
Feb 08 Python
Django实战之用户认证(用户登录与注销)
Jul 16 Python
Tesserocr库的正确安装方式
Oct 19 Python
python连接PostgreSQL数据库的过程详解
Sep 18 Python
python中的RSA加密与解密实例解析
Nov 18 Python
python读写Excel表格的实例代码(简单实用)
Dec 19 Python
Python面向对象编程基础实例分析
Jan 17 Python
python 识别登录验证码图片功能的实现代码(完整代码)
Jul 03 Python
Pycharm添加虚拟解释器报错问题解决方案
Oct 13 Python
pytorch 中forward 的用法与解释说明
Feb 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
laravel withCount 统计关联数量的方法
2019/10/10 PHP
ExtJs 3.1 XmlTreeLoader Example Error
2010/02/09 Javascript
js打印纸函数代码(递归)
2010/06/18 Javascript
Dom 是什么的详细说明
2010/10/25 Javascript
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
2013/08/12 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
2013/12/17 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
2014/02/10 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
JavaScript中的toDateString()方法使用详解
2015/06/12 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
jQuery Dialog对话框事件用法实例分析
2016/05/10 Javascript
关于网页中的无缝滚动的js代码
2016/06/09 Javascript
JavaScript实现打地鼠小游戏
2020/04/23 Javascript
详解nodejs实现本地上传图片并预览功能(express4.0+)
2017/06/28 NodeJs
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
Puppeteer环境搭建的详细步骤
2018/09/21 Javascript
详解基于vue-cli3.0如何构建功能完善的前端架子
2018/10/09 Javascript
在vue和element-ui的table中实现分页复选功能
2019/12/04 Javascript
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
python中时间、日期、时间戳的转换的实现方法
2019/07/06 Python
Django如何将URL映射到视图
2019/07/29 Python
Python高级编程之继承问题详解(super与mro)
2019/11/19 Python
python识别验证码图片实例详解
2020/02/17 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
HTML5 中新的全局属性(整理)
2013/07/31 HTML / CSS
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
英国体育器材进口商店:UK Sport Imports
2017/03/14 全球购物
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
数控专业推荐信范文
2013/12/02 职场文书
药品促销活动方案
2014/02/14 职场文书
师德演讲稿范文
2014/05/06 职场文书
装修活动策划方案
2014/08/27 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
离婚律师函范本
2015/05/27 职场文书
golang语言指针操作
2022/04/14 Golang