Python基础——4高阶函数

发布时间:2019-03-08 20:44:48编辑:auto阅读(1910)

    高阶函数

    函数本身可用变量指向,把变量当做函数参数的函数成为高阶函数

    map and reduce

    map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

    举例说明,比如我们有一个函数f(x)=x2,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()实现如下:

    >>> def f(x):
    ...     return x * x
    ...
    >>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> list(r)
    

    [1, 4, 9, 16, 25, 36, 49, 64, 81]

    map()传入的第一个参数是f,即函数对象本身。由于结果r是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。

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

    reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

    比方说对一个序列求和,就可以用reduce实现:

    >>> from functools import reduce
    >>> def add(x, y):
    ...     return x + y
    ...
    >>> reduce(add, [1, 3, 5, 7, 9])
    

    25

    filter

    根据函数的返回结果True or False对list等进行筛选,结果是一个Iterator

    例:选出偶素

    def odd()
        n = 1
        yield n
        n = n + 1
    def chu()
        return lambda x : x%2 > 0  # lambda关键字,匿名函数
    def oushu()
        n = odd()
        while True:
        t = next(n)
        output = filter(chu,n)
    print(list(output))
    

    sorted

    排序函数

     L=[15,-5,6,-89,100]

     sorted(L)

     [-89,-5,6,15,100]

     sorted(L,key=abs)

     [-5,6,15,-89,100]

    sorted(L,key=abs, reverse = True)

    [100,-89,15,6,-5]

    字符串排序是根据ASCLL码大小排序

    返回函数

    return 返回一个函数值

    当把函数计算结果不是立即返回,在调用的时候返回,可用到返回函数。

    返回函数里边不要有循环变量

    例子:

    def count():
        fs = []
        for i in range(1, 4):
            def f():
                 return i*i
            fs.append(f)
        return fs
    
    f1, f2, f3 = count()
    >>> f1()
    9
    >>> f2()
    9
    >>> f3()
    9
    

    如果用到循环变量,就把变量当做参数传进去:

    def count():
        def f(j):
            def g():
                return j*j
            return g
        fs = []
        for i in range(1, 4):
            fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
        return fs
    

    计数器函数:

    def createCounter :
        a = 0
        def counter:
            nonlocal a    #nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。
            a = a + 1
            return a
        return counter
    

    匿名函数

    可以当做函数返回,可以用变量指向函数

    f = lambda x: x*x
    def lambda(x):
       return x*x
    

    装饰器(修饰函数)

    修饰函数可以看做是返回函数的一种,目的是在函数的执行前或函数执行后先进行相关的处理操作(函数运行期间动态添加功能的成为装饰器),添加在定义函数的前面,实现装饰作用。

    例如:

    计算函数的执行时间

    import time funtools
    def log(text)
    def decorator(fnc):
        @functools.wraps(fnc)
            def wrapper(*args,**kw):
               start  = time.time()
                func = fnc(*args,**kw)
                end = time.time()
                print(%s : %s excuted in %s ms %(text,func_name_,(start - end)*1000))
                return func
            return wrapper
        return decorator
    

    偏函数

    固定住某些函数的参数,使函数调用更加方便

    例子:

    import functools
    int 2 = functools.partial(int,base = 2)
    max 2 = functools.partial(max,10)
    max 2(5,6,7) = 10
    

     

关键字