快速掌握python函数进阶【lambda匿名函数,高阶函数,装饰器】(内附代码)
1 lambda 匿名函数
匿名函数就是没有名字的函数,这种函数只使用一次;
一般函数体只有一条语句一个返回值,用于实现简单功能。
语法格式
lambda 参数1, 参数2, ... : 表达式
print((lambda x:x+2)(2)) #结果为4
fun1=lambda x:x+2
print(fun1(4)) #结果为6
fun2=lambda :print("匿名函数")
fun2() #结果为匿名函数
fun3=lambda :3
print(fun3()) #结果为3
fun4=lambda *num :sum(num)
print(fun4(1,2,3,4,5)) #结果为15
fun5=lambda **stus:stus
print(fun5(zhangsna=18,wangwu=20))
# 结果为{'zhangsna': 18, 'wangwu': 20}
fun6=lambda a,b=1 :a+b
print(fun6(3)) #结果为4
print(fun6(3,8)) #结果为11
fun7=lambda a,b:max(a,b)
print(fun7(10,20)) #结果为20
# 结果1 if 条件 else 结果二
fun8=lambda a,b:a if a>b else b #结果为13
print(fun8(13,10))
lambda函数的特性
- lambda函数是匿名的,即它是没有名字的函数,并且自带return。
- lambda函数可以使用任意数量的参数,但只能包含一个表达式。
- lambda函数返回一个值,这个值就是表达式的结果。
- lambda函数的生命周期很短,调用后立即被回收。
2 高阶函数
数学中的高阶函数:y = g(f(x))
Python中的高阶函数:将一个或多个函数作为函数的参数
2.1 map 函数
将一个函数应用到一个序列的每一个元素,
并返回一个包含结果的迭代器。
map语法格式:
map(函数,可迭代对象)
input_num = (1,2,3,4,5)
# 内置函数:str() int() float()
ret = map(str, input_num)
print(ret)
print(list(ret))
ls = [1,2,3,4,5]
ret = list(map(lambda x : x*10, ls))
print(ret)
2.2 reduce函数
reduce 函数用于对序列进行累计运算,
通常需要从 functools 模块中导入。
reduce语法格式:
from functools import reduce
reduce(函数,可迭代对象)
# 初始值无明确给出时,默认使用序列的第一个元素(1)作为初始值。
# 然后将第二个元素(2)与初始值(1)相乘得到 2。
from functools import reduce
ls = [1,2,3,4,5]
ret_sum = reduce(lambda x, y: x+y, ls)
print(ret_sum) #结果为15
ret_pro = reduce(lambda x, y: x*y, ls)
print(ret_pro) #结果为120
2.3 filter函数
用于遍历序列中的每个元素,根据条件进行筛选,
返回一个包含被筛选后结果的迭代器。
filter语法格式:
filter(函数, 可迭代对象)
import random
ls = [random.randint(10,30) for _ in range(10)]
print(ls) #结果为[18, 24, 28, 27, 26, 28, 16, 13, 18, 25]
ret = filter(lambda x : x%2==0, ls) #筛选出偶数
print(ret)
print(list(ret)) #[18, 24, 28, 26, 28, 16, 18]
2.4 排序函数
menu = [['h红烧牛肉面', 18], ['x香辣牛肉面', 16], ['a安徽板面', 15], ['c重庆小面', 20]]
# 排序
menu.sort()
print(menu)
# 按单价排序 —— itemgetter——获取多维数组中某个维度的元素值
import operator
menu.sort(key=operator.itemgetter(1), reverse=True)
print(menu)
# 按单价排序 —— 使用匿名函数
menu.sort(key=lambda x:x[1], reverse=False)
print(menu)
3、装饰器
3.1 装饰器的概念
在python中,装饰器本质是一个特殊的嵌套函数,
它接收一个函数【被装饰的函数】做参数,
并返回一个新的函数【装饰后的函数】
作用:在不改变原有函数【被装饰的函数】的基础上给它添加新的功能。
3.2 装饰器的基本用法
# 装饰器
def out_fun(function):
def in_fun():
print("挂上一颗星星")
function()
print("挂上一个礼物盒")
return in_fun
# 被装饰函数
def my_tree():
print("简简单单一棵树")
# 第一种调用方式
out_fun(my_tree)()
my_tree()
# 【运行结果】:
# 挂上一颗星星
# 简简单单一棵树
# 挂上一个礼物盒
# 简简单单一棵树
# 装饰器
def out_fun(function):
def in_fun():
print("挂上一颗星星")
function()
print("挂上一个礼物盒")
return in_fun
# 被装饰函数
def my_tree():
print("简简单单一棵树")
# 第二种调用方式
my_tree = out_fun(my_tree)
my_tree()
#【运行结果】:
# 挂上一颗星星
# 简简单单一棵树
# 挂上一个礼物盒
3.3 装饰器语法糖
语法糖是由编程语言提供的,可以让代码更加简洁、高效、易读和易写。
语法糖不改变不会带来新的功能,也不会改变编程的结果,但是使用它会更加方便。
python中有很多语法糖,已用的有:
- 列表推导式
- 集合推导式
- 字典推导式
- f-string print(f"{}")
- 解包
- 装饰器
语法格式:
@装饰器 函数名
def 被装饰函数名:
代码块
※ 其实就是在被装饰函数的上面加一句话——@装饰器
# 装饰器
def out_fun(function):
def in_fun():
print("挂上一颗星星")
function()
print("挂上一个礼物盒")
return in_fun
# 被装饰函数
@out_fun
def my_tree():
print("简简单单一棵树")
my_tree()
3.4 被装饰函数有参数
若被装饰函数有参数,那么装饰器的内部函数也需要有参数;
保证在内部调用被装饰函数的时候能正确传参。
3.4.1 被装饰函数有一个参数
# 装饰器
def out_fun(function):
def in_fun(x):
print("挂上一颗星星")
function(x)
print("挂上一个礼物盒")
return in_fun
# 被装饰函数
@out_fun
def my_tree(x):
print(f"简简单单{x}棵树")
my_tree(3)
#【运行结果】:
# 挂上一颗星星
# 简简单单3棵树
# 挂上一个礼物盒
3.4.2 被装饰函数有未知个参数
import time
# 装饰器
def out_fun(function):
def in_fun(*args, **kwargs):
start = time.time()
function(*args, **kwargs)
end = time.time()
print(end - start)
return in_fun
# 被装饰函数1
@out_fun
def fun1(x):
time.sleep(1)
print(x)
fun1(1)
# 被装饰函数2
@out_fun
def fun2(x, y, z):
time.sleep(1)
print(x + y + z)
fun2(1,2,3)
#【运行结果】:
# 1
# 1.0034222602844238
# 6
# 1.0041251182556152
3.5 装饰器带参数
上面3.4是被装饰函数带有参数,我们在装饰器内部函数设置参数,以保证参数的正确传递。
现在装饰器要带有参数,而且装饰器的外部函数要接收被装饰函数的函数名,内部函数要接收被装饰函数的参数,那么为了保证装饰器参数、被装饰函数参数的正确传递,我们在装饰器外部函数再嵌套一层函数,用于接收装饰器参数。
# 装饰器
def decoration(dec_arg):
def out_fun(function):
def in_fun(x):
print(dec_arg)
print("挂上一颗星星")
function(x)
print("挂上一个礼物盒")
return in_fun
return out_fun
# 被装饰函数
@decoration("我是装饰器的参数")
def my_tree(x):
print(f"简简单单{x}棵树")
my_tree(3)
#【运行结果】:
# 我是装饰器的参数
# 挂上一颗星星
# 简简单单3棵树
# 挂上一个礼物盒
3.6 装饰器嵌套
装饰器嵌套就是 “被装饰函数” 可以被 多个装饰器 装饰。
# 装饰器1
def out_fun_1(function):
def in_fun_1(*args, **kwargs):
print("装饰器1开始调用")
function(*args, **kwargs)
print("装饰器1结束调用")
return in_fun_1
# 装饰器2
def out_fun_2(function):
def in_fun_2(*args, **kwargs):
print("装饰器2开始调用")
function(*args, **kwargs)
print("装饰器2结束调用")
return in_fun_2
# 嵌套装饰 被装饰函数
@out_fun_1
@out_fun_2
def my_tree(x):
print(f"{x}棵树")
my_tree(3)
#【运行结果】:
# 装饰器1开始调用
# 装饰器2开始调用
# 3棵树
# 装饰器2结束调用
# 装饰器1结束调用
3.7 类装饰器
除了可以自定义一个新的函数用作装饰器之外,也可以将一个类作为装饰器,为被装饰的函数添加新的功能。
类装饰器通过实现类的__call__方法,使得类的实例可以被当作函数来调用,丛而实现对其他函数的装饰。
3.8、装饰器的常见应用【了解即可】
记录日志
装饰器可以用来记录函数调用的详细信息,包括调用时间、参数、返回值等
import logging
def log_decorator(func):
def wrapper(*args, **kwargs):
logging.basicConfig(filename='./app.log', level=logging.INFO, filemode='a',
format='%(name)s - %(levelname)s - %(asctime)s - %(message)s')
logging.warning(f"calling function:{func.__name__} with args:{args} and "
f"kwargs:{kwargs}")
ret = func(*args, **kwargs)
logging.warning(f"function {func.__name__} returned: {ret}")
return ret
return wrapper
@log_decorator
def test():
print('123')
test() #结果123
原文地址:https://blog.csdn.net/weixin_56261190/article/details/143725689
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!