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

    
    
  • 相关阅读:
    Linux常用指令
    【OOM】记录一次生产上的OutOfMemory解决过程
    (转载)springboot + rabbitmq发送邮件(保证消息100%投递成功并被消费)
    【Idea】实用插件列表
    【工厂模式】-企业微信应用配置代码优化
    【日志追踪】(微服务应用和单体应用)-logback中的MDC机制
    行内元素进行绝对(absolute),固定(fixed)定位后会变成块级元素·
    JQuery
    单行文字居中
    后代元素 span:first-child{...}
  • 原文地址:https://www.cnblogs.com/ShawSpring/p/10837728.html
Copyright © 2020-2023  润新知