7.函数进阶

北城余情 提交于 2020-03-25 19:29:39

3 月,跳不动了?>>>

高阶函数

什么叫高阶函数 变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

举例
        变量指向函数
            f=abs
abs(-10)
f(-10)
        传入函数作为另一函数的参数
            def add(x,y,f):
    return f(x)+f(y)

内置高阶函数

1)lambda函数

定义:匿名函数,当需要一个函数,但是不需要这个函数的名字的时候,则可以通过lambda表达式来实现 通过lambda表达式,减少程序中的函数名字和代码量,实现更简洁的代码

语法

    lambda 参数:表达式
     lambda x, y: x + y

 lambda x, y: x + y
        等价于
            >>> def sum(x, y):
            ...     return x + y
            ...     
            >>> sum(1,2)
            3
    >>> a = lambda x, y: x + y
    >>> a(1, 2)
    3

2)map函数

定义:map函数接收两个参数,第一个是函数,第二个是列表(可迭代对象) 将函数作用在序列的每个元素上, 然后创建由每次函数应用组成的返回值列表 map函数能够用列表解析表达式来实现

语法

    map( 函数,列表)

举例

>>> map((lambda x: x*x), [1,2,3])
        >>> def f(x):
        ...     return x * x
        ...  
        >>> l = [1,2,3]
        >>> map(f,l)
        [1, 4, 9]
    [1, 4, 9]
        列表解析实现
            >>> [x * x for x in [1,2,3]]
            [1, 4, 9]

3)reduce和函数

定义:reduce跟map类似,也是接收函数和列表

区别:reduce将列表中两个元素放入函数计算并得到值,然后将此值与列表的下一个元素放入函数计算得到另外一个值 reduce这种“折叠”的处理方式,最终可以得到一个值 reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

语法:

reduce( 函数,列表)
        reduce每次从列表中取出2个元素放入函数
            reduce(func, [1, 2, 3])
                func(func(1, 2), 3)

举例:

