先来看看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在一起。