• Python学习week6-高阶函数与柯里化


    1、高阶函数

    1.1、Fist Class Object

    • 函数在python中是一等公民;
    • 函数也是对象,可调用对象;
    • 函数可以作为普通变量,参数,返回值等等;

    1.2、什么是高阶函数?

    # 高阶函数至少满足下面二个条件中的一个:

    ①:接收一个或者多个函数作为参数;

    ②:返回为一个函数;

    def counter(base):
        def warpper(sep=1):
            nonlocal base
            base+=sep
            return base
        return warpper
    
    f1=counter(5)
    f2=counter(5)
    
    print(f1==f2)   # Fasle
    print(f1 is f2) # Fasle
    '''
    分析:
    '=='一般比较的是值,'is'比较的是对象;
    由于这里f1与f2是经过2次函数调用所产生的对象,所以f1 is f2 返回Fasle能理解
    而f1 == f2 看似返回的值是一样的,但仔细分析,f1与f2得到的值内存地址,是不同的地址
    f1调用时创建一个warpper对象,调用结束后返回warpper对象地址给f1
    f2调用的时候会再次创建一个warpper对象(前一个warpper对象在f1调用完成后已经弹栈,所以再次调用会产生新的对象),调用结束后返回warpper
    地址给f2,所以f1 得到的是完全与f2不同的值;
    '''
    print(f1,'f1-id:',id(f1),'
    ',f2,'f2-id:',id(f2))
    '''
    运行结果:
    <function counter.<locals>.warpper at 0x00000289B3D19D08> f1-id: 2790450633992 
    <function counter.<locals>.warpper at 0x00000289B3D19B70> f2-id: 2790450633584
    '''

    2、自定义sort函数

    # 自定义实现sort

    ### 版本一
    def my_sort(iter,revers=False,key=lambda a,b:a>b):
        ret=[]
        # def compare(a, b):
        #     return a > b
        for x in iter:
            for i,y in enumerate(ret):
                flag= key(x,y) if revers else  not key(x,y)
                if flag:
                    ret.insert(i,x)
                    break
            else:
                ret.append(x)
        return ret
    print(my_sort('2456713',revers=True))
    
    ####版本二
    def my_sort(iter,revers=False,key=int): # sorted内部的key就是做的类型转换;
        ret=[]
        # def compare(a, b):
        #     return a > b
        for x in iter:
            for i,y in enumerate(ret):
                flag= key(x)>key(y) if revers else  key(x)>key(y)
                if flag:
                    ret.insert(i,x)
                    break
            else:
                ret.append(x)
        return ret
    print(my_sort('2456713',revers=True))
    
    # 版本三:
    def my_sort(iter,revers=False,key=lambda a,b:a>b):
        ret=[]
        # def compare(a, b):
        #     return a > b
        for x in iter:
            for i,y in enumerate(ret):
                # flag= key(x)>key(y) if revers else  key(x)>key(y)
                if key(x,y):
                    ret.insert(i,x)
                    break
            else:
                ret.append(x)
        return ret
    print(my_sort('2456713',revers=True))

    3、内建函数与高阶函数

    3.1、sorted

    # 语法:sorted(iterable,[,key],[,reverse])

    # 作用:排序

    # 返回一个新的列表,对一个可迭代对象的所有元素排序,排序规则为key定义的函数,revers表示排序是否反转(即可定义升序或者降序)

    3.2、filter

    # 语法:filter(function,iterable)

    # 作用:过滤可迭代对象的元素, 返回一个迭代器;

    # function是一个具有一个参数的函数,返回为bool;

    '''
    过滤rang(10)里面不能被3整除的的数;
    '''
    g=filter(lambda x:x%3==0,range(10))
    print(list(g))
    '''
    运行结果:[0, 3, 6, 9]
    '''

    3.3、map

    # 语法:map(function,*iterables)  ==>map object

    # 对多个可迭代对象的元素按照指定函数进行映射,返回一个迭代器;

    def foo(x):
        return x%5,x
    
    # for i in range(500):
    #     res=foo(i)
    #     print(res)
    
    d=dict(map(lambda x:(x%5,x),range(500)))
    print(d) # {0: 495, 1: 496, 2: 497, 3: 498, 4: 499}
    
    l=map(lambda x:divmod(x,2),range(10))
    print(list(l)) # [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1), (4, 0), (4, 1)]
    
    l=map(lambda x,y:(x*100,y*100),range(1,4),range(10,40))
    
    print(list(l)) # [(100, 1000), (200, 1100), (300, 1200)]

    4、柯里化

    4.1、什么是柯里化?

    # 指的是将原来接收2个参数的函数变成新的接收一个参数的函数的过程;新的函数返回一个以原有第二个参数作为参数的函数;

    # 例如:将加法函数柯里化过程

    def add1(x,y):
        return x + y
    
    # 柯里化
    def add2(x): # 通过嵌套函数就可以把函数转换成柯里化函数
        def _add(y):
            return x + y
        return _add
    
    print(add1(1,2)) # 3
    
    # 柯里化后调用
    print(add2(1)(2)) # 3 
  • 相关阅读:
    被@ResponseBoby注释的方法在拦截器的posthandle方法中设置cookie失效的问题
    python之异常处理
    python之url编码
    python之发送邮件
    python之使用request模块发送post和get请求
    python之小技巧积累
    python之sys.argv[]
    python之MD5加密
    python之os、sys和random模块
    python之time和datetime的常用方法
  • 原文地址:https://www.cnblogs.com/soulgou123/p/9608749.html
Copyright © 2020-2023  润新知