Python学习——高阶函数/函数装饰器

本文介绍了Python中的高阶函数,如map()、filter()和sorted(),以及函数装饰器的原理和应用实例,展示了如何通过这些工具增强函数功能和处理数据。
摘要由CSDN通过智能技术生成

1、定义

参数为函数对象或返回函数对象的函数,称之为高阶函数,即函数的函数,如:

#示例1
def compute(f,s): #f是函数对象,s是系列对象
    return f(s)

compute(min,(1,2,3,4)) #输出1

#示例2
def myfunc_out(n1): #外函数
    def myfunc_in(n2): #内函数
        print(n1+n2) #内函数的部分参数来自于外函数
    return myfunc_in #返回内函数对象

f=myfunc_out(5) #调用外函数并赋值n1=5,f是内函数对象
f(3)
#输出8

2、常见的(内置)高阶函数

(1)map()

        map(f,iterable,...)将函数f用于可迭代对象,返回结果为可迭代map对象,而不是立即计算结果,将其转换为列表或for循环迭代它来访问计算后的值。

#示例1
def is_odd(x):
    return x % 2 ==1
list(map(is_odd,range(5)))
#输出[False, True, False, True, False] 判断是否是奇数


#示例2
list(map(abs,range(5)))
#输出[0, 1, 2, 3, 4]

 (2)filter()

        filter(f,iterable)将函数f应用于每一个元素,根据返回值是True或False决定保留或丢弃该元素,返回结果是filter对象。

#示例1 同上
list(filter(is_odd,range(5)))
[1, 3] #返回奇数元素

#示例2 定义is_palindrome判断一个数字是否是回文数即121、232、454等
def is_palindrome(x):
    if str(x) == str(x)[::-1]:
        return x
list(filter(is_palindrome,range(100,200)))
#输出100-200的回文数[101, 111, 121, 131, 141, 151, 161, 171, 181, 191]

注: 字符串的切片操作s[start:stop:step]

#字符串的切片操作s[start:stop:step]
    
s = 'Hello, World!'

print(s[7:12]) #从第7位到第12位的所有字符
World

print(s[1:10:2]) #从第1位到第10位每间隔2位取一次数
el,Wr

print(s[:5]) #省略起始位,取前5位字符
Hello

print(s[5:]) #从第5位开始取到末尾
, World!

print(s[::-1]) #字符串反转
!dlroW ,olleH

(3)sorted()

        对可迭代对象排序并返回结果列表,排序依据可以是函数对象。默认升序,使用reverse=True实现倒序排列。

sorted([4,3,6,-8,9],key=abs) #按照绝对值升序排序
#[3, 4, 6, -8, 9]

sorted([4,3,6,-8,9],key=abs,reverse=True) #按照绝对值倒序
#[9, -8, 6, 4, 3]

sorted(["Dog","cat","rabbit"],key=str.lower) #不区分大小写按照首字母升序
#['cat', 'Dog', 'rabbit']

sorted(["Dog","cat","rabbit"],key=len) #按照字符串长度排序
#['Dog', 'cat', 'rabbit']

3、函数装饰器

        装饰器实质上是一个高阶函数,作用是为已经存在的函数添加额外的功能。装饰器主要有三个特点:

  • 本质上是一个嵌套函数;
  • 内部函数的参数是外部函数的参数;
  • 外部函数的返回内部函数对象

       通俗理解,装饰器的外函数通常接受被装饰的函数作为参数,而内部的嵌套函数则是用来实际执行装饰操作的部分,也可以说是装饰器的“装饰”部分。

例1、timeit函数装饰器用来计算某个函数程序执行的时间

import time
def timeit(func):  #定义函数装饰器,参数是my_func
    def wrapper(*s): #装饰器的嵌套内函数,执行装饰操作
        start=time.perf_counter()
        func(*s)
        end=time.perf_counter()
        print('运行时间:',end-start)
    return wrapper

@timeit #对my_sum函数使用函数装饰器
def my_sum(n): #被装饰的函数
    sum = 0
    for i in range(n):
        sum += i
    print(sum)

if __name__=='__main__':
    my_sum(50)

 例2、在html中斜体加粗显示字符

def makebold(fn):
    def wrapper(*s):
        return "<b>"+fn(*s)+"</b>"
    return wrapper

def makeitalic(fn):
    def wrapper(*s):
        return "<i>"+fn(*s)+"</i>"
    return wrapper

@makebold
@makeitalic
def func(s):
    return s

#测试
if __name__=='__main__':
    result=func("xiaoyankaixin")
    print(result)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值