目录
map(fn,Iterable)将迭代器数据用函数处理后返回
reduce(fn,Iterable)将迭代器数据按照函数做累计运算,仅返回最后一次的结果
filter(fn,Iterable)将迭代器数据按照函数进行过滤
sorted(Iterable,[key=fn,reverse=False])对迭代器数据按照规则进行排序
map(fn,Iterable)将迭代器数据用函数处理后返回
fn是一个函数名,Iterable是一个迭代对象,可以是list,str,map使用Iterable的元素调用fn函数然后返回一个Iterable
返回的Iterable可以使用list,str给转化一下类型
'''
示例1将整数数组元素依次调用fun函数,函数中对每一个元素+2,然后返回一个新的迭代器,将迭代器使用list进行类型转换并打印
示例2 将字符串调用funstr函数,对字符串的每一个字符进行转大写返回一个迭代器,使用str.join进行字符串转化并打印
'''
def fun(n):
return n+2
def funstr(ch):
return ch.upper()
if __name__ == '__main__':
str = "abcdefg"
arr =[0,1,2,3,4,5,6]
res =map(fun,arr)
print(list(res)) #返回 [2,3,4,5,6,7,8]
resstr =map(funstr,str)
stra =""
print(stra.join(resstr))#返回ABCDE
reduce(fn,Iterable)将迭代器数据按照函数做累计运算,仅返回最后一次的结果
把一个函数fn作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,相当于reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
#reduce示例:数组求和
def sum(a,b):
return a+b
if __name__ == '__main__':
arr =[0,1,2,3,4,5,6]
print(reduce(sum,arr)) #返回21
#求100以内数字之和
print(reduce(sum,list(range(1,100))))
注意:reduce的函数必须要有两个参数
filter(fn,Iterable)将迭代器数据按照函数进行过滤
按照fn过滤Iterable这个迭代器,fn是一个判断函数,比如可以过滤返回偶数
yield n
遇到yield可以理解为return,yeild是生成器中的关键语句,搭配next使用
def _odd_iter():
n = 1
while n<10:
print("begin---")
n = n + 2
yield n
print("---odd")
if __name__ == '__main__':
it = _odd_iter()
print(next(it))
print("############")
print(next(it))
打印结果如下:
解释一下yeild的运行机制,函数里如果有yeild,那这个函数就是一个生成式,就算调用这个函数也不会执行,遇到next,才开始执行函数,哈数中遇到yeild,就return 后面的n,并停止执行。
所以第一个print(next(it))打印的是3,然后main函数打印了###,再次遇到next,就接着上一次函数执行到半截的yeild处接着执行,所以打印了---odd,且满足循环条件,就接着打印了begin---,又遇到了yeild,,继续return n,这时n=5,则打印5,
因为main函数中没有next了,所以就结束了执行
sorted(Iterable,[key=fn,reverse=False])对迭代器数据按照规则进行排序
def by_name(t):
return t[0].lower()
pass
def by_score(t):
return t[1]
pass
if __name__ == '__main__':
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
print(sorted(L,key=by_name))#按照姓名排序
print(sorted(L, key=by_score,reverse=True))#按照成绩从高到低排序
sorted函数是排序函数,可以对字符串数组/元组进行排序,默认字符串是按照字符ASC码进行排序,
sorted函数特别一点就是可以执行排序规则,key参数指定排序规则函数
比如举例中的按照姓名排序,运行时有4步:
1)将迭代器中的元素一个个传入by_name函数,经函数处理后返回全小写的字符串
2)将经fn函数处理过的元素存在临时keys迭代器中 ,即['bob','adam','bart','lisa']
3)sorted()函数按照keys进行排序 ,则keys=['adam','bart','bob','lisa']
4) 按照与原本List的对应关系,按照keys的顺序返回list的内容
'adam'对应('Adam', 92),'bart'对应('Bart', 66),'bob'对应('Bob', 75),'lisa'对应 ('Lisa', 88)
按照['adam','bart','bob','lisa']的顺序返回打印结果为:[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
sorted可以指定是正序还是逆序,再看举例中的按照成绩从高到低排序,数字默认是从低到高排序,现在想要从高到低,需要指定reverse=True,打印结果为[('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]
利用sorted根据字典的key去排序 sortdict =dict(sorted(dicta.items(),key = lambda x:x[0]))
利用sorted根据字典的value去排序 sortdict =dict(sorted(dicta.items(),key = lambda x:x[1]))
dicta.items()将字典的键值对组成元祖,然后sorted(dicta.items(),key = lambda x:x[1])的结果是 [('d', 0), ('a', 1), ('b', 3), ('s', 4)]是元祖列表,利用dict将元祖转为dict
eval求值、去字符串引号
eval有两个用法:
一个是执行运算表达式
print(eval('3+2'))#返回5
n=10
print(eval('n+2'))#返回12
一个是去掉双引号"",常见的就是json字符串转化
str="{'name':'lily','phone':'12312312'}"
dictobj = eval(str)#返回{'name':'lily','phone':'12312312'}
备注:json.loads用于转化key,value被双引号包含的字符串,故json.loads不能用于上面举例中的str转json
zip 用于将两个以上的列表、元祖进行拆分重组
a=[1,3,4,5] b=['a','b','c','d']
如上有两个列表a,b,zip(a,b)可以将两个列表元素按照(a0,b0),(a1,b1)规律重组为一个个元祖,然后返回一个迭代器,可以利用list/tuple进行类型转换
a=[1,3,4,5]
b=['a','b','c','d']
c=[['a','b','c','d'],['e','f','g','h']]
#将两个列表进行重组, a0-b0,a1-b1以此类推组合成一个个元祖,返回一个迭代器,利用list转为列表
resab = list(zip(a,b)) #resab = [(1, 'a'), (3, 'b'), (4, 'c'), (5, 'd')]
#将两个列表进行重组, 因为使用了dict将结果对象转为字典,故b0:a0,b1:a1以此类推组合成一个个字典对象
resabdict = dict(zip(b,a)) #resabdict = {'a': 1, 'b': 3, 'c': 4, 'd': 5}
#使用zip组合二维列表,将二维列表用for循环拆分为一维列表与其他列表进行组合
res = [dict(zip(b[i],a)) for i in range(b.__len__())] #res = [{'a': 1}, {'b': 1}, {'c': 1}, {'d': 1}]
zip的一个应用:实现dict按照value找key,将dict的value与key进行反转
(如果dict数据的value有重复数据,那么只会保留一个)
dicta = {'name':'$name','id':'908980','mobile':'010-123980'}
#使用zip实现通过value找key
dicta_key = dicta.keys()
dicta_value = dicta.values()
rev_dict = dict(zip(dicta_value,dicta_key))
--------------
结果:rev_dict = {'$name': 'name', '908980': 'id', '010-123980': 'mobile'}