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

    变量可以指向函数:
    
    以Python 内置的求绝对值的函数abs()为例,调用该函数用以下代码:
    
    print abs(-10)
    
    C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
    10
    
    但是,如果只写abs呢?
    
    >>> abs
    <built-in function abs>
    可见,abs(-10)是函数调用,而abs是函数本身
    
    x = abs(-10)
    print x
    
    C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
    10
    
    
    函数名也是变量:
    
    
    
    传入函数:
    
    既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,
    
    这种函数就称之为高阶函数:
    
    def add(x, y, f):
        return f(x) + f(y)
    print add(-5,6,abs)
    
    当我们调用add(-5,6,abs)时,参数x,y和f分别接收-5,6和abs,根据函数定义,
    
    我们可以推导计算过程为:
    
    x ==> -5
    y ==> 6
    f ==> abs
    f(x) + f(y) ==> abs(-5) + abs(6) ==> 11
    
    def f(x):
      return x * x
    print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    
    
    C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
    [1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    Process finished with exit code 0
    
    所以,map()作为高阶函数,事实上它把运算规则抽象了,因此,
    
    我们不但可以计算简单的f(x)=x2
    
    
    a= [1, 2, 3, 4, 5, 6, 7, 8, 9]
    print a
    b=map(str,a)
    print b
    
    C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
    [1, 2, 3, 4, 5, 6, 7, 8, 9]
    ['1', '2', '3', '4', '5', '6', '7', '8', '9']
    
    
    filter 
    
    Python 内建的filter()函数用于过滤序列:
    
    和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次
    
    作用于每个元素,然后根据返回值True还是False决定保留还是丢弃该元素:
    
    def is_odd(n):
        return n % 2 == 1
    print filter(is_odd,[9])
    
    为真就返回
    
    把一个序列中的空字符串删掉,可以这么写:
    
    def not_empty(s):
        return s and s.strip()
    
    filter(not_empty, ['A', '', 'B', None, 'C', '  '])
    # 结果: ['A', 'B', 'C']
    
    
    排序算法:
    
    
    函数作为返回值:
    
    高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
    
    def calc_sum(*args):
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    print calc_sum(1,4,7)
    
    但是,如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办? 可以不返回求和的结果,
    
    而是返回求和的函数!
    
    
    def lazy_sum(*args):
        def sum():
            ax = 0
            for n in args:
                ax = ax + n
            return ax
        return sum
    
    print lazy_sum(33,44,55)
    f= lazy_sum(1,2,3,4,5)
    print f(
    
    
    C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
    <function sum at 0x025479F0>
    15
    
    在这个例子中,我们在函数lazy_sum中定义了函数sum,并且,内部函数sum
    
    可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,
    
    相关参数和变量都保存在返回的函数中,这种称为"闭包"
    
    
    闭包:
    
    注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,
    
    其内部的局部变量还被新函数引用,所以,闭包用起来简单,实现起来可不容易。
    
    
    匿名函数:
    
    当我们在传入函数时,有些时候,不需要显示地定义函数,直接传入匿名函数更方便。
    
    
    由于函数也是一个对象,而且函数对象被赋值给变量,所以,通过变量也能调用该函数:
    
    def now():
        print '2013-12-25'
    f = now
    f()
    
    
    C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
    2013-12-25
    
    
    函数对象有一个__name__属性,可以拿到函数的名字:
    
    
    def now():
        print '2013-12-25'
    f = now
    f()
    print  f.__name__
    
    C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
    2013-12-25
    now
    
    def log(func):
        def wrapper(*args, **kw):
            print 'call %s():' % func.__name__
            return func(*args, **kw)
        return wrapper
    @log
    def now():
        print '2013-12-25'
    now()
    
    
    C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
    call now():
    2013-12-25

  • 相关阅读:
    四则运算
    自我介绍
    代练第七天
    代练第六天
    代练第五天
    代练第四天
    补充总结
    对软件工程课程的总结
    作业4:结对编程项目四则运算
    psp记录个人项目花费时间
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13349618.html
Copyright © 2011-2022 走看看