在Python中将函数作为另一个函数的参数传入并调用的方法


Posted in Python onJanuary 22, 2019

在Python中,函数本身也是对象,所以可以将函数作为参数传入另一函数并进行调用

在旧版本中,可以使用apply(function, *args, **kwargs)进行调用,但是在新版本中已经移除,以function(*args, **kwargs)进行替代,所以也不应该再使用apply方法

示例代码:

def func_a(func, *args, **kwargs):
  print(func(*args, **kwargs))

def func_b(*args):
  return args

if __name__ == '__main__':
  func_a(func_b, 1, 2, 3)

在代码中,将函数func_b作为函数func_a的参数传入,将函数func_b的参数以元组args传入,并在调用func_b时,作为func_b的参数。

运行结果:

(1, 2, 3)

但是这里存在一个问题,但func_a和func_b需要同名的参数时,就会出现异常,如:

def func_a(arg_a, func, **kwargs):
  print(arg_a)
  print(func(**kwargs))

def func_b(arg_a):
  print(arg_a)

if __name__ == '__main__':
  func_a(arg_a='Hello Python', func=func_b)

异常信息:

TypeError: func_b() missing 1 required positional argument: 'arg_a'

虽然通过修改,手动将arg_a作为参数传入func中进行调用,可以正常运行,但这明显不符合设计初衷:在func_a中执行func(**kwargs)时,很可能并不知道func到底需要什么参数。换句话说,如果已经提前知道需要调用什么函数,那完全不必要把函数作为参数传入另一个函数并调用,直接调用函数即可。

def func_a(arg_a, func, **kwargs):
  print(arg_a)
  func(arg_a=arg_a, **kwargs)

def func_b(arg_a):
  print(arg_a)

if __name__ == '__main__':
  func_a(arg_a='Hello Python', func=func_b)

当加入第三个函数,func_c,它不需要arg_a这个参数时,就会出现问题。

def func_a(arg_a, func, **kwargs):
  print(arg_a)
  func(arg_a=arg_a, **kwargs)

def func_b(arg_a):
  print(arg_a)

def func_c():
  print('Hello World')

if __name__ == '__main__':
  func_a(arg_a='Hello Python', func=func_b)
  func_a(arg_a='Hello Python', func=func_c)

以上这篇在Python中将函数作为另一个函数的参数传入并调用的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用PyV8执行javascript代码示例分享
Dec 04 Python
python实现bitmap数据结构详解
Feb 17 Python
python追加元素到列表的方法
Jul 28 Python
总结用Pdb库调试Python的方式及常用的命令
Aug 18 Python
教你用Python写安卓游戏外挂
Jan 11 Python
python tkinter界面居中显示的方法
Oct 11 Python
Python绘制并保存指定大小图像的方法
Jan 10 Python
基于python历史天气采集的分析
Feb 14 Python
python sklearn库实现简单逻辑回归的实例代码
Jul 01 Python
Mac安装python3的方法步骤
Aug 09 Python
解决flask接口返回的内容中文乱码的问题
Apr 03 Python
python2.7使用scapy发送syn实例
May 05 Python
python3.4爬虫demo
Jan 22 #Python
使用Template格式化Python字符串的方法
Jan 22 #Python
python实现公司年会抽奖程序
Jan 22 #Python
对python函数签名的方法详解
Jan 22 #Python
python实现大转盘抽奖效果
Jan 22 #Python
Python函数返回不定数量的值方法
Jan 22 #Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 #Python
You might like
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
2011/12/06 PHP
php中检查文件或目录是否存在的代码小结
2012/10/22 PHP
php中使用preg_match_all匹配文章中的图片
2013/02/06 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
PHP设计模式之工厂模式定义与用法详解
2018/04/03 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
JS和JQ的event对象区别分析
2014/11/24 Javascript
jquery模拟进度条实现方法
2015/08/03 Javascript
js实现当前输入框高亮显示的方法
2015/08/19 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
easyui中combotree循环获取父节点至根节点并输出路径实现方法
2016/11/10 Javascript
vue实现ajax滚动下拉加载,同时具有loading效果(推荐)
2017/01/11 Javascript
JS表单提交验证、input(type=number) 去三角 刷新验证码
2017/06/21 Javascript
Node.js中DNS模块学习总结
2018/02/28 Javascript
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
2018/09/11 Javascript
highCharts提示框中显示当前时间的方法
2019/01/18 Javascript
利用js-cookie实现前端设置缓存数据定时失效
2019/06/18 Javascript
Vue Object 的变化侦测实现代码
2020/04/15 Javascript
使用Python的Twisted框架编写非阻塞程序的代码示例
2016/05/25 Python
浅谈tensorflow中张量的提取值和赋值
2020/01/19 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
2020/03/27 Python
python中用ggplot绘制画图实例讲解
2021/01/26 Python
Python中全局变量和局部变量的理解与区别
2021/02/07 Python
加拿大廉价机票预订网站:CheapOair.ca
2018/03/04 全球购物
天猫某品牌专卖店运营计划书
2014/03/21 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
小学生迎国庆演讲稿
2014/09/05 职场文书
个人年终总结怎么写
2015/03/09 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
golang http使用踩过的坑与填坑指南
2021/04/27 Golang
HTML5简单实现添加背景音乐的几种方法
2021/05/12 HTML / CSS
SQL语句中JOIN的用法场景分析
2021/07/25 SQL Server
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL