python中 高阶函数、装饰器的用法

本文探讨了Python编程中的高阶函数概念,详细解释了函数作为变量的特性,并深入介绍了高阶函数的应用。随后,文章转向装饰器,阐述了装饰器的作用,以及装饰器如何增强和修改函数功能,为Python开发提供了实用技巧。
摘要由CSDN通过智能技术生成

高阶函数

1.函数就是变量(**)

"""
python中定义函数其实就是定义一个类型是function的变量,函数名就是变量名
"""
def func1():
    print('函数1')

#  1.查看变量的类型
a = 10
print(type(a))    # <class 'int'>
print(type(func1))   # <class 'function'>
 
#  2.用一个变量给另一个变量赋值    
b = a
print(b+20)
c = func1
c()
# 3.查看变量的地址
print(id(a))
print(id(func1))
# 4.修改变量的值
a = 100
func1 = 'abc'
# 5.变量可以作为序列的元素
a = 200
list1 = [a,10,20,30,func1,func1()]
print(list1)
print(list1[-2]())

2.高阶函数

"""
1.实参高阶函数:参数是函数的函数就是实参高阶函数
"""

# a.变量可以作为函数的参数(实参)
def func2(x):
    print(x)
    
    
m = 12.5
func2(10)
func2(m)

# b.实参高阶函数
def func3(x):
    print(x(1,2))


func3(lambda m,n: m+n)

# c.系统提供的常见的实参高阶函数
"""
max、min、sorted都素hi实参高阶函数,有一个参数key需要传一个函数;被传入的函数需一个参数和一个返回值,这个参数指向的是序列中的呀u苏,返回值是比较对象
"""

list2 = [19,90,78,67]

def func3(item):
    # 个位数最大的元素
    # return items%10
    # 各位数的和的最大值
    sum1 = 0
    for x in str(item):
        sum1 += int(x)
    return sum1

print(max(list2,key=func3))

# 示例二:求列表中个位数最大的元素
print(max(list2,key=lambda  item:item % 10))


# 练习1:用max函数获取学生列表中成绩最高的学生
students = [
    {'name': '张三', 'age': 18, 'score': 89},
    {'name': '小明', 'age': 29, 'score': 60},
    {'name': '李四', 'age': 25, 'score': 90},
    {'name': 'Tom', 'age': 19, 'score': 87}
]

# 获取成绩最高的学生
best_stu = max(students, key=lambda item:item['score'])
print(best_stu)

# 获取年龄最小的学生
min_stu = min(students, key=lambda item:item['age'])
print(min_stu)

# 将学生列表按照年龄值从小到大排序
new_students = sorted(students, key=lambda item:item['age'])
print(new_students)


"""
b、
map函数
map(函数,序列)   - 将序列中所有的元素按照函数指定的规则进行转换,返回的是map的对象(map就是容器型数据类型中的一种)。
				   函数需要一个参数和一个返回值,参数指向的是序列中的元素,返回值就是用来替换原来元素的
 新元素
"""
# 示例1:将列表list3中所有的元素都加1 -> [11,21,31,41]
new_list3 = map(lambda item:item+1,list3)
print(new_list3, list(new_list3))

# 示例2:将列表list3中的所有的元素都转换成对应的字符串:['10','20','30','40']
new_list3 = map(str,list3)
print(list(new_list3))

"""
c,
reduce(函数,序列) = 对序列中的元素按照函数提供的功能进行累积的操作
				    函数需要两个参数,第一个参数是初始化或者上传
reduce(函数,序列,0)
"""
from functools import reduce
list3 = ['10','20','30','40']

# 示例1:将列表list3中所有的元素都加1 -> [11,21,31,41]
new_list3 = map(lambda item:item+1,list3)
print(new_list3, list(new_list3))

# 示例2:将列表list3中的所有的元素都转换成对应的字符串:['10','20','30','40']
new_list3 = map(str,list3)
print(list(new_list3))


from functools import reduce
list3 = ['10','20','30','40']

# 示例一: 求所有元素的和
result = reduce(lambda x,y:x+y,list3)
print(result)

# 示例二:求所有元素的积
result = reduce(lambda x,y:x*y,list3)
print(result)

# 示例三:求整个班级所有学生的总成绩
students = [
    {'name': '张三', 'age': 18, 'score': 89},
    {'name': '小明', 'age': 29, 'score': 60},
    {'name': '李四', 'age': 25, 'score': 90},
    {'name': 'Tom', 'age': 19, 'score': 87}
]
result = reduce(lambda x, y: x + y['score'], students, 0)
print(result)


# reduce原码(粗糙的!)
def yt_reduce(func, seq, inter=None):
    if inter is None:
        x = seq.pop(0)
    else:
        x = inter

    for item in seq:
        x = func(x, item)

    return x


result = yt_reduce(lambda x, y: x+y['score'], students, 0)
print(result)


"""
2.返回值高阶函数:返回值是函数的函数
"""

# func1是返回值高阶函数
def func1():
    def func2(x,y):
        return x + y
    return func2()

print(func1()(100,200))  # func2(100, 200)

装饰器

1.装饰器的作用

"""
在不修改函数的情况下给函数添加新的功能

"""

2.什么是装饰器

"""
装饰器的本质就是一个函数(这个函数是一个实参高阶函数也是返回值高阶函数)

无参装饰器的写法:
def 函数名1(函数名2):
	def 函数名3(*agrs, **kwarges):
		新功能代码
		 返回值 = 函数名2(*agrs, **kwarges):
		 return 返回值
	return 函数名3

说明:
函数名1 - 装饰器名字,命名的时候和这个装饰器要添加的功能进行关联
函数名2 - 随便命名,指向被添加功能的函数;可以命名成 
函数名3 - 随便命名,在原函数上添加完新的功能以后产生的新的函数
新功能代码 - 实现新加的功能的代码
"""
# 写一个装饰器,在函数开始执行前打印'函数开始'
def start_function(fn):
    def new_fn(*args, **kwargs):
        print('函数开始')
        result = fn(*args, **kwargs)
        return result
    return new_fn


@start_function
def yt_sum(num1, num2):
    print(num1 + num2)


@start_function
def print_star(n):
    print('*'*n)


@start_function
def factorial(n):
    sum1 = 1
    for x in range(1, n+1):
        sum1 *= x
    return sum1

yt_sum(10, 20)
print_star(8)

yt_sum(100, 200)

print(factorial(5))

"""
函数开始
30

函数开始
********
"""

# 练习1:写一个装饰器将返回值是字符串的函数,返回值中所有的小写字母变成大写字母
def yt_upper(fn):
    # fn = str_func
    def new_fn(*args, **kwargs):
        result = fn(*args, **kwargs)
        if type(result) == str:
            return result.upper()
            # new_result = ''
            # for x in result:
            #     if 'a' <= x <= 'x':
            #         new_result += chr(ord(x)-32)
            #     else:
            #         new_result += x
            # return new_result
        else:
            return result
    return new_fn


@yt_upper
def str_func():
    return 'abc'


"""
装饰器的本质:

@yt_upper
def str_func():
    return 'abc'
    
相当于:

def str_func():
    return 'abc'
str_func = yt_upper(str_func)     #   str_func = new_fn
"""


# @yt_upper
# def num_func():
#     return 100



print(str_func())


# print(num_func())
print('===================================')
# 补充:定义函数的时候:*args,**kwarg同时存在的意义 - 不定长参数的函数在调用的时候既可以使用位置参数也可以使用关键字参数
def func1(*args,**kwargs):
    pass

func1(20,90,90)
func1(a=20,b=9)
func1(1,3,4,a=3,b=5,c=90)

def func3(x,y,z):
    print(f'x:{x},y:{y},z:{z}')

def func2(fn,*args,**kwargs):
    # args = (10,20,30)
    # kwargs = {}
    func3(*args, **kwargs)  # func3(10,20,30)


func2(10,20,30)
func3(x=20,y=90,z=300)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值