python 自己实现map
Posted shawspring
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 自己实现map相关的知识,希望对你有一定的参考价值。
python 自己实现map
先来看看map的本来表现
l =[1, 2, 3, 4, 5, 6, 7, 8, 9]
m = map(str,l)
print(next(m))
print(next(m))
print(list(m))
1
2
['3', '4', '5', '6', '7', '8', '9']
map产生的是一个Iterator,是个惰性序列,next(m)会消耗它,可以使用list(m)将整个序列都计算出来
看看智能提示 怎么介绍的
class map(func, iterables)
map(func, iterables) --> map object
Make an iterator that computes the function using arguments from each of the iterables.
Stops when the shortest iterable is exhausted.
这是一个可调用的类--->一个map对象,本质是一个Iterator
from collections.abc import Iterator
print(isinstance(m,Iterator))
True
注意到map的参数是 *iterables, 那我多拿传几个Iterable试试
m = map(lambda x,y:x+y,[1,3,5,7],[2,4,8,10,12])
print(list(m))
[3, 7, 13, 17]
map内部应该是 这么调用的: func(1,2) func(3,4) func(5,8) func(7,10) 多余的舍弃
这么将 list1,list2,list3...中的元素按顺序归队呢? zip
list1 = [1,2,3]
list2 = [2,3,4]
list3 = [3,4,5]
z = zip(list1,list2,list3)
print(list(z)) # zip返回的也是一个iterator
[(1, 2, 3), (2, 3, 4), (3, 4, 5)]
def mymap(func, *iterables):
res = []
for args in zip(*iterables): ## 相当于zip(list1,list2,list3....)
res.append(func(*args)) ## 将(1,2,3)=> 1,2,3 解捆绑
return res
def add(*args):
sum = 0
for i in args:
sum+=i
return sum
res = mymap(add,list1,list2,list3)
print(res)
[6, 9, 12]
注意到返回的就是一个list,而不是迭代器, 使用yield把每次func调用结果yied出来就成了一个生成器(迭代器)
def mymap(func, *iterables):
for args in zip(*iterables):
yield func(*args)
m = mymap(add,list1,list2,list3)
from collections import Iterator
print(isinstance(m,Iterator))
True
print(next(m))
6
print(list(m))
[9, 12]
当然,这只是一种模拟,cpython内部应该会是用c写的
以上是关于python 自己实现map的主要内容,如果未能解决你的问题,请参考以下文章
ID、标签 null 或父 ID 与 com.google.android.gms.maps.MapFragment 的另一个片段重复