在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)

异常结果:

TypeError: func_c() got an unexpected keyword argument 'arg_a'

目前想到的解决办法是尽量避免func_a存在跟其他函数相同的参数,比如把func_a的arg_a参数改成func_a_arg_a。

def func_a(func_a_arg_a, func, **kwargs):
print(func_a_arg_a)
func(**kwargs) def func_b(arg_a):
print(arg_a) def func_c():
print('Hello World') if __name__ == '__main__':
func_a(func_a_arg_a='temp', arg_a='Hello Python', func=func_b)
func_a(func_a_arg_a='temp', func=func_c)

Python中将函数作为另一个函数的参数传入并调用的更多相关文章

  1. JavaScript中函数作为另一个函数的参数的时候它存在于哪个作用域

    一直对函数作为参数被传递进另外一个函数理解的不是很清除.先看下这段代码吧: function test(fn){ var bar = 1; fn(); } var bar = 99; test(fun ...

  2. python函数里面,一个*是可变参数的元祖,两个*是可变参数的字典

    python的函数中,有时会有类似*args,**keys这样的参数,代表的是可变参数,一个*表示元祖,两个*表示字典,就是说这个函数可以接受任何类型的参数,都不会报错,有些函数为了提高可用性,会加这 ...

  3. python中如何单独测试一个函数的作用

    #!/usr/bin/python import os def get_env_varible(key): return os.getenv(key) if __name__ == '__main__ ...

  4. 记录python接口自动化测试--从excel中读取params参数传入requests请求不生效问题的解决过程(第七目)

    在第六目把主函数写好了,先来运行一下主函数 从截图中可以看到,请求参数打印出来了,和excel中填写的一致 但是每个接口的返回值却都是400,提示参数没有传进去,开始不知道是什么原因(因为excel中 ...

  5. python 函数式编程 闭包,返回一个函数

    参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017434209254976 作业 #使用生成器 def createCounter( ...

  6. python学习道路(day4note)(函数,形参实参位置参数匿名参数,匿名函数,高阶函数,镶嵌函数)

    1.函数 2种编程方法 关键词面向对象:华山派 --->> 类----->class面向过程:少林派 -->> 过程--->def 函数式编程:逍遥派 --> ...

  7. python学习笔记-(七)python基础--集合、文件操作&函数

    本节内容 1.集合操作 2.文件操作 3.字符编码与转码 4.函数操作 1.集合操作 集合是一个无序的.不重复的数据组合: 1.1 常用操作 它的作用是: 1)自动去重:列表变成集合,自动去重: &g ...

  8. python学习-day15:函数作用域、匿名函数、函数式编程、map、filter、reduce函数、内置函数r

    ---恢复内容开始--- 一.全局变量与局部变量 在子程序中定义的变量称为局部变量, 在程序的一开始定义的变量称为全局变量. 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序.当全局变量与 ...

  9. Python 编程基础之高阶函数篇(一)

      高阶函数:能接受函数作为参数的函数. 如: f=abs def   add(x,y,f): return f(x)+f(y) 如果我们用:add(-5,9,f)来调用该高阶函数,则返回结果为:14 ...

随机推荐

  1. javaScript函数参数

    <p>查找函数中参数最大的数</p> <p id="demo"></p> <script> x = findMax(1, ...

  2. 如何配置 Health Check?- 每天5分钟玩转 Docker 容器技术(107)

    容器状态是 UP 的,应用就是健康的吗? 还真不一定!Docker 只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行情况基本没有了解. 执行 docker run 命令时,通常会根据 ...

  3. 使用java类破解MyEclipse

    今天在网上查资料的时候无意中发现使用java类破解MyEclipse的注册码问题.跟大家分享一下 1.建立JAVA Project,随便命名,只要符合规则就行 2.在刚刚建好的Project右击src ...

  4. 闲来无事研究一下酷狗缓存文件kgtemp的加密方式

    此贴为本人原创,转载请注明出处 序 前几天更新了被打入冷宫很久的酷狗,等进入之后就感觉菊花一紧----试 听 居 然 都 要 开 通 音 乐 包(高品和无损)才行了,WTF! 这意味着以前缓存的都听不 ...

  5. [Maven实战](7)坐标

    1. 简单介绍 maven的世界中拥有数量很巨大的构件,也就是平时用的一些jar,war等文件. 在maven为这些构件引入坐标概念之前,我们无法使用不论什么一种方式来唯一标识全部这些构件. 因此,当 ...

  6. 柯塔娜(Cortana):从科幻虚构到真实人生

    依照商业法理.7月29日.随着Win10公布的东风."小娜"与"小冰"两姊妹相会于中国北京. 在"小娜"眼中,"小冰"仅 ...

  7. 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯云容器服务团队 源码为 k8s v1.6.1 版本,github 上对应的 commit id 为 b0b7a323cc5a4a ...

  8. Asp.net MVC 简单实现生成Excel并下载

    由于项目上的需求,需要导出指定条件的Excel文件.经过一翻折腾终于实现了. 现在把代码贴出来分享 (直接把我们项目里面的一部份辅助类的代码分享一下) 我们项目使用的是Asp.Net MVC4.0模式 ...

  9. python3.5新增函数isclose的使用

    前言:python3.5的math模块新增一个isclose函数用来判断两个浮点数的值是否接近或相等,这是由于浮点数的计算总是存在一定的误差.下面谈一下用法: import math print(ma ...

  10. 《跟我学IDEA》四、配置模板(提高代码编写效率)

    上一篇博文,我们学习了idea的一些实用配置,相信大家也对idea这个开发工具有了一个大概的了解.今天我们来学习模板的配置,idea提供很多模板从而提高编写代码的效率,比如说一些经常用的代码及生成文件 ...