在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的发展史
Sep 26 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
Dec 25 Python
快速了解Python相对导入
Jan 12 Python
python3 实现一行输入,空格隔开的示例
Nov 14 Python
python实现简单名片管理系统
Nov 30 Python
python基础教程之while循环
Aug 14 Python
python3.6、opencv安装环境搭建过程(图文教程)
Nov 05 Python
Python算法中的时间复杂度问题
Nov 19 Python
python argparse模块通过后台传递参数实例
Apr 20 Python
Python中的__init__作用是什么
Jun 09 Python
基于python实现判断字符串是否数字算法
Jul 10 Python
解决使用Pandas 读取超过65536行的Excel文件问题
Nov 10 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伪造referer突破网盘禁止外连的代码
2008/06/15 PHP
php牛逼的面试题分享
2013/01/18 PHP
php设置静态内容缓存时间的方法
2014/12/01 PHP
php计算两个日期相差天数的方法
2015/03/14 PHP
php生成txt文件实例代码介绍
2016/04/28 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
[推荐]javascript 面向对象技术基础教程
2009/03/03 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
jQuery.holdReady()方法用法实例
2014/12/27 Javascript
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
JS获取图片lowsrc属性的方法
2015/04/01 Javascript
实例讲解避免javascript冲突的方法
2016/01/03 Javascript
bootstrap Validator 模态框、jsp、表单验证 Ajax提交功能
2017/02/17 Javascript
three.js 入门案例详解
2018/01/23 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
浅谈Vue为什么不能检测数组变动
2019/10/14 Javascript
vue监听dom大小改变案例
2020/07/29 Javascript
ant design vue 表格table 默认勾选几项的操作
2020/10/31 Javascript
原生js实现滑块区间组件
2021/01/20 Javascript
Python正则表达式的使用范例详解
2014/08/08 Python
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
2016/05/28 Python
详解python中的json和字典dict
2018/06/22 Python
Python中按键来获取指定的值
2019/03/02 Python
编写python代码实现简单抽奖器
2020/10/20 Python
维多利亚的秘密官方旗舰店:VICTORIA’S SECRET
2018/04/02 全球购物
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
Java如何获得ResultSet的总行数
2016/09/03 面试题
五年级科学教学反思
2014/02/05 职场文书
团结就是力量演讲稿
2014/05/21 职场文书
优秀毕业生求职信
2014/06/05 职场文书
医学专业自荐信
2014/06/14 职场文书
职代会闭幕词
2015/01/28 职场文书
大学生活感想
2015/08/10 职场文书
简述Java中throw-throws异常抛出
2021/08/07 Java/Android
使用Docker容器部署rocketmq单机的全过程
2022/04/03 Servers