前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一文读懂Python 高阶函数

一文读懂Python 高阶函数

作者头像
Wu_Candy
发布2022-07-04 19:55:03
2570
发布2022-07-04 19:55:03
举报
文章被收录于专栏:无量测试之道
作者 | 无量测试之道 编辑 | 小 晴
高阶函数

将函数作为参数传入,这样的函数称为高阶函数。函数式编程就是指这种高度抽象的编程范式。 变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。如下所示:

代码语言:javascript
复制
1def fun0(x,y,fun):
2    return fun(x)*fun(y)
3print(fun0(-9,-10,abs))
1. 高阶函数之map

map(fun, lst),将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表返回。

代码语言:javascript
复制
 1list1=[0,1,2,3,4,5,6,7,8,9]
 2
 3list_result=[]
 4for i in list1:
 5    list_result.append(i*i*i)
 6print(list_result)
 7
 8def cube(x):#求立方
 9    return x*x*x
10print(list(map(cube,list1)))
11
12
13list2=[10,11,12,13,14,15,16,17,18,19]
14def multi(x,y):
15    return x*y
16
17#map接收两个list,可用于两个列表的对应索引数据进行操作
18print(list(map(multi,list1,list2)))
2. 高阶函数之匿名函数

定义一个匿名函数并调用,定义格式如-->lambda arg1,arg2…:表达式

代码语言:javascript
复制
1f=lambda x,y:x+y
2print(f(10,20))
3
4#不需要显式地定义函数,直接传入匿名函数更方便
5print(list(map(lambda x:x*x*x,list1)))
3. 高阶函数之reduce

reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。

代码语言:javascript
复制
1from functools import reduce
2list1=[1,3,5,7,9] #如何让列表里面的值变成一个数字13579输出
3def fun(x,y):
4    return x*10+y
5print(reduce(fun,list1))
6print(reduce(lambda x,y:x*10+y,list1))#利用lambda来实现
7
8print(reduce(lambda x,y:x+y,range(1,101)))#从1+2+...+99+100的总和
4. 高阶函数之filter

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

代码语言:javascript
复制
 1def fun2(x):
 2    return x%2==0
 3list2=[1,2,3,4,5,6,7,8,9]
 4print(list(filter(fun2,list2)))
 5
 6print(list(filter(fun2, range(1, 101))))#输出1到100的偶数
 7print(list(filter(lambda x:x%2==0,list2)))#利用lambda来实现
 8
 9#获取非空字符串函数
10def fun3():
11    list1 = ["tony", "is", "good", "man", " ", "hello", "      "]
12    for el in list1:
13        if(el and el.strip()):
14            print(el)
15fun3()
16
17#使用filter实现fun3的功能
18def is_not_null(str1):
19    return str1 and str1.strip()
20list3=["tony","is","good","man"," ","hello","      "]
21print(list(filter(is_not_null,list3)))
5. 高阶函数之装饰器
代码语言:javascript
复制
 1import time
 2def waste_time(func): #用于计算函数执行的耗时
 3    def function(*args,**kwargs):
 4        start_time=time.time()
 5        result=func(*args,**kwargs)
 6        end_time=time.time()
 7        spend=end_time-start_time
 8        print("函数%s 总共耗时%.3f秒:"%(func.__name__,spend))
 9        return result
10    return function
11
12@waste_time
13def abc():
14    print("aaa")
15abc()
16
17def get_log(func): #能装饰的方法添加日志输出
18    import time
19    def wrapper(*args, **kw):
20        print(str(time.asctime())+'  call %s():' % func.__name__)
21        return func(*args, **kw)
22    return wrapper
23
24@get_log
25def abd():
26    print("bbb")
27abd()
6. 高阶函数之 retrun function(返回函数)
代码语言:javascript
复制
 1@waste_time
 2def get_dict(**kwargs):
 3    def getjson():
 4        jsons=""
 5        for key,value in kwargs.items():
 6            jsons+=key+"="+str(value)+"&"
 7        return jsons
 8    return getjson
 9
10
11print(get_dict(name='tony',age=33))
12f=get_dict(name='tony',age=33)
13print(f())
14print(get_dict(name='tony',age=33)())
7. 高阶函数之sorted排序函数
代码语言:javascript
复制
 1num_list=[34,55,2,3,444,500]
 2print(sorted(num_list)) #默认升序
 3print(sorted(num_list,reverse=True)) #reverse=True表示降序
 4
 5#对字符串ASCII A=65 a=97进行排序
 6str_list=['ac','aa','AB','d','c']
 7print(sorted(str_list))
 8print(sorted(str_list,reverse=True))
 9
