python的 map 和 zip

这两天看Python Cookbook的第四章的时候,偶尔会有这两个内建函数蹦出来。于是本着深入了解就是一种学习的态度了解了一下。

首先,比较详细的介绍的话,直接在你自己的手里的交互式下用help(),这里就不多说了。


zip, zip(seq0,...):
    对(多个)序列(list, tuple)进行“压包”操作,返回一个以元组为单元的list, 如 a = [1,2,3], b = ('a','b','c'), ret = zip(a,b), 则 ret = [(1,'a'), (2,'b'), (3, 'c')]。
    允许多个序列作为参数, 当只输入一个序列时,如 a = [1,2,3], ret = zip(a), 则 ret = [(1,),(2,),(3,)]。
    返回的list的长度将取决于输入的“短板”,即长度最短的那个序列。
    
map, map(func, seq0, ...):
    对(多个)序列(list,tuple)“压包”,然后作为参数调用func,将返回结果打包为一个以元组为单元的list。
    一个例子:
    >>>flag = 0
    >>>def func(*args):
    ...    try:
    ...        global flag
    ...        flag += 1
    ...        return args[0]+10, args[1].upper, flag
    ...    except(TypeError):
    ...        return args[0], args[1], flag
    >>>lista = [1,2,3]
    >>>listb = ['a','b','c','d']
    >>>listc = [100,200,300]
    >>>ret = map(func, lista, listb, listc)
    >>>ret
    [(11,'A',1), (12,'B',2), (13,'C',3), (None,'d',4)]


    从这个例子可以看出一下几点:
        0,map返回的结果(list)主要以func的行为为依据。 func里没有对args[2]进行返回,所以ret里没有listc的内容。
        1,返回的list的长度以输入的最长的序列为标准进行补齐。 lista在ret[3]上被“补充”了一个None。
        2,先补齐,再传参,最后输出。 如果没有try--except的话,本例会报错TypeError。似乎可以说明先进行了补齐,然后再传参。
        3,将欲打包的结果,逐个传参调用func。 全局变量flag在func每运行一次的时候,都发生了变化。


    另外,当func为None,并且输入的序列数至少为2时,map“退化”为zip; fun为None,只属于一个序列时,如 ret = map(None, alist), 则 ret == alist 为True, ret is alist 为False。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值