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中的实现
May 04 Python
Python贪吃蛇游戏编写代码
Oct 26 Python
详解Golang 与python中的字符串反转
Jul 21 Python
Python+tkinter使用40行代码实现计算器功能
Jan 30 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
Feb 22 Python
python实现输入数字的连续加减方法
Jun 22 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
Jul 25 Python
利用python实现汉字转拼音的2种方法
Aug 12 Python
pytorch使用 to 进行类型转换方式
Jan 08 Python
Python HTTP下载文件并显示下载进度条功能的实现
Apr 02 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
Aug 07 Python
Python监听剪切板实现方法代码实例
Nov 11 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 的加密函数 md5,crypt,base64_encode 等使用介绍
2012/04/09 PHP
PHP fopen()和 file_get_contents()应用与差异介绍
2014/03/19 PHP
Linux系统递归生成目录中文件的md5的方法
2015/06/29 PHP
PHP基于ORM方式操作MySQL数据库实例
2017/06/21 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
任意位置显示html菜单
2007/02/01 Javascript
jquery 日期分离成年月日的代码
2010/05/14 Javascript
javaScript 利用闭包模拟对象的私有属性
2011/12/29 Javascript
jquery 插件学习(六)
2012/08/06 Javascript
js中prototype用法详细介绍
2013/11/14 Javascript
用js将内容复制到剪贴板兼容浏览器
2014/03/18 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
2015/01/09 Javascript
Javascript中实现trim()函数的两种方法
2015/02/04 Javascript
jquery中EasyUI实现同步树
2015/03/01 Javascript
Bootstrap组件(一)之菜单
2016/05/11 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
解决vue build打包之后首页白屏的问题
2018/03/06 Javascript
vue iview组件表格 render函数的使用方法详解
2018/03/15 Javascript
D3.js实现拓扑图的示例代码
2018/06/30 Javascript
Layui数据表格 前后端json数据接收的方法
2019/09/19 Javascript
[54:33]2018DOTA2亚洲邀请赛小组赛 A组加赛 Liquid vs Optic
2018/04/03 DOTA
零基础写python爬虫之打包生成exe文件
2014/11/06 Python
在Python的setuptools框架下生成egg的教程
2015/04/13 Python
简单介绍Python中的floor()方法
2015/05/15 Python
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
Python实现带百分比的进度条
2016/06/28 Python
Python 包含汉字的文件读写之每行末尾加上特定字符
2016/12/12 Python
Python SqlAlchemy动态添加数据表字段实例解析
2018/02/07 Python
使用CSS3配合IE滤镜实现渐变和投影的效果
2015/09/06 HTML / CSS
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
2014年大学庆元旦迎新年活动方案
2014/03/09 职场文书
2014年五四青年节活动策划书
2014/04/22 职场文书
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
高二学年自我鉴定范文(2篇)
2014/09/26 职场文书
2014年招商工作总结
2014/11/22 职场文书
财务总监岗位职责范本
2015/04/03 职场文书