我是靠谱客的博主 秀丽白猫,最近开发中收集的这篇文章主要介绍python map_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_python 自己实现map的全部内容,希望文章能够帮你解决python map_python 自己实现map所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部