python中的几个函数解释 map、reduce、filter、yeild、sorted、eval

目录

map(fn,Iterable)将迭代器数据用函数处理后返回

reduce(fn,Iterable)将迭代器数据按照函数做累计运算,仅返回最后一次的结果

filter(fn,Iterable)将迭代器数据按照函数进行过滤

yield n

sorted(Iterable,[key=fn,reverse=False])对迭代器数据按照规则进行排序

        eval求值、去字符串引号

        zip 用于将两个以上的列表、元祖进行拆分重组



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'}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值