在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+Django在windows下的开发环境配置图解
Nov 11 Python
在Django的模型中执行原始SQL查询的方法
Jul 21 Python
python 实现tar文件压缩解压的实例详解
Aug 20 Python
浅谈python jieba分词模块的基本用法
Nov 09 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
Apr 01 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
Aug 02 Python
pytorch使用 to 进行类型转换方式
Jan 08 Python
Python对wav文件的重采样实例
Feb 25 Python
基于opencv实现简单画板功能
Aug 02 Python
在PyCharm中安装PaddlePaddle的方法
Feb 05 Python
Python如何使用循环结构和分支结构
Apr 13 Python
使用pd.merge表连接出现多余行的问题解决
Jun 16 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
第4章 数据处理-php字符串的处理-郑阿奇(续)
2011/07/04 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
yii使用bootstrap分页样式的实例
2017/01/17 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
推荐dojo学习笔记
2007/03/24 Javascript
poshytip 基于jquery的 插件 主要用于显示微博人的图像和鼠标提示等
2012/10/12 Javascript
解决jquery1.9不支持browser对象的问题
2013/11/13 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
纯js实现遮罩层效果原理分析
2014/05/27 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
jQuery实现HTML5 placeholder效果实例
2014/12/09 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理
2015/11/24 Javascript
AngularJS在IE8的不支持的解决方法
2016/05/13 Javascript
微信小程序中实现一对多发消息详解及实例代码
2017/02/14 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
深入解析ES6中的promise
2018/11/08 Javascript
vue.config.js常用配置详解
2019/11/14 Javascript
Python 调用DLL操作抄表机
2009/01/12 Python
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
python去掉行尾的换行符方法
2017/01/04 Python
django中的setting最佳配置小结
2017/11/21 Python
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
Python 学习教程之networkx
2019/04/15 Python
pygame编写音乐播放器的实现代码示例
2019/11/19 Python
Python标准库itertools的使用方法
2020/01/17 Python
python中def是做什么的
2020/06/10 Python
利用css3画个同心圆示例代码
2017/07/03 HTML / CSS
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
《搭石》教学反思
2014/04/07 职场文书
赔偿协议书范本
2014/04/15 职场文书
班主任与学生安全责任书
2014/07/25 职场文书
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书
检讨书大全
2015/01/27 职场文书
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python