map(function,Iterable)函数
map函数接收两个参数,第一个参数是函数,第二个是可迭代对象(列表,字典,字符串),最后返回一个可迭代对象
运行过程:
map函数会迭代可迭代对象,取出每一个元素去交给传递的函数去执行
示例:
str1 = "12345"
def fun(x):
return int(x)
list1 = list(map(fun,str1))
print(list1)
>>[1, 2, 3, 4, 5]
示例2:
def f(x):
return x["oid"]
s1 = [{"oid":1},{"oid":2},{"oid":3},{"oid":4},{"oid":5},]
l1 = list(map(f,s1))
print(l1)
>>[1, 2, 3, 4, 5]
示例3:
def to_str_list(ele):
return str(ele)
list1 = [1,2,3,4,5]
list2 = list(map(to_str_list,list1))
print(list2)
reduce(function,Iterable)函数
虽然和map
一样都是传一个函数和一个可迭代对象
但不同的是:
-
map
每次迭代一个元素,而reduce第一次迭代两个元素,然后传给函数去执行,将执行后的结果取回,作为下次函数执行的参数之一,也就是说reduce除了第一次会迭代两个元素,以后都是迭代一个元素 - 另外一个不同的是
map
返回的是一个可迭代对象,而reduce
返回的却是最终执行的结果,函数返回什么类型就是什么类型 - 第三个不同是
map
不需要导入,可以直接调用,而reduce
需要导入from functools import reduce
示例1:
from functools import reduce
def str_to_num(first,second):
return int(first)*10 + int(second)
str3 = "12345"
num1 = reduce(str_to_num,str3)
print(num1)
示例2:配合map函数一起使用
from functools import reduce
def str_to_num(obj_str):
map_dict = {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9}
def get_int(x):
return map_dict[x]
def weighting(a,b):
return a*10 + b
return reduce(weighting,map(get_int,obj_str)) # 这里不需要使用list(map(get_int,obj_str))因为map本身就是返回可迭代对象
# 上面几个示例使用list转换是因为需要打印,list内部也是做了迭代组合
str1 = "1234567890"
print(str_to_num(str1))
>>1234567890
注意上面的示例使用到了闭包
闭包和装饰器的区别:
闭包是内部函数引用外部的变量做一些逻辑处理.返回的是结果
装饰器是对函数功能的扩展,返回的是一个可执行函数的引用
结合reduce和map实现支持转换整数和浮点数的闭包示例:
from functools import reduce
def str_to_num(obj_str):
map_dict = {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9}
def get_int(x):
return map_dict[x]
def weighting(a,b):
return a*10 + b
if obj_str.find(".") != -1:
obj_list = obj_str.split(".")
return reduce(weighting, map(get_int, obj_list[0])) + reduce(weighting, map(get_int, obj_list[1])) / (
10 ** len(obj_list[1]))
return reduce(weighting,map(get_int,obj_str))
str1 = "12345.6789"
print(str_to_num(str1))
>>12345.6789
str2 = "12345"
print(str_to_num(str2))
>>12345
高级函数之filter(function,Iterable)函数
filter
函数和map
函数类似,也是传递一个函数和一个可迭代对象
不同的是map
将值放入函数执行完之后组成一个可迭代对象
而filter
是将值放入函数执行完之后让你的逻辑返回一个布尔值
filter
函数会将函数执行完后返回为True的数据保留下来组成一个可迭代对象
所以需要明确的是filter
函数不改变输入的值,只是用输入的值来做逻辑运算
选出数组中的偶数元素示例:
def select_even(x):
return x%2 == 0
num_list = [1,2,3,4,5]
print(filter(select_even,num_list))
>><filter object at 0x00000000027CC6D8>
print(list(filter(select_even,num_list))) # 需要用list迭代转一下才可以打印出来
>>[2, 4]
示例2:
将数组中的空字符和空格字符串删除
def select_even(x):
return x and x.strip() # 逻辑与运算,若前面值都为True结果为最后一个元素
# 若前面有一个是False,则为False的那个元素
num_list = ["1",""," "," ","5"]
print(list(filter(select_even,num_list))) # "" 0 [] {} None 都会被判定为False
>>['1', '5']
print(0 and 1)
>> 0
print(1 and 2)
>> 2
高级函数之sorted(Iterable,key=None,reverse=False)函数
sorted
函数接收一个可迭代序列,和一个key -- 排序的规则 和reverse是否翻转顺序,默认False
sorted
函数会迭代可迭代对象,将每一个元素传入规则中处理,处理的过程中会加一层映射,即原数据和处理过的数据的对应关系.sorted
按照处理后的数据排序,然后根据映射将原始数据也按照这个顺序展示.
注意:
sorted
函数不改变原始数据,生成一份新的数据返回,需要变量接收
示例一:
直接排序数字列表
num_list = [3,21,1,42,2]
print(sorted(num_list))
>>[1, 2, 3, 21, 42]
print(sorted(num_list,reverse=True))
>>[42, 21, 3, 2, 1]
print(num_list)
>>[3, 21, 1, 42, 2]
示例二:
排序字符串,默认按照ASCII码排序
str_list = ["A","c","B"]
print(sorted(str_list))
>>['A', 'B', 'c']
print(sorted(str_list,reverse=True))
>>['c', 'B', 'A']
print(str_list)
>>
给字符串的排序加一个规则,即忽略大小写,让字符串同时大写或者小写
str_list = ["A","c","B"]
print(sorted(str_list,key=lambda x:x.lower()))
# sorted函数会迭代每一个元素传入到key中,而key又是一个匿名函数,所有每一个元素被传递给x变量
>>['A', 'B', 'c']
print(sorted(str_list,key=lambda x:x.upper()))
>>['A', 'B', 'c']
示例三:
按照字典的key排序
dict_dict = {"a":3,"c":1,"b":2}
print(dict_dict.items()) # dict_items对象,不支持下标索引数据,只支持for迭代
>>dict_items([('a', 3), ('c', 1), ('b', 2)])
print(sorted(dict_dict)) # 以字典的key进行排序得到排序后的key组成的列表
>>['a', 'b', 'c']
print(sorted(dict_dict.items())) # 以key排序得到 元祖形式的键值对组成的列表
>>[('a', 3), ('b', 2), ('c', 1)]
print(sorted(dict_dict.items(),key=lambda x:x[1])) # value排序
>>[('c', 1), ('b', 2), ('a', 3)]