zoukankan      html  css  js  c++  java
  • 【Python基础】内置函数-map+filter+reduce+lambda

    Python内置函数目录

    • max()/min()
    • sorted()
    • map()
    • filter()
    • reduce()
    • lambda()   

    max()

    """max()  min()
    max(iterable, *[, default=obj, key=func]) -> value  
    max(arg1, arg2, *args, *[, key=func]) -> value
    #max() 处理的是可迭代对象,相当于for循环出每一个元素进行比较。#注意:python3不同数据类型 不能直接比较
    每个元素进行比较,是从每个元素的第一个位置依次比较,如果这一个位置分出大小,后面的不需要在比较了,直接得出这两个元素大小
    """
    """一般简单的用法"""
    # vals = [11,56,32,145]
    # vals = [11,56,32,"xiong"]       #Python3中报错,Python2中可以比较 max(98,'a')  9<97  比较第一个位置
    # print(max(vals))
    
    """问题描述:找出字典中年龄最大的一项 输入名称和年龄"""
    # myage = {"xiong_age":26,"wang_age":22,"zhang_age":33,"ling_age":25}
    # print(max(myage.values()))  #只比较了valuse 那个最大,但不知道具体是那个key对应的
    # new_myage = zip(myage.values(),myage.keys())        #将myage变为 {年龄:姓名} 的字典
    # ret = max(new_myage)
    # print(ret)
    
    
    """ 另一种max() 方法,传入key = """
    people = [
        {"name":"zhang","age":18},
        {"name":"wang","age":28},
        {"name":"ling","age":15},
        {"name":"xiong","age":26},
        {"name":"zhao","age":56},
        {"name":"sun","age":35},
    ]
    # ret = max(people,key=lambda dic:dic["age"])
    # # """max(iterable,key=lambda dic:dic["age"]) 对可迭代对象for循环 经过lambda函数处理 对每一项的 age比较大小"""
    # print(ret)
    
    # print(pow(2,3))     #相当于 2**3 =8
    # print(pow(2,3,3))     #相当于 2**3%3 =2    比自己写的 幂运算表达式效率要高
    

    sorted()

    """sorted() 排序"""
    l=[3,2,1,5,7]
    l1=[3,2,'a',1,5,7]
    print(sorted(l))
    # print(sorted(l1)) #排序本质就是在比较大小,不同类型之间不可以比较大小
    people=[
        {'name':'alex','age':1000},
        {'name':'wupei','age':10000},
        {'name':'yuanhao','age':9000},
        {'name':'linhaifeng','age':18},
    ]
    print(sorted(people,key=lambda dic:dic['age']))
    
    name_dic={
        'abyuanhao': 11900,
        'alex':1200,
        'wupei':300,
    }
    print(sorted(name_dic))     #对字典的keys 进行排序
    #
    print(sorted(name_dic,key=lambda key:name_dic[key]))    #对字典的dict[keys] 进行排序
    #
    print(sorted(zip(name_dic.values(),name_dic.keys())))

    map()

    
    
    num_l=[1,2,10,5,3,7]
    
    res=map(lambda x:x+1,num_l)    ##res 得到的是 <map object at 0x000002A365360240>   map()处理得到的是一个迭代器,只能使用一次
    
    # # for i in res:
    # #     print(i)
    print(list(res))

    map()用法总结:

    """
    总结:
    ret = map([函数],[可迭代对象])     #返回的ret是一个map对象,用list(ret) 取出结果
    # 函数可以是def 自定义的,也可以是lambda,可迭代对象(字符串、列表、元组、字典)
    """

    map()内部原理

    num_l=[1,2,10,5,3,7]
    num1_l=[1,2,10,5,3,7]
    
    # ret=[]
    # for i in num_l:
    #     ret.append(i**2)
    #
    # print(ret)
    #
    # def map_test(array):
    #     ret=[]
    #     for i in array:
    #         ret.append(i**2)
    #     return ret
    #
    # ret=map_test(num_l)
    # rett=map_test(num1_l)
    # print(ret)
    # print(rett)
    
    # num_l=[1,2,10,5,3,7]
    # lambda x:x+1
    def add_one(x):
        return x+1
    #
    # #lambda x:x-1
    def reduce_one(x):
        return x-1
    #
    # #lambda x:x**2
    def pf(x):
        return x**2
    #
    # def map_test(func,array):
    #     ret=[]
    #     for i in num_l:
    #         res=func(i) #add_one(i)
    #         ret.append(res)
    #     return ret
    # print(map_test(add_one,num_l))
    # print(map_test(lambda x:x+1,num_l))
    
    # print(map_test(reduce_one,num_l))
    # print(map_test(lambda x:x-1,num_l))
    
    # print(map_test(pf,num_l))
    # print(map_test(lambda x:x**2,num_l))
    
    """终极版本"""
    num_l=[1,2,10,5,3,7]
    
    def map_test(func,array):     #func=lambda x:x+1    arrary=[1,2,10,5,3,7]
        ret=[]
        for i in array:
            res=func(i) #add_one(i)
            ret.append(res)
        return ret
    
    print(map_test(lambda x:x+1,num_l))
    res=map(lambda x:x+1,num_l)
    print('内置函数map,处理结果',res)   #<map object at 0x000002A365360240> map()处理得到的是一个迭代器,只能使用一次
    # # for i in res:
    # #     print(i)
    print(list(res))
    print('传的是有名的函数',list(map(reduce_one,num_l)))
    #
    #
    msg='linhaifeng'
    print(list(map(lambda x:x.upper(),msg)))
    
    """
    总结:
    ret = map([函数],[可迭代对象])     #返回的ret是一个map对象,用list(ret) 取出结果
    # 函数可以是def 自定义的,也可以是lambda,可迭代对象(字符串、列表、元组、字典)
    """

    filter()

    用法:

    movie_people=['alex_sb','wupeiqi_sb','linhaifeng','yuanhao_sb']
    
    res = filter(lambda n:not n.endswith('sb'),movie_people)   #res 得到一个迭代器对象
    
    print(res)      #<filter object at 0x00000164321BCDA0>
    print(list(res))    ## 使用 list(res) 调用列表地址里的东西

    用法举例:

    '''使用案例'''
    #过滤出1~100中平方根是整数的数:
    # import math
    # def is_sqr(x):
    #     return math.sqrt(x) % 1 == 0
    #
    # newlist = filter(is_sqr, range(1, 101))
    # print(list(newlist))

    filter()用法总结

    """
    总结:
    filter(function or None, iterable) --> filter object 
    #function 可以是def 自定义的函数名,也可以是lambda,符合过滤条件返回True 否则返回False ,
    iterable 是可迭代对象,过滤掉可迭代对象每一项经过函数处理后的对象 返回一个列表地址,要用 list() 取出地址中的内容
    """

    filter()原理:

    '''版本1'''
    # movie_people=['sb_alex','sb_wupeiqi','linhaifeng','sb_yuanhao']
    # def filter_test(array):
    #     ret=[]
    #     for p in array:
    #         if not p.startswith('sb'):
    #                ret.append(p)
    #     return ret
    #
    # res=filter_test(movie_people)
    # print(res)
    
    '''版本2'''
    # movie_people=['alex_sb','wupeiqi_sb','linhaifeng','yuanhao_sb']
    # def sb_show(n):
    #     return n.endswith('sb')     #1/0
    #
    # def filter_test(func,array):
    #     ret=[]
    #     for p in array:
    #         if not func(p):
    #                ret.append(p)
    #     return ret
    #
    # res=filter_test(sb_show,movie_people)
    # print(res)
    
    #终极版本
    # movie_people=['alex_sb','wupeiqi_sb','linhaifeng','yuanhao_sb']
    # def sb_show(n):
    #     return n.endswith('sb')
    # #等价于--->lambda n:n.endswith('sb')
    #
    # def filter_test(func,array):
    #     ret=[]
    #     for p in array:
    #         if not func(p):
    #                ret.append(p)
    #     return ret
    #
    # res=filter_test(lambda n:n.endswith('sb'),movie_people)
    # print(res)
    #
    # #最终得出  filter()函数
    movie_people=['alex_sb','wupeiqi_sb','linhaifeng','yuanhao_sb']
    res = filter(lambda n:not n.endswith('sb'),movie_people)   #res 得到一个迭代器对象
    print(res)      #<filter object at 0x00000164321BCDA0>
    print(list(res))    ## 使用 list(res) 调用列表地址里的东西
    #
    # print(list(filter(lambda n:not n.endswith('sb'),movie_people)))
    #直接打印出来 没赋值给变量保存下来,即在内存中开辟一块地方存下来了 但没有记录门牌号 打印之后就自动清除了
    
    """
    总结:
    filter(function or None, iterable) --> filter object 
    #function 可以是def 自定义的函数名,也可以是lambda,符合过滤条件返回True 否则返回False ,
    iterable 是可迭代对象,过滤掉可迭代对象每一项经过函数处理后的对象 返回一个列表地址,要用 list() 取出地址中的内容
    """
    
    '''使用案例'''
    #过滤出1~100中平方根是整数的数:
    # import math
    # def is_sqr(x):
    #     return math.sqrt(x) % 1 == 0
    #
    # newlist = filter(is_sqr, range(1, 101))
    # print(list(newlist))

    reduce()

    用法:

    """最后 引出 reduce函数"""
    from functools import reduce
    
    def add_num(x,y):
        return x+y
    
    num_l=[1,2,3,100]
    print(reduce(lambda x,y:x+y,num_l,3))
    print(reduce(add_num,num_l))

    总结:

    """
    总结:
    reduce() 就是对iterable 每一项经过function处理后累计输出一个结果,有初始值从初始值开始 没有就从iterable第一项开始
    reduce(function, iterable, initial=None) #function 定义函数,iterable -- 可迭代对象 ,initial 初始值 默认为None
    ## reduce_test(func,array,init=None)  
    """ 

    原理:

    # from functools import reduce
    
    """ 版本1:"""
    # num_l=[1,2,3,100]
    #
    # res=0
    # for num in num_l:
    #     res+=num
    #
    # print(res)
    #
    # num_l=[1,2,3,100]
    # def reduce_test(array):
    #     res=0
    #     for num in array:
    #         res+=num
    #     return res
    #
    # print(reduce_test(num_l))
    
    """版本2"""
    # num_l=[1,2,3,100]
    #
    # def multi(x,y):
    #     return x*y
    # # lambda x,y:x*y
    #
    # def reduce_test(func,array):
    #     res=1
    #     for num in array:
    #         res=func(res,num)
    #     return res
    #
    # print(reduce_test(multi,num_l))
    # print(reduce_test(lambda x,y:x*y,num_l))
    
    """ 终极版本 -指定一个初始值"""
    # num_l=[1,2,3,100]
    # def reduce_test(func,array,init=None):
    #     if init is None:
    #         res=array.pop(0)
    #     else:
    #         res=init
    #     for num in array:
    #         res=func(res,num)
    #     return res
    #
    # print(reduce_test(lambda x,y:x*y,num_l,2))
    
    
    """最后 引出 reduce函数"""
    from functools import reduce
    
    def add_num(x,y):
        return x+y
    
    num_l=[1,2,3,100]
    print(reduce(lambda x,y:x+y,num_l,3))
    print(reduce(add_num,num_l))
    
    """
    总结:
    reduce() 就是对iterable 每一项经过function处理后累计输出一个结果,有初始值从初始值开始 没有就从iterable第一项开始
    reduce(function, iterable, initial=None) #function 定义函数,iterable -- 可迭代对象 ,initial 初始值 默认为None
    ## reduce_test(func,array,init=None)  
    """

    lambda()

    """语法:
    lambda [形参]:[返回值]
    注意:# lambda 匿名函数如果不赋值给变量,Python运行之后内存立即清空,若赋值给变量则与普通函数相同
    """
    
    # yy = lambda x:x**2
    # print(yy(2))
    
    # ff1 = lambda s:str(s)+"_sb"
    # print(ff1("alex"))
    
    """一般情况下 lambda 直接使用,不赋值给变量。与其他函数混合使用"""
  • 相关阅读:
    又学到的2个小技巧
    CSS3 简写animation
    CSS3 区别Transform,Transition,Animation一句话
    纠错【2012年5月9日 JQuery跑马灯(文字无缝向上翻动)(自已封装的第三个插件)】
    jQuery计算选中的文本字数,并弹出一个层(插件四)
    html5Canvas绘制线条closePath();
    html5循环方式绘制矩形
    jQuery过滤not()与filter();
    javascript在firebug调试时用console.log
    jQuery插件在光标定位的地方插入文字(插件5)
  • 原文地址:https://www.cnblogs.com/XJT2018/p/10860339.html
Copyright © 2011-2022 走看看