Python中将函数作为另一个函数的参数传入并调用

在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)
时间: 2024-07-31 18:28:30

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

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

本节内容 1.集合操作 2.文件操作 3.字符编码与转码 4.函数操作 1.集合操作 集合是一个无序的.不重复的数据组合: 1.1 常用操作 它的作用是: 1)自动去重:列表变成集合,自动去重: 1 2 3 4 >>> list_1 = [1,4,4,5,6,7,9,10] >>> list_1 =set(list_1) >>> print(list_1) {1, 4, 5, 6, 7, 9, 10} 2)关系测试:测试两组数据之间的关系,交集.并集.

一个函数装饰器

Python的函数是对象 Python  函数可以被赋值def  hello():–print('hello!') a = hello       #注: 此处没有() ,是一个对象 a()        # 调用a() 结果与hello() 相同 此时删除 hello,a() 依然保持原属性 函数可以定义在另一个函数里面 def say(): def hello(): return 'hello' return hello 外层的say函数会把内层的 hello函数的执行结果输出 函数可以返回

Python回顾与整理9:函数和函数式编程

0.说明 无论在什么编程语言中,函数都不可或缺,充分利用函数的特性,可以大大减少我们程序中的代码量. 1.什么是函数 所谓函数,英文名为function,其实就是表示为实现一定功能的一段代码,显然,如果需要多次实现某一功能时,使用函数就是把重复代码放入其中,既节省空间,又有助于保持一致性(主要是修改代码时). (1)函数vs过程 两者都是可以被调用的实体,过程是简单.没有返回值.特殊的函数.在Python中,过程就是函数,因为解释器会隐匿地返回默认值None. (2)返回值与函数类型 在C语言中

python笔记--3--函数、生成器、装饰器、函数嵌套定义、函数柯里化

函数 函数定义语法: def 函数名([参数列表]): '''注释''' 函数体 函数形参不需要声明其类型,也不需要指定函数返回值类型 即使该函数不需要接收任何参数,也必须保留一对空的圆括号 括号后面的冒号必不可少 函数体相对于def关键字必须保持一定的空格缩进 Python允许嵌套定义函数 在定义函数时,开头部分的注释并不是必需的,但是如果为函数的定义加上这段注释的话,可以为用户提供友好的提示和使用帮助. Python是一种高级动态编程语言,变量类型是随时可以改变的.Python中的函数和自定

Python实用笔记 (6)函数

绝对值 >>> abs(100) 100 >>> abs(-20) 20 max()可以接收任意多个参数,并返回最大的那个: >>> max(1, 2) 2 >>> max(2, 3, 1, -5) 3 数据类型转换 >>> int('123') 123 >>> int(12.34) 12 >>> float('12.34') 12.34 >>> str(1.23

python入门第十一天_函数

Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 不同于数学中的函数定义,在计算机中,函数又可以称呼为子程序. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这被叫做用户自定义函数. 定义一个函数 你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号(). 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用

定义一个函数

Python3 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如 print().但你也可以自己创建函数,这被叫做用户自定义函数. 定义一个函数 你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (). 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数. 函数的第一行语句可以选择性地使用文档字符串

Python中multiprocessing.Pool运行带多个参数的函数

在python中经常会到用多线程处理某个函数来缩短运行时间,但通常multiprocessing.Pool的map函数只接受一个可迭代参数. from multiprocessing import Pool def work(x): return x+1 pool = Pool(processes=4) # 4个线程 x = [1,2,3,4,5,6] results = pool.map(work, x) print results 运行上面的程序就会多线程处理并打印出输入x的计算结果. 但是

Python学习,第八课 - 函数

本次讲解函数,由于内容比较多,小编列了个大纲,主要有一下内容: 1. 函数基本语法及特性 2. 函数参数 3.局部变量 4. 返回值 5.嵌套函数 6.递归 7.匿名函数 8.高阶函数 9.内置函数 1. 函数基本语法及特性 函数的定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 函数的特性: 减少重复代码 使程序变的可扩展 使程序变的易维护 函数的语法定义 直接上代码: # def 是定义函数的关键字 def test():#test既是函数