Python 函数式编程

发布时间:2019-03-04 15:58:43编辑:auto阅读(1672)

    lambda表达式

    1. 以lambda开头
    2. 紧跟一定的参数(如果有的话)
    3. 参数后用冒号和表达式主题隔开
    4. 只是一个表达式,所以,没有return
    # 计算一个数字的100倍数
    stm = lambda x: 100 * x 
    
    stm(89)

    map

    1. 把集合或者列表的元素,每一个元素都按照一定规则(函数)进行操作,生成一个新的列表或者集合
    2. map函数是系统提供的具有映射功能的函数,返回值是一个迭代对象
    def mulTen(n):
        return n*10
    
    l3 = map(mulTen, l1 ) # map类型是一个可迭代的结构,所以可以使用for遍历
    for i in l3:
        print(i)
      
    l4 = [i for i in l3]
    print(l4)
    # 上面列表生成式得到的结果为空——可迭代结果不能用列表生成式

    reduce

    1. 把一个可迭代对象最后归并成一个结果
    2. 对于作为参数的函数要求: 两个参数+返回值
    from functools import reduce
    
    # 定义一个操作函数,求和
    def myAdd(x,y):
        return x + y
        
    # 对于列表[1,2,3,4,5,6]执行myAdd的reduce操作
    rst = reduce( myAdd, [1,2,3,4,5,6] )
    print(rst)

    filter

    1. 对一组数据进行过滤,符合条件的数据(使过滤函数返回True)会生成一个新的列表并返回
    2. 调用格式: filter(f, data), f是过滤函数, data是数据
    def isEven(a):
        return a % 2 == 0
    
    l = [3,4,56,3,2,3,4556,67,4,4,3,23455,43]
    
    rst = filter(isEven, l) # 返回的是一个可迭代对象

    sorted

    1. sorted(data, key, reverse),data:排序对象,key:在排序前对每一个元素进行key函数运算,reverse:若True则翻转
    a = [-43,23,45,6,-23,2,-4345]
    
    al = sorted(a, key=abs, reverse=True) # 即按照绝对值的倒叙排列
    
    print(al)

    返回函数

    def myF4( *args):
        def myF5():
            rst = 0
            for n in args:
                rst += n
            return rst
        return myF5
    
    f5 = myF4(1,2,3,4,5,6,7,8,9,0)
    # f5的调用方式
    f5()

    闭包(closure)

    def count():
        fs = []
        for i in range(1, 4):
            def f():
            return i * i
        fs.append(f)
        return fs
    
    
    f1, f2, f3 = count()
    print(f1(), f2(), f3()) # 结果:9 9 9
    • 造成上述状况的原因是,返回函数引用了变量i, i并非立即执行,而是等到三个函数都返回的时候才统一使用,此时i已经变成了3,最终调用的时候,都返回的是 3*3
    • 此问题描述成:返回闭包时,返回函数不能引用任何循环变量
    • 解决方案: 再创建一个函数,用该函数的参数绑定循环变量的当前值,无论该循环变量以后如何改变,已经绑定的函数参数值不再改变
    def count():
        def f(j):
            def g():
            return j * j
        return g
        fs = []
        for i in range(1, 4):
            fs.append(f(i))
            return fs
    
    
    f1, f2, f3 = count()
    print(f1(), f2(), f3()) # 结果:1 4 9

    装饰器(Decrator)

    # 对hello函数进行功能扩展,每次执行hello万打印当前时间
    import time
    
    
    def print_time(f):
        def wrapper(*args, **kwargs):
            print("Time: ", time.ctime())
            return f(*args, **kwargs)
        return wrapper
    
    
    @print_time
    def hello3():
        print('我是手动执行的喵||')
        return
    
    
    if __name__ == '__main__':
        hello3()
        print('*' * 30)
        hello3 = print_time(hello3)
        hello3()
        print('*' * 30)
        f = print_time(hello3)
        f()
        print('*' * 30)
        
    # 结果:
    '''
    Time:  Sun Aug 26 21:01:18 2018 
    我是手动执行的喵||
    ******************************
    Time:  Sun Aug 26 21:01:18 2018
    Time:  Sun Aug 26 21:01:18 2018
    我是手动执行的喵||
    ******************************
    Time:  Sun Aug 26 21:01:18 2018
    Time:  Sun Aug 26 21:01:18 2018
    Time:  Sun Aug 26 21:01:18 2018
    我是手动执行的喵||
    ******************************
    '''

    解释运行结果:

    1. 运行hello3():

      Time: Sun Aug 26 21:01:18 2018
      我是手动执行的喵||

      hello3()使用装饰器,先打印时间,再运行函数内部

    2. 运行print_time(hello3):

      Time: Sun Aug 26 21:01:18 2018
      Time: Sun Aug 26 21:01:18 2018
      我是手动执行的喵||

      print_time运行打印时间,返回hello3,再如1

    3. 运行print_time(print_time(hello3)):

      Time: Sun Aug 26 21:01:18 2018
      Time: Sun Aug 26 21:01:18 2018
      Time: Sun Aug 26 21:01:18 2018
      我是手动执行的喵||

      多加一层,多一个时间

关键字