1.序列求和的reduce实现
        >>> def add(x, y):
        ...     return x + y
        ...
        >>> reduce(add, [1, 3, 5, 7, 9])
            >>> reduce( , [1, 3, 5, 7, 9])
        25
    2.数字列表转换成数[1,3,5,7,9] ->13579
        >>> def fn(x, y):
        ...     return x * 10 + y
        ...
        >>> reduce(fn, [1, 3, 5, 7, 9])
        13579
    3.对2改进实现str转换成int
        >>> def fn(x, y):
        ...     return x * 10 + y
        ...
        >>> def char2num(s):
        ...     return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
        ...
        >>> reduce(fn, map(char2num, '13579'))
        13579
    4.最终整理成一个str2int函数
        def str2int(s):
            def fn(x, y):
                return x * 10 + y
            def char2num(s):
                return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
            return reduce(fn, map(char2num, s))
    5.用lambda简化
        def str2int(s):
            return reduce(lambda x,y: x*10+y, map(lambda s:{'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s], s))

4)filter函数

定义 filter函数是一个过滤函数,根据True或False来决定最终结果,如果是True则保留下来

语法:

    filter( 函数,列表)

举例

保留正数
        >>> def Pos(n):
        ...     return n > 0
        ...     
        >>> filter(Pos,[-1, 1, 0, -2, 3])
        [1, 3]
    去掉偶数
        >>> def odd(n):
        ...     return n % 2 == 1
        ...     
        >>> filter(odd,range(10))
        [1, 3, 5, 7, 9]

返回函数

定义 函数作为结果被输出 内置函数中如map函数,是将函数作为输入

举例

    >>> def sum2(x, y):
        ...     def sum1( ):
        ...         return x + y
        ...     return sum1
        ...     
        >>> s = sum2(1, 2)
        >>> s()
        3
        >>> s = sum2(1, 3)
        >>> s()
        4
    例2
        >>> def closure( ):
        ...     i = 10
        ...     def clo2( ):
        ...         return i * i
        ...     return clo2
        ...     
        >>> c = closure( )
        >>> c
        <function clo2 at 0x10bc166e0>
        >>> c( )
        100

闭包 定义 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。 举例

        >>> def sum2(x, y):
        ...     def sum1( ):
        ...         return x + y
        ...     return sum1
        ...     
        注:函数sum1调用函数sum2的变量x,y

装饰器(Decorator)

定义 装饰器(Decorator)采用函数作为参数,然后对此函数进行装饰,增强其功能 装饰器可以为函数增加功能,但是无需修改原有函数内部结构 装饰器是闭包的高阶应用,闭包是内部函数调用外部函数的变量,装饰器是调用函数

[ 场景]  

语法

定义装饰器
        def  deco(func):
             def wrapper( ):
            函数体包括func( )
            return wrapper
定义函数
        def func( ):
            函数体
装饰函数
        @deco
            带参数的装饰器
            不带参数的装饰器
        def  func( )
            函数体

举例

例1 不带参数的装饰器
        >>> def deco(func):
        ...     def wrapper():
        ...         print 'this is a decorator!'
        ...         return func()
        ...     return wrapper
        ...     
        >>> @deco
        ... def f1():
        ...     print 'this is a function!'
        ...     
        >>> f1()
        this is a decorator!
        this is a function!
        注明
            本质上看,上面的装饰器的作用相当于 f1= deco( f1 )
            f1函数作为deco函数的输入
    例2 带参数的装饰器
        >>> def deco(func):
        ...     def wrapper(n):
        ...         print 'this is a decorator!', n
        ...         return func(n)
        ...     return wrapper
        ...     
        >>> @deco
        ... def f1(n):
        ...     print 'this is a function!'
        ...     
        >>> f1('test')
        this is a decorator! test
        this is a function!
        >>> f1('test2')
        this is a decorator! test2
        this is a function

递归函数

定义:若函数内部调用自身,则这个函数便是递归函数

语法

    factorial(N) = N! = N * (N-1)! = N * (N-1) * (N-2)! : = N * (N-1) * (N-2) ... * 3 * 2 * 1
    为了获得 factorial(N)的值, 需要计算 factorial(N-1);为了找到 factorial(N-1), 需要计算 factorial(N-2)等……

举例

    计算阶乘n!
        >>> def fact(n):
        ...     if n == 1:
        ...         return 1
        ...     else:
        ...     return n * fact(n - 1)
        ...     
        >>> fact(5)
        120

生成器

定义 在 Python 中,带有 yield 的函数被称之为 generator(生成器) 生成器是特定的函数, 允许返回一个值, 然后"暂停"代码的执行, 稍后恢复 使用yield语句一次返回一个结果,在每个结果之间挂起和继续它们的状态 通过生成器,可以节省内存空间,使得函数结果散落在不同时间的请求上

语法

yield vs return
        return返回结果并结束函数
        yield返回结果并挂起当前状态,并于下次再次执行

举例

例1
        编写生成器函数
            >>> def num( ):
            ...     print 'first'
            ...     yield 1
            ...     print 'second'
            ...     yield 2
            ...     print 'Third'
            ...     yield 3
            ...     print 'Over'
            ...     
        生成生成器对象
            >>> n = num()
        通过next()函数调用
            >>> next(n)
            first
            1
            >>> next(n)
            second
            2
            >>> next(n)
            Third
            3
            >>> next(n)
            Traceback (most recent call last):
              File "<input>", line 1, in <module>
            StopIteration
            Over
    例2
        >>> def squars(N):
        ...     for i in range(N):
        ...         yield i ** 2
        ...    
        >>> s = squars(5)
        >>> s.next()
        0
        >>> s.next()
        1
        >>> s.next()
        4
        >>> s.next()
        9
        >>> s.next()
        16
        >>> s.next()
        Traceback (most recent call last):
          File "<input>", line 1, in <module>
        StopIteration
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!