回调函数

函数的名字作为其他函数的参数,那么这个函数就叫做回调函数

例子:

def avg(x,y):
    return (x+y)/2

def my_sum(x,y):
    return x+y

def function(f,x,y):
    return f(x,y)

avg_1=function(avg,3,4)
print(avg_1)
sum_1=function(my_sum,3,4)
print(sum_1)

运行结果:

3.5
7
回调函数的应用
回调函数比较灵活,比如sorted,提供一个回调函数,可以根据需要进行排序

sorted函数的定义如下:
sorted(iterable, /, *, key=None, reverse=False)¶
这里的key指定带有单个参数的函数,这个参数是iterable中的每个元素,用于从每个元素中提取比较的健

#将my_list中的元素按照第6位的大小进行排序

my_list=["20220203","20220103","20220402","20220105","20220203","20220104","20220504","20220603"]

def by_six_index(item):
    return item[5:6]
new_list=sorted(my_list,key=by_six_index)

print(new_list)

运行结果:

['20220103', '20220105', '20220104', '20220203', '20220203', '20220402', '20220504', '20220603']

以上代码可以使用lambda表达式进行改良

my_list=["20220203","20220103","20220402","20220105","20220203","20220104","20220504","20220603"]

new_list=sorted(my_list,key=lambda item:item[5:6])
re.sub方法

正则表达式的sub方法定义如下:
re.sub(pattern, repl, string, count=0, flags=0)
这里的repl可以是个字符串,也可以是一个回调函数,如果是回调函数,参数是一个Match对象
如果 repl 是一个函数,那它会对每个非重复的 pattern 的情况调用。这个函数只能有一个 匹配对象 参数,并返回一个替换后的字符串

import re
origin_str="Today is one:by:one, tomorrow is two:by:two"


def replacefunction(match):
    group1=match.group(1)
    group2=match.group(2)
    group3=match.group(3)
    return group1+"-"+group2+"-"+group3

new_str=re.sub(r"(\w{3}):(\w{2}):(\w{3})",replacefunction,origin_str)
print(new_str)

运行结果:

Today is one-by-one, tomorrow is two-by-two

总结:如果使用的方法或者函数中有参数是一个回调函数,首选要弄清楚这个回调函数的参数是什么,如果函数体只有一个return语句,可以用lambda函数

思考:
如果两个函数大部分代码都一样,只是某一部分不一样,而这一部分可以考虑将其写成回调函数,这两个函数是否可以合并成一个?

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