zoukankan      html  css  js  c++  java
  • Python3中高阶函数lambda,filter,map,reduce,zip的详细用法

    在Python里有五大高阶函数,他们分别是lambda()匿名函数,filter()筛选函数,map()函数,reduce()函数,zip()函数。下面就让我们来详细的了解一下这五种函数的具体用法吧。

    1.lambda()匿名函数

    匿名函数lambda:是指一类无需定义标识符(函数名)的函数或子程序。
    lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。
    
    要点:
    1,lambda 函数不能包含命令,
    
    2,包含的表达式不能超过一个。
    
    说明:一定非要使用lambda函数;任何能够使用它们的地方,都可以定义一个单独的普通函数来进行替换。
    我将它们用在需要封装特殊的、非重用代码上,避免令我的代码充斥着大量单行函数。
    
    lambda匿名函数的格式:冒号前是参数,可以有多个,用逗号隔开,冒号右边的为表达式。
    其实lambda返回值是一个函数的地址,也就是函数对象。
    '''
    匿名函数lambda:是指一类无需定义标识符(函数名)的函数或子程序。
    lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。
    
    要点:
    1,lambda 函数不能包含命令,
    
    2,包含的表达式不能超过一个。
    
    说明:一定非要使用lambda函数;任何能够使用它们的地方,都可以定义一个单独的普通函数来进行替换。
    我将它们用在需要封装特殊的、非重用代码上,避免令我的代码充斥着大量单行函数。
    
    lambda匿名函数的格式:冒号前是参数,可以有多个,用逗号隔开,冒号右边的为表达式。
    其实lambda返回值是一个函数的地址,也就是函数对象。
    '''
    def sum(x,y):
        return x+y
    print(sum(4,6))
    
    f=lambda x,y:x+y
    print(f(4,6))
    #这俩个例子的效果是一样的,都是返回x+y
    
    a=lambda x:x*x
    print(a(4))  #传入一个参数的lambda函数 返回x*x
    
    b=lambda x,y,z:x+y*z
    print(b(1,2,3))  #返回x+y*z  即1+2*3=7
    
    #2.方法结合使用
    from functools import reduce
    foo=[2, 18, 9, 22, 17, 24, 8, 12, 27]
    print(list(filter(lambda x:x%3==0,foo))) #筛选x%3==0 的元素
    print(list(map(lambda x:x*2+10,foo)))    #遍历foo 每个元素乘2+10 再输出
    print(reduce(lambda x,y:x+y,foo))        #返回每个元素相加的和


    2.filter函数()

    filter() 函数是一个对于可迭代对象的过滤器,过滤掉不符合条件的元素,
    返回的是一个迭代器,如果要转换为列表,可以使用 list() 来转换。
    该函数接收两个参数,第一个为函数的引用或者None,第二个为可迭代对象,
    可迭代对象中的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到迭代器中
    下面看下fiter()的用法:
    '''
    filter() 函数是一个对于可迭代对象的过滤器,过滤掉不符合条件的元素,
    返回的是一个迭代器,如果要转换为列表,可以使用 list() 来转换。
    该函数接收两个参数,第一个为函数的引用或者None,第二个为可迭代对象,
    可迭代对象中的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到迭代器中
    下面看下fiter()的用法:
    '''
    
    my_list=[1,2,'',3,4,'6',' ']
    new_list=list(filter(None,my_list))
    print(new_list)
    #None 函数 过滤掉'' 而不是过滤掉空字符串
    
    def is_oushu(x):
        return x%2==0
    new_list=list(filter(is_oushu,list(range(1,11))))
    print(new_list)
    #过滤掉不是偶数的数
    
    a=[1,2,3,4,5,6,2,2,2,]
    print(list(filter(lambda x:x!=2,a)))
    #筛选出列表里所有的不是 2  的元素


    3.map函数详解

    map()函数
    map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,
    并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
    
    例如,对于list [1, 2, 3, 4, 5, 6, 7, 8, 9]
    如果希望把list的每个元素都作平方,就可以用map()函数:
    
    因此,我们只需要传入函数f(x)=x*x,就可以利用map()函数完成这个计算:
    '''
    map()函数
    map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,
    并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
    
    例如,对于list [1, 2, 3, 4, 5, 6, 7, 8, 9]
    如果希望把list的每个元素都作平方,就可以用map()函数:
    
    因此,我们只需要传入函数f(x)=x*x,就可以利用map()函数完成这个计算:
    '''
    list=[1,2,3,4,5,6,7,8,9]
    def f(x):
        return x*x
    list1=map(f,list)
    print(list1)
    for i in list1:
        print(i)
    
    '''
    注意:map()函数不改变原有的 list,而是返回一个新的 list。
    
    利用map()函数,可以把一个 list 转换为另一个 list,只需要传入转换函数。
    
    由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,
    事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。
    
    任务
    假设用户输入的英文名字不规范,没有按照首字母大写,后续字母小写的规则,
    请利用map()函数,把一个list(包含若干不规范的英文名字)变成一个包含规范英文名字的
    '''
    def format_name(s):
        s1=s[0:1].upper()+s[1:].lower()
        return s1
    names=['adam', 'LISA', 'barT']
    print (map(format_name, names))  #python2 这样写可以直接输出列表
    for i in map(format_name,names):
        print(i)                      #python3 得这样写才可以


    4.reduce函数详解

    在python3中如果使用reduce需要先导入
    
    from functools import reduce
    
    reduce函数,reduce函数会对参数序列中元素进行累积。
    
    reduce函数的定义:
    reduce(function, sequence [, initial] ) -> value
    function参数是一个有两个参数的函数,reduce依次从sequence中取一个元素,
    和上一次调用function的结果做参数再次调用function。
    第一次调用function时,如果提供initial参数,
    会以sequence中的第一个元素和initial作为参数调用function,
    否则会以序列sequence中的前两个元素做参数调用function。
    '''
    在python3中如果使用reduce需要先导入
    
    from functools import reduce
    
    reduce函数,reduce函数会对参数序列中元素进行累积。
    
    reduce函数的定义:
    reduce(function, sequence [, initial] ) -> value
    function参数是一个有两个参数的函数,reduce依次从sequence中取一个元素,
    和上一次调用function的结果做参数再次调用function。
    第一次调用function时,如果提供initial参数,
    会以sequence中的第一个元素和initial作为参数调用function,
    否则会以序列sequence中的前两个元素做参数调用function。
    '''
    
    from functools import reduce
    lst=[1,2,3,4,5,6]
    def f(x,y):
        return x+y
    print(reduce(f,lst))
    
    '''
    过程1+2+3+4+5+6=21
    '''
    
    print(reduce(lambda x,y:x*y,lst))
    # 运行过程为1*2*3*4*5*6=720
    
    #来个稍微复杂的
    print(reduce(lambda x,y:x*y+1,lst))
    
    '''
    运算步骤:1*2+1=3
             3*3+1=10
             10*4+1=41
             41*5+1=206
             206*6+1=1237
    '''
    
    #再说说有初始化值的情况, 这个时候就不是取列表的前两项, 而是取初始值为第一个,
    # 序列的第一个元素为第二个元素,开始进行lambda函数的应用计算.
    print(reduce(lambda x,y:x+y,lst,5))
    
    '''
    计算步骤:5+1=6
             6+2=8
             8+3=11
             11+4=15
             15+5=20
             20+6=26
    '''


    5.zip函数详解

    #zip函数接受任意多个可迭代对象作为参数,将对象中对应的元素打包成一个tuple,然后返回一个可迭代的zip对象.
    #这个可迭代对象可以使用循环的方式列出其元素
    #若多个可迭代对象的长度不一致,则所返回的列表与长度最短的可迭代对象相同.
    #zip函数接受任意多个可迭代对象作为参数,将对象中对应的元素打包成一个tuple,然后返回一个可迭代的zip对象.
    #这个可迭代对象可以使用循环的方式列出其元素
    #若多个可迭代对象的长度不一致,则所返回的列表与长度最短的可迭代对象相同.
    
    #1.用列表生成zip对象
    x=[1,2,3]
    y=[4,5,6]
    z=[7,8,9]
    h=['a','b','c','d']
    zip1=zip(x,y,z)
    print(zip1)
    for i in zip1:
        print(i)
    
    zip2=zip(x,y,h)
    for i in zip2:
        print(i)
    
    zip3=zip(h)
    for i in zip3:
        print(i)
    
    zip4=zip(*h*3)
    for i in zip4:
        print(i) #这是干啥哟。。
    
    print('==*=='*10)
    #2.二维矩阵变换
    l1=[[1,2,3],[4,5,6],[7,8,9]]
    print(l1)
    print([[j[i] for j in l1] for i in range(len(l1[0])) ])
    zip5=zip(*l1)
    for i in zip5:
        print(i)


    以上就是五大高阶函数的具体用法。。。希望大家可以学到一些东西。。。

  • 相关阅读:
    Jmeter Beanshell Assertion 成功或失败;这样beanshell的结果就可以在聚合报告的错误率中体现了;
    HDU-1233-还是畅通工程(最小生成树prim)
    HDU-1233-还是畅通工程(最小生成树kruscal)
    Hrbust 1794敌兵布阵(树状数组应用)
    Hrbust 2061消息队列(优先队列应用)
    Hrbust 1835 最长递增子序列(dp)
    "尚学堂杯"哈尔滨理工大学第七届程序设计竞赛——Hrbust2326 Blind Father
    "尚学堂杯"哈尔滨理工大学第七届程序设计竞赛——Hrbust2327 Collection Game
    "尚学堂杯"哈尔滨理工大学第七届程序设计竞赛——Hrbust2330 Final Ugly English
    HDU-1794 敌兵布阵(线段树单点更新求区间和)
  • 原文地址:https://www.cnblogs.com/yuxuanlian/p/10234197.html
Copyright © 2011-2022 走看看