Python进阶:Lambda、高阶函数与装饰器实战详解

蓝鲸
蓝鲸
发布时间:2026-10-15 | 5人浏览过
原创

本文系统讲解Python进阶核心特性,涵盖Lambda匿名函数定义与用法,深入解析map、filter、reduce三大高阶函数的输入输出逻辑与代码示例。同时详细阐述列表、集合、字典推导式的编写技巧,以及闭包、装饰器、语法糖和注解的高级应用,帮助开发者掌握函数式编程与高阶函数处理技巧。

一、Lambda表达式

Lambda表达式,通常被称为匿名函数,其基本语法格式为:lambda 参数列表:函数体。这种结构允许在不定义正式函数名的情况下快速创建简单的函数逻辑。


def add(x,y): 
	return x+y 
print(add(3,4))
#上面的函数可以写成Lambda函数
add_lambda=lambda x,y:x+y 
add_lambda(3,4)

二、map函数

map函数的核心在于建立输入与输出之间的映射关系,具体对应逻辑可参考相关图示说明。

map函数的主要作用是将一个可迭代对象中的元素,按照指定的规则映射生成新的对象序列。因此,该函数需要接收两个关键参数:一个是定义映射规则的函数(通常是Lambda),另一个是待处理的可迭代对象。


list1=[1,2,3,4,5]
r=map(lambda x:x+x,list)
print(list1(r))

执行上述映射操作后,得到的结果为:[2,4,6,8,10]。


m1=map(lambda x,y:x*x+y,[1,2,3,4,5],[1,2,3,4,5])
print(list(ml))

若映射规则涉及多个列表的运算,结果可能为:[2,6,12,20,30]。

三、filter函数

filter函数用于数据过滤,其输入与输出的对应关系可通过图示直观理解。


def is_not_none(s): 
	return s and len(s.strip())>0
list2=['','','hello','xxxx', None,'ai']
result=filter(is_not_none, list2)
print(list(result))

经过filter函数处理后的筛选结果为:['hello', 'xxxx', 'ai']。

四、reduce函数


from functools import reduce
f=lambda x,y:x+y x=reduce(f,[1,2,3,4,5])
print(r)

reduce函数的执行结果是累加值,例如:15=1+2+3+4+5。其计算机制是每一次计算都基于前一次计算的结果,逐步累积。

此外,还可以为reduce函数的计算过程指定一个初始值,以改变累加的起始状态。


from functools import reduce
f=lambda x,y:x+y x=reduce(f,[1,2,3,4,5],10)
print(r)

当指定初始值为10时,最终结果为:25=10+1+2+3+4+5。

五、三大推导式

5.1 列表推导式


list1=[1,2,3,4,5,6]
f=map(lambda x:x+x,list1)
print(list(f))
list2=[i+i for i in list1]
print(list2)
list3=[i**3 for i in list1]
print(list3)
#筛选列表的例子
list4=[i*4 for i in list1 if i>3]
print(list4)
#结果
[2,4,6,8,10,12]
[2,4,6,8,10,12]
[1,8,27,64,125,216]
[16,25,36]

5.2 集合推导式

只需将上述列表推导式的代码中的方括号改为花括号,即可直接转换为集合推导式。


list1={1,2,3,4,5,6}

list2={i+i for i in list1}
print(list2)
list3={i**3 for i in list1}
print(list3)
#筛选列表的例子
list4={i*4 for i in list1 if i>3}
print(list4)
#结果

{2, 4, 6, 8, 10, 12}
{64, 1, 8, 216, 27, 125}#这里是乱序的
{16, 24, 20}

5.3 字典推导式


s={
"zhangsan":20,
"lisi":15,
"wangwu":31
}
#拿出所有的key,并变成列表
s_key=[ key for key, value in s.items()]
print(s_key)
#结果
['zhangsan','lisi','wangwu']

# 交换key和value位置,注意冒号的位置
s1={ value: key for key, value in s.items()}
print(s1)
#结果
{20:'zhangsan',15:'1isi',31:'wangwu'}

s2={ key: value for key, value in s.items() if key=="1isi"}
print(s2)
#结果
{"lisi":15}

六、闭包

闭包的定义是一个返回值为函数的函数,即内部函数引用了外部函数的变量。


import time 
def runtime(): 
	def now_time(): 
		print(time.time())
	return now_time #返回值是函数名字
f=runtime()#f就被赋值为一个函数now_time()了
f()#运行f相当于运行now_time()

进一步来看一个带有参数的闭包示例:假设存在一个CSV文件,其内容包含三行数据,具体结构如下。

数据行内容为:a,b,c,d,e;1,2,3,4,5;6,7,8,9,10。


def make_filter(keep):# keep=8
	def the_filter(file_name): 
		file=open(file name)#打开文件
		lines=file.readlines()#按行读取文件
		file.close()#关闭文件
		filter_doc=[i for i in lines if keep in i]#过滤文件内容
		return filter_doc 
	return the_filter

filter1=make_filter("8")#这一行调用了make_filter函数,且把8做为参数传给了keep,接受了the_filter函数作为返回值
#这里的filter1等于函数the_filter
filter_result=filter1("data.csv")#把文件名data.csv作为参数传给了函数the_filter
print(filter_result)
#结果
['6,7,8,9,10']

七、装饰器、语法糖、注解


# 这是获取函数开始运行时间的函数
import time 
def runtime(func): 
	def get_time(): 
		print(time.time())
		func()# run被调用	
	return get_time
@runtime
def run()
	print('student run')

#运行
run()

#结果
当前时间
student run	

由于使用了@runtime装饰器,run函数会被作为参数传递给runtime(func)。如果调整打印时间的代码位置,执行结果会有所不同。


# 这是获取函数结束运行时间的函数
import time 
def runtime(func): 
	def get_time(): 
		func()# run被调用	
		print(time.time())		
	return get_time
@runtime
def run()
	print('student run')

#运行
run()

#结果
student run	
当前时间

需要注意的是,此处还应用了闭包的概念。当运行run函数时,实际调用的是内部的get_time函数。

对于包含多个参数的函数如何调用,可以参考以下示例代码。


#有一个参数
import time 
def runtime(func): 
	def get_time(i): 
		func(i)# run被调用	
		print(time.time())		
	return get_time
@runtime
def run(i)
	print('student run')
#运行
run(1)

#有两个参数
import time 
def runtime(func): 
	def get_time(i,j): 
		func(i,j)# run被调用	
		print(time.time())		
	return get_time
@runtime
def run(i,j)
	print('student run')
#运行
run(1,2)

可以发现,上述写法在处理函数多态性时不够灵活,因此可以优化为更通用的写法。


#自动适配参数
import time 
def runtime(func): 
	def get_time(*arg): 
		func(*arg)# run被调用	
		print(time.time())		
	return get_time
@runtime
def run(i)
	print('student1 run')

@runtime
def run(i,j)
	print('student2 run')
#运行
run(1)
run(1,2)

再次进行扩展,采用更为普适的写法,可以解决传入类似i=4的关键字参数情况。


#自动适配参数
import time 
def runtime(func): 
	def get_time(*arg,**kwarg): 
		func(*arg,**kwarg)# run被调用	
		print(time.time())		
	return get_time
@runtime
def run(i)
	print('student1 run')

@runtime
def run(*arg,**kwarg)
	print('student2 run')

@runtime
def run()
	print('no param run')
#运行
run(1)
run(1,2,j=4)
run()

到此这篇关于Python进阶之高级用法详细总结的文章就介绍到这了,更多相关Python高级用法内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表