在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实现2014火车票查询代码分享
Jan 10 Python
Python写的英文字符大小写转换代码示例
Mar 06 Python
基于python实现在excel中读取与生成随机数写入excel中
Jan 04 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
May 15 Python
详解Python下ftp上传文件linux服务器
Jun 21 Python
浅析Python函数式编程
Oct 06 Python
python3 面向对象__类的内置属性与方法的实例代码
Nov 09 Python
利用Python实现Shp格式向GeoJSON的转换方法
Jul 09 Python
基于pandas中expand的作用详解
Dec 17 Python
python的sys.path模块路径添加方式
Mar 09 Python
django 扩展user用户字段inlines方式
Mar 30 Python
python pandas dataframe 去重函数的具体使用
Jul 20 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中fsockopen用法实例
2015/01/05 PHP
PHP动态规划解决0-1背包问题实例分析
2015/03/23 PHP
ThinkPHP里用U方法调用js文件实例
2015/06/18 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
2016/10/11 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
关于PHP中interface的用处详解
2020/07/26 PHP
JS 无法通过W3C验证的处理方法
2010/03/09 Javascript
基于jQuery的为attr添加id title等效果的实现代码
2011/04/20 Javascript
js解析与序列化json数据(三)json的解析探讨
2013/02/01 Javascript
将字符串转换成gb2312或者utf-8编码的参数(js版)
2013/04/10 Javascript
B/S模式项目中常用的javascript汇总
2013/12/17 Javascript
javascript中Object使用详解
2015/01/26 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
2015/03/12 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
2015/10/25 Javascript
js获取隐藏元素宽高的实现方法
2016/05/19 Javascript
基于js实现的限制文本框只可以输入数字
2016/12/05 Javascript
常用的js方法合集
2017/03/10 Javascript
Vue组件化开发思考
2018/02/02 Javascript
微信小程序实现两个页面传值的方法分析
2018/12/11 Javascript
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
python将人民币转换大写的脚本代码
2013/02/10 Python
python numpy存取文件的方式
2020/04/01 Python
如何使用Python脚本实现文件拷贝
2019/11/20 Python
jupyter notebook 实现matplotlib图动态刷新
2020/04/22 Python
python实现AHP算法的方法实例(层次分析法)
2020/09/09 Python
python re的findall和finditer的区别详解
2020/11/15 Python
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
JDK安装目录下有哪些内容
2014/08/25 面试题
教师节宣传方案
2014/05/23 职场文书
党员身份证明材料
2015/06/19 职场文书
严以律己学习心得体会
2016/01/13 职场文书
详解Django中 render() 函数的使用方法
2021/04/22 Python
Python机器学习算法之决策树算法的实现与优缺点
2021/05/13 Python