zoukankan      html  css  js  c++  java
  • python 函数式编程

    1高阶函数

    1.1 变量可以指向函数,可以把一个函数赋值给变量
    如下代码
    >>> f = abs
    >>> f(10)
    10
    1.2 变量可以指向函数,函数的形参也能够接收函数,这就是高阶函数
    >>> def add(x, y, f):
    ...     return f(x) + f(y)
    ...
    >>> add(-5, -5, abs)
    10
    2 map
    map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
    实例代码如下:
    >>> def f(x):
    ...     return x*x
    ...
    >>> map(f, [1, 2, 3, 4])
    [1, 4, 9, 16]
    >>>
    装换为字符
    >>> map(str, [1, 2, 3])
    ['1', '2', '3']
    2.1 reduce
    reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累加计算,reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
    如下实例将12345序列装换为12345数字
     
    >>> def fn(x, y):
    ...     return x * 10 + y
    ...
    >>> reduce(fn,  [1, 2, 3, 4, 5])
    12345
    3 filter
    和map不同的是,filter调用的函数返回true才会保留,否则删除。如下示例可以删除一个list中的空格
    >>> def not_empty(s):
    ...     return s and s.strip() //删除S中的空格
    ...
    >>> filter(not_empty, ['A', '', 'B', None, 'C', ''])
    ['A', 'B', 'C']
    4 sorted 可以对序列进行排序,通常规定,对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1。如下示例演示了从小到大的排序
    >>> sorted([36, 5, 12, 9, 21])
    [5, 9, 12, 21, 36]
    5 闭包
    >>> def lazy_sum(*args):
    ...     def sum():
    ...             ax = 0
    ...             for n in args:
    ...                     ax = ax + n
    ...             return ax
    ...     return sum
    ...
    >>> f = lazy_sum(1, 3, 5, 7, 9)
    >>> f
    <function sum at 0x7fe88f0690c8>
    >>> f()
    25
    >>>
    可以看到,调用lazy_sum 返回的是一个sum函数,在此调用f()可以计算出求和结果
    在这个例子中,我们在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数f()中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。每次调用闭包函数时,即使形参相同,返回的函数都是一个不同的函数。
    6 匿名函数
    >>> map(lambda x: x * x, [1,2, 3, 4, 5, 6, 7, 8, 9])
    [1, 4, 9, 16, 25, 36, 49, 64, 81]
    关键字lambda表示匿名函数,冒号前面的x表示函数参数。
    可以将一个匿名函数赋值给变量:如下所示
    >>> f = lambda x: x * x
    >>> f(5)
    25
    7 装饰器
    每一个函数对象都有一个__name__属性
    如下示例:
    >>> now.__name__
    'now'
    >>> f.__name__
    'now'
    现在,假设我们要增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
    本质上,decorator就是一个返回函数的高阶函数。所以,我们要定义一个能打印日志的decorator,可以定义如下:
    #!/usr/bin/env python
    # -*- coding: utf8 -*-
     
    def log(func):
        def wrapper(*args, **kw):
            print 'call %s():' % func.__name__
            return func(*args, **kw)
        return wrapper
     
    @log
    def now():
        print 'hello world'
     
    if __name__ == '__main__':
        now()
    通过@符号为now()函数内置一个装饰器,调用now()函数时会自动生成日志
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    JS日期选择器
    兼容多种浏览器的Ctrl+Enter提交兼容firefox、ie、opera
    在线播放器 在网页中插入MediaPlayer 兼容IE和FF的代码调试
    Android客户端开发即WebView组件的使用详解
    web开发时碰到的问题以及心得经验
    Select的OnChange()事件
    iPhone 浏览器开发之关键 UIWebView
    获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
    利用XMLHTTP无刷新添加数据之Get篇
    客户端表单通用验证checkForm(oForm) js版
  • 原文地址:https://www.cnblogs.com/flex-/p/5550274.html
Copyright © 2011-2022 走看看