10#用key来接收指定函数来进行自定义排序
11str_list=['ac','aa','AB','d','c']
12print(sorted(str_list,key=str.lower)) #不考虑大小写
13
14num_list=[34,55,2,3,444,500,-599,-222]
15print(sorted(num_list,key=abs)) #用绝对值进行排序
16
17class Tester:
18    def __init__(self,age,name):
19        self.age=age
20        self.name=name
21
22t1=Tester(10,'tony')
23t2=Tester(20,'jack')
24t3=Tester(30,'tom')
25
26result=list(sorted([t1,t2,t3],key=lambda x:x.age)) #针对对象实例进行排序,指定了年龄
27for test in result:
28    print(test.name,test.age)
8. 高阶函数之闭包

闭包的定义?闭包本质上就是一个函数 如何创建闭包?

  • 函数要嵌套(有内外部函数)
  • 内部函数使用外部函数的变量
  • 外部函数返回内部函数的名称

如何使用闭包?典型的使用场景是装饰器的使用。 global与nonlocal的区别:

  • global可以改变全局变量,同时可以定义新的全局变量;
  • nonlocal只能改变外层函数变量,不能定义新的外层函数变量,并且nonlocal也不能改变全局变量。
  • global关键字可以用在任何地方,包括最上层函数中和嵌套函数中;
  • nonlocal关键字只能用于嵌套函数中,并且外层函数中必须定义了相应的局部变量,否则会发生错误。

简单的使用如下:

代码语言:javascript
复制
 1def outFun(arg1):
 2    def inFun(arg2):
 3        nonlocal arg1#nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。
 4        arg1+=200
 5        return arg1*arg2
 6    return inFun
 7infun=outFun(100)#调用外部函数,传入参数,返回是内部函数
 8result=infun(300)#调用内部函数,传入参数
 9print("the result is:",result)
10
11#使用闭包求给function计算耗时(上面的内容已经提到)代码如下:
12import time
13def waste_time(func): #用于计算函数执行的耗时
14    def function(*args,**kwargs):
15        start_time=time.time()
16        result=func(*args,**kwargs)
17        end_time=time.time()
18        spend=end_time-start_time
19        print("函数%s 总共耗时%.3f秒:"%(func.__name__,spend))
20        return result
21    return function
9. 高阶函数之偏函数

偏函数主要辅助原函数,作用其实和原函数差不多,不同的是,我们要多次调用原函数的时候,有些参数,我们需要多次手动的去提供值。 而偏函数便可简化这些操作,减少函数调用,主要是将一个或多个参数预先赋值,以便函数能用更少的参数进行调用。

我们再来看一下偏函数的定义: 类func = functools.partial(func, *args, **keywords) 我们可以看到,partial 一定接受三个参数,从之前的例子,我们也能大概知道这三个参数的作用。简单介绍下:

  • func: 需要被扩展的函数,返回的函数其实是一个类 func 的函数
  • *args: 需要被固定的位置参数
  • **kwargs: 需要被固定的关键字参数
代码语言:javascript
复制
 1def add(*args, **kwargs):
 2    for n in args:# 打印位置参数
 3        print(n)
 4    print("-"*20)
 5    for k, v in kwargs.items():# 打印关键字参数
 6       print('%s:%s' % (k, v))
 7
 8#普通调用
 9add(1, 2, 3, v1=10, v2=20)
10
11#偏函数调用
12from functools import partial
13add_fun=partial(add,100,k1=200,k2=300)
14add_fun(1, 2, 3, v1=10, v2=20)

总结 本文是对Python 高阶函数相关知识的分享,主题内容总结如下:

  1. 初识高阶函数
  2. 高阶函数之map
  3. 高阶函数之匿名函数
  4. 高阶函数之reduce
  5. 高阶函数之filter
  6. 高阶函数之装饰器
  7. 高阶函数之 retrun function(返回函数)
  8. 高阶函数之sorted排序函数
  9. 高阶函数之闭包
  10. 高阶函数之偏函数
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 无量测试之道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 作者 | 无量测试之道 编辑 | 小 晴
  • 高阶函数
  • 1. 高阶函数之map
  • 2. 高阶函数之匿名函数
  • 3. 高阶函数之reduce
  • 4. 高阶函数之filter
  • 5. 高阶函数之装饰器
  • 6. 高阶函数之 retrun function(返回函数)
  • 7. 高阶函数之sorted排序函数
  • 8. 高阶函数之闭包
  • 9. 高阶函数之偏函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档