美文网首页
函数式编程

函数式编程

作者: 江山画_孤影 | 来源:发表于2018-05-13 15:27 被阅读0次

    高阶函数(higher order function)

    函数式编程的特点之一是使用高阶函数.
    接受函数为参数,或者把函数作为结果返回的函数是高阶函数.
    高阶函数主要有map(),filter(),reduce()以及内置函数sorted().
    在讲解高阶函数之前,我们需要先对匿名函数lambda()有所了解.

    匿名函数 lambda

    lambda argument1,argument2,...argumentN:expression using arguments
    lambda 是一个表达式而不是语句.lambda 函数的定义中不能使用赋值.
    
    常见的lambda表达式主要有下面三种
    lambda x:x+5
    lambda x,y:x**y
    lambda x,y:func(x,y)
    

    sorted()

    sorted()提供可选的key参数用于提供一个函数
    >>>fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana']
    >>> sorted(fruits, key=len)  #len()是函数而不是方法
    ['fig', 'apple', 'cherry', 'banana', 'raspberry', 'strawberry']
    
    >>>students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
    >>>sorted(students,key=lambda s:s[2])  
    [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
    

    map()

    map()函数接收两个参数,一个是函数,一个是可迭代对象(iterable),map将传入的函数依次作用到可迭代对象中的每个元素,并把结果作为新的Iterator返回。

    例一  
    >>>mylist = [1,2,3,4,5]  #要求输出[1,4,9,16,25]
    
    #接收内置函数
    >>>list(map(pow,mylist,[2,2,2,2,2])) #在这里使用pow不是一个很好的选择       
    
    #接收匿名函数
    >>>list(map(lambda x:x**2,mylist)) 
    
    #接收自定义函数
    >>>def squ(x):
    >>>        return x**2
    >>>list(map(squ,mylist))            
    
    例二
    >>>list1 = [4,6,3,2,5]
    >>>list2 = [2,3,5,1,4]
    >>>func = lambda x,y:x+y
    >>>list(map(func,list1,list2))
    [6,9,8,3,9]
    

    filter()

    #例三 筛选奇数项
    >>>mylist = [0,1,2,-3,4,5,6,-7,8,9]
    >>>list(filter(lambda x:x%2,mylist))
    [1, -3, 5, -7, 9]
    

    map+filter

    #例四 筛选出奇数项以绝对值形式输出
    >>>mylist = [-1,-2,3,4,-5,6,7,-8,-9]
    >>>list(map(abs,filter(lambda x:x%2,mylist)))
    [1, 3, 5, 7, 9]
    

    map,filter的现代替代品

    在 Python 3 中,引入了列表推导和生成器表达式。两者都具有 map 和 filter 两个函数的功能,而且更易于阅读.

    例一
    >>>mylist = [1,2,3,4,5]
    >>>[i**2 for i in mylist]
    [1,4,9,16,25]
    
    例二
    >>>list1 = [4,6,3,2,5]
    >>>list2 = [2,3,5,1,4]
    >>>[i+j for i,j in zip(list1,list2)]
    [6, 9, 8, 3, 9]
    
    例四
    >>>mylist =  [-1,-2,3,4,-5,6,7,-8,-9]
    >>>[abs(i) for i in mylist if i%2==1]
    [1, 3, 5, 7, 9]
    

    总结

    在一些适当的情景下加入函数式编程会起到不错的效果,但如果只是为了追求减少代码量而盲目使用,则会适得其反,会大大降低代码的可读性.

    相关文章

      网友评论

          本文标题:函数式编程

          本文链接:https://www.haomeiwen.com/subject/yanzkftx.html