python 中的map,imap,startmap

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hehe123456ZXC/article/details/52597448

先来看看map
其定义为map(function,iterable1,iterable2, ……….)
针对iterable中的每个元素执行function函数,返回function执行结果的一个list列表,如果iterable不止一个,那么并行的选取每个iterable中元素,作为function的参数,然后执行function,下面看看列子:

a=[1,2,3]
fun1=lambda a:a**a
sum=map(fun1,a)
print(type(sum))
print(sum)

打印的结果:
<type 'list'>
[1, 4, 27]

其中iterable必须是可迭代对象,像list,set,dict都可以。

下面是有多个iterable的例子:

a=[1,2,3]
b=[1,2,3]
c=[1,2,3]
#a=map(iter,a,b,c)
fun=lambda a,b,c:a+b+c
sum=map(fun,a,b,c)
print(type(sum))
print(sum)
fun1=lambda a:a
print(a)

打印结果:
<type 'list'>
[3, 6, 9]

从结果可看出,针对每个iterable中相同位置的元素执行function ,[1+1+1 ,2+2+2 ,3+3+3]=[3,6,9]。

有一种特殊情况,如果map中function为None:

a=[1,2,3]
b=[1,2,3]
c=[1,2,3]
#a=map(iter,a,b,c)
fun=lambda a,b,c:a+b+c
sum=map(None,a,b,c)
print(type(sum))
print(sum)

打印结果:
<type 'list'>
[(1, 1, 1), (2, 2, 2), (3, 3, 3)]

从打印结果可以看出,map返回的同样是列表,但是列表中每个元素是所有iterable中同位置对应的元素组成的元祖。

再来看看imap

imap的重点是yield,不明白的可以去我的上一篇blog查查

def imap(function, *iterables):
    # imap(pow, (2,3,10), (5,2,3)) --> 32 9 1000
    iterables = map(iter, iterables)
    while True:
        args = [next(it) for it in iterables]
        if function is None:
            yield tuple(args)
        else:
            yield function(*args)
a=[1,2,3]
b=[1,2,3]
c=[1,2,3]
fun=lambda a,b,c:a+b+c
def imapp(fun, *iterables):
    a = map(iter, iterables)
    while True:
        args = [next(it) for it in a]
        if fun is None:
            yield tuple(args)
        else:
            yield fun(*args)

print(imapp(fun, a, b, c))
for item in imapp(fun,a,b,c):
    print(item)

打印结果:
<generator object imapp at 0x0000000003C7CEA0>
3
6
9

从结果看出和map基本相似,imap中同样使用了map。imapp反回了一个生成器generator。生成器函数在Python中与迭代器协议的概念联系在一起。简而言之,包含yield语句的函数会被特地编译成生成器。当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口。函数也许会有个return语句,但它的作用是用来yield产生值的。

不像一般的函数会生成值后退出,生成器函数在生成值后会自动挂起并暂停他们的执行和状态,他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效。

其中a=map(iter,iterables)中返回一个list,list中元素为listiterator object。然后后面的for循环针对每个object执行next(object)获取元素。

再来说说starmap

def starmap(function, iterable):
    # starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000
    for args in iterable:
        yield function(*args)

从其实现可以看出,istartmap只有一个iterable,其中function的参数已经组织在了元祖中,而不是和map似的,需要运行时再guoup在一起。

猜你喜欢

转载自blog.csdn.net/hehe123456ZXC/article/details/52597448