在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使用MySQLdb访问mysql数据库的方法
Aug 03 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
Mar 16 Python
python在文本开头插入一行的实例
May 02 Python
Python实现的远程登录windows系统功能示例
Jun 21 Python
对Tensorflow中的变量初始化函数详解
Jul 27 Python
python实现QQ空间自动点赞功能
Apr 09 Python
超简单的Python HTTP服务
Jul 22 Python
python爬虫selenium和phantomJs使用方法解析
Aug 08 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
Dec 09 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
Apr 24 Python
Python调用.net动态库实现过程解析
Jun 05 Python
python 将列表里的字典元素合并为一个字典实例
Sep 01 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开发入门教程之面向对象
2006/12/05 PHP
PHP 配置open_basedir 让各虚拟站点独立运行
2009/11/12 PHP
php的闭包(Closure)匿名函数详解
2015/02/22 PHP
php实现上传图片文件代码
2015/07/19 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
2017/06/28 PHP
Laravel 解决composer相关操作提示php相关异常的问题
2019/10/23 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
PHP手机号码及邮箱正则表达式实例解析
2020/07/11 PHP
用javascript实现在小方框中浏览大图的代码
2007/08/14 Javascript
基于jquery ajax 用户无刷新登录方法详解
2012/04/28 Javascript
js日期、星座的级联显示代码
2014/01/23 Javascript
纯js模拟div层弹性运动的方法
2015/07/27 Javascript
Javascript 字符串模板的简单实现
2016/02/13 Javascript
让nodeJS支持ES6的词法----babel的安装和使用方法
2017/07/31 NodeJs
vue router使用query和params传参的使用和区别
2017/11/13 Javascript
nginx+vue.js实现前后端分离的示例代码
2018/02/12 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
详解使用angular框架离线你的应用(pwa指南)
2019/01/31 Javascript
javascript导出csv文件(excel)的方法示例
2019/08/25 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
Python分治法定义与应用实例详解
2017/07/28 Python
python放大图片和画方格实现算法
2018/03/30 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
详解如何管理多个Python版本和虚拟环境
2019/05/10 Python
python实现猜拳小游戏
2020/04/05 Python
Python任务调度利器之APScheduler详解
2020/04/02 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
统计每一学生的平均成绩
2014/06/06 面试题
JPA的优势都有哪些
2013/07/04 面试题
初三英语教学反思
2016/02/15 职场文书
Python基础之Socket通信原理
2021/04/22 Python
彻底理解golang中什么是nil
2021/04/29 Golang
Python+pyaudio实现音频控制示例详解
2022/07/23 Python