回调函数
函数的名字作为其他函数的参数,那么这个函数就叫做回调函数
例子:
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=["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函数
思考: 如果两个函数大部分代码都一样,只是某一部分不一样,而这一部分可以考虑将其写成回调函数,这两个函数是否可以合并成一个?
|