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写的

原文地址:https://www.cnblogs.com/ShawSpring/p/10837728.html

时间: 2024-08-30 09:07:46

python 自己实现map的相关文章

python——lambda,filter,map,reduce

lambda函数 使用方法:lambda [arg1[,arg2,arg3,...,argn]] : expression 如: add = lambda(x,y:x+y) add(1,2) 结果为1+2=3 filter函数 filter(bool_func,seq) 此函数的功能相当于过滤器,通过返回值为bool的函数bool_func来迭代遍历seq中的每个元素: 结果返回一个seq中使bool_func返回值为true的元素的序列. filter(lambda x : x%2 == 0,

【python】filter,map和reduce函数介绍

filter(function, iterable)map(function, iterable)reduce(function, sequence) filter将 function依次作用于iterable的每个元素,如果返回值为true, 保留元素,否则从iterable里面删除.function必须返回是一个bool类型的函数.例如: def test(x): return (x > 3) filter(test, [1, 2, 3, 4, 5]) =====> [4, 5] map将

Python函数式编程——map()、reduce()

文章来源:http://www.pythoner.com/46.html 提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理大规模海量数据,并在之后广泛的应用于Google的各项应用中,2006年Apache的Hadoop项目[2]正式将MapReduce纳入到项目中. 好吧,闲话少说,今天要介绍的是Python函数式编程中的另外两个内建函数map()和reduce(),而不是Google的MapReduce. 1.ma

Python中的Map/Reduce

MapReduce是一种函数式编程模型,用于大规模数据集(大于1TB)的并行运算.概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性.它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上. Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组. 然而在python中,ma

python中的map()函数

MapReduce的设计灵感来自于函数式编程,这里不打算提MapReduce,就拿python中的map()函数来学习一下. 文档中的介绍在这里: map(function, iterable, ...) Apply function to every item of iterable and return a list of the results. If additional iterable arguments are passed, function must take that man

js中map和python中的map

js 中的map: 由于map()方法定义在JavaScript的Array中,我们调用Array的map()方法,传入我们自己的函数,就得到了一个新的Array作为结果: function pow(x) { return x * x; } var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81] var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];

python中 Lambda,Map,Filter,Itertools,Generator高级函数的用法

Lambda 函数 Lambda 函数是一种比较小的匿名函数--匿名是指它实际上没有函数名. Python 函数通常使用 def a_function_name() 样式来定义,但对于 lambda 函数,我们根本没为它命名.这是因为 lambda 函数的功能是执行某种简单的表达式或运算,而无需完全定义函数. lambda 函数可以使用任意数量的参数,但表达式只能有一个. x = lambda a, b : a * b print(x(5, 6)) # prints '30' x = lambd

python进阶一(函数式编程)【2-2 python中的map函数】

2-2 python中的map()函数 python中map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 原文地址:https://www.cnblogs.com/ucasljq/p/11609544.html

python zip,lambda,map函数

python zip,lambda,map函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 感谢莫烦老师 详情 zip 通常用于将两个列表合并在一起以同时进行迭代遍历 注意:直接使用zip输出结果为<zip at 0x1d72cf30bc8>,要配合list一起使用 a = [1, 2, 3] b = [4, 5, 6] zip(a,b) # <zip at 0x1d72cf30bc8> print(list(zip(a, b))) # [(1, 4), (2, 5),