• 一文读懂Python 高阶函数


    高阶函数

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

    1 def fun0(x,y,fun):
    2     return fun(x)*fun(y)
    3 print(fun0(-9,-10,abs))

    1. 高阶函数之map

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

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

    2. 高阶函数之匿名函数

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

    1 f=lambda x,y:x+y
    2 print(f(10,20))
    3
    4 #不需要显式地定义函数,直接传入匿名函数更方便
    5 print(list(map(lambda x:x*x*x,list1)))

    3. 高阶函数之reduce

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

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

    4. 高阶函数之filter

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

     1 def fun2(x):
     2    return x%2==0
     3 list2=[1,2,3,4,5,6,7,8,9]
     4 print(list(filter(fun2,list2)))
     5
     6 print(list(filter(fun2, range(1, 101))))#输出1到100的偶数
     7 print(list(filter(lambda x:x%2==0,list2)))#利用lambda来实现
     8
     9 #获取非空字符串函数
    10 def fun3():
    11    list1 = ["tony", "is", "good", "man", " ", "hello", "      "]
    12    for el in list1:
    13        if(el and el.strip()):
    14            print(el)
    15 fun3()
    16
    17 #使用filter实现fun3的功能
    18 def is_not_null(str1):
    19    return str1 and str1.strip()
    20 list3=["tony","is","good","man"," ","hello","      "]
    21 print(list(filter(is_not_null,list3)))

    5. 高阶函数之装饰器

     1 import time
     2 def 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
    13 def abc():
    14    print("aaa")
    15 abc()
    16
    17 def 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
    25 def abd():
    26    print("bbb")
    27 abd()

    6. 高阶函数之 retrun function(返回函数)

     1 @waste_time
     2 def 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
    11 print(get_dict(name='tony',age=33))
    12 f=get_dict(name='tony',age=33)
    13 print(f())
    14 print(get_dict(name='tony',age=33)())

    7. 高阶函数之sorted排序函数

     1 num_list=[34,55,2,3,444,500]
     2 print(sorted(num_list)) #默认升序
     3 print(sorted(num_list,reverse=True)) #reverse=True表示降序
     4
     5 #对字符串ASCII A=65 a=97进行排序
     6 str_list=['ac','aa','AB','d','c']
     7 print(sorted(str_list))
     8 print(sorted(str_list,reverse=True))
     9
    10 #用key来接收指定函数来进行自定义排序
    11 str_list=['ac','aa','AB','d','c']
    12 print(sorted(str_list,key=str.lower)) #不考虑大小写
    13
    14 num_list=[34,55,2,3,444,500,-599,-222]
    15 print(sorted(num_list,key=abs)) #用绝对值进行排序
    16
    17 class Tester:
    18    def __init__(self,age,name):
    19        self.age=age
    20        self.name=name
    21
    22 t1=Tester(10,'tony')
    23 t2=Tester(20,'jack')
    24 t3=Tester(30,'tom')
    25
    26 result=list(sorted([t1,t2,t3],key=lambda x:x.age)) #针对对象实例进行排序,指定了年龄
    27 for test in result:
    28    print(test.name,test.age)

    8. 高阶函数之闭包

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

    • 函数要嵌套(有内外部函数)

    • 内部函数使用外部函数的变量

    • 外部函数返回内部函数的名称

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

    • global可以改变全局变量,同时可以定义新的全局变量;

    • nonlocal只能改变外层函数变量,不能定义新的外层函数变量,并且nonlocal也不能改变全局变量。

    • global关键字可以用在任何地方,包括最上层函数中和嵌套函数中;

    • nonlocal关键字只能用于嵌套函数中,并且外层函数中必须定义了相应的局部变量,否则会发生错误。

    简单的使用如下:

     1 def outFun(arg1):
     2    def inFun(arg2):
     3        nonlocal arg1#nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。
     4        arg1+=200
     5        return arg1*arg2
     6    return inFun
     7 infun=outFun(100)#调用外部函数,传入参数,返回是内部函数
     8 result=infun(300)#调用内部函数,传入参数
     9 print("the result is:",result)
    10
    11 #使用闭包求给function计算耗时(上面的内容已经提到)代码如下:
    12 import time
    13 def 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: 需要被固定的关键字参数

     1 def 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 #普通调用
     9 add(1, 2, 3, v1=10, v2=20)
    10
    11 #偏函数调用
    12 from functools import partial
    13 add_fun=partial(add,100,k1=200,k2=300)
    14 add_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. 高阶函数之偏函数

    欢迎关注【无量测试之道】公众号,回复【领取资源】,
    Python编程学习资源干货、
    Python+Appium框架APP的UI自动化、
    Python+Selenium框架Web的UI自动化、
    Python+Unittest框架API自动化、

    资源和代码 免费送啦~
    文章下方有公众号二维码,可直接微信扫一扫关注即可。

    备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:

     添加关注,让我们一起共同成长!

  • 相关阅读:
    Java实现币值最大化问题
    Java实现币值最大化问题
    Java实现币值最大化问题
    Java实现币值最大化问题
    ddd
    雷军:小米最坏的时候已过去 2017目标营收千亿(确实有些新意)
    真正的转变从不确定中来
    很多人知道自己的斤两,他之所以抱怨工资低,不是觉得薪水和自己的能力不匹配,而是因为工资确实不够用(笑死了)
    CodeSmith
    sb2-admin
  • 原文地址:https://www.cnblogs.com/Wu13241454771/p/13816792.html
Copyright © 2020-2023  润新知