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

Mak*_*ata 4 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
Run Code Online (Sandbox Code Playgroud)

但我真的很困惑,因为如果用户给出例如 100 个参数,我该如何处理这些参数?

Wil*_*sem 5

调用该函数时使用星号:*

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
Run Code Online (Sandbox Code Playgroud)

这会产生:

>>> import operator
>>> mapper(operator.add, [1,2,4], [3,6,9])
[4, 8, 13]
Run Code Online (Sandbox Code Playgroud)

通过使用星号,我们将可迭代对象解压为函数调用中的单独参数。

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

  1. 应该sequencesiterables,而不是本身的列表,所以我们不能总是索引;和
  2. map中a 的结果也是一个可迭代的,所以不是一个列表。

一个更像map函数是:

def mapper(func, *sequences):
    if not sequences:
        raise TypeError('Mapper should have at least two parameters')
    iters = [iter(seq) for seq in sequences]
    try:
        while True:
            yield func(*[next(it) for it in iters])
    except StopIteration:
        pass
Run Code Online (Sandbox Code Playgroud)

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

注意:最好不要使用诸如listsetdict等变量名称,因为这些名称将覆盖(此处为本地)对类型的引用list。结果,像这样的调用list(some_iterable)将不再起作用。