如何在python中创建自己的map()函数

时间:2017-12-28 10:59:04

标签: python list map-function

我正在尝试在python中创建内置的map()函数。 这可能是尝试:

def mapper(func, *sequences):


   if len(sequences) > 1:
       while True:
          list.append(func(sequences[0][0],sequences[0][0],))
       return list

return list

但我真的卡住了,因为如果用户提供100个参数,我该如何处理这些

2 个答案:

答案 0 :(得分:4)

调用该函数时使用星号*

def mapper(func, *sequences):
       result = []
       if len(sequences) > 0:
           minl = min(len(subseq) for subseq in sequences)
           for i in range(minl):
              result.append(func(*[subseq[i] for subseq in sequences]))
       return result

这会产生:

>>> import operator
>>> mapper(operator.add, [1,2,4], [3,6,9])
[4, 8, 13]

通过使用星号,我们在函数调用中将iterable解压缩为单独的参数。

请注意,这仍然不完全等效,因为:

  1. sequences应该是 iterables ,而不是本身的列表,所以我们不能总是索引;和
  2. map的结果也是可迭代的,因此不是列表。
  3. 更多 - 类map函数将是:

    def mapper(func, *sequences):
        if not sequences:
            raise TypeError('Mapper should have at least two parameters')
        iters = [iter(seq) for seq in sequences]
        while True:
            yield func(*[next(it) for it in iters])

    但是请注意,大多数Python解释器将比Python代码更接近解释器实现map,因此使用内置map肯定比编写自己的更有效。

      

    NB :最好不要使用listsetdict等变量名称,因为这些名称会覆盖(此处为本地)引用list类型。因此,list(some_iterable)之类的通话将不再有效。

答案 1 :(得分:0)

将一个或多个序列逻辑的合并部分分离出来更容易阅读和理解。

def mapper(func, *args):
    for i in zip(*args):
        yield func(*i)

在这里,我们使用内置的Python zip 如果您想用自己的实现完全替换它,请使用下面的zip函数替换为zipper

def zipper(*args):
    for i in range(len(args[0])):
        index_elements = []
        for arg in args:
            index_elements.append(arg[i])
        yield positional_elements