【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 直接使用,不赋值给变量。与其他函数混合使用"""
原文地址:https://www.cnblogs.com/XJT2018/p/10860339.html