2017-12-28 6 views
3

python에서 기본 제공 map() 함수를 만들려고합니다.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 

하지만 난 정말 붙어를, 사용자가 난 당신이 함수를 호출 할 때 별표 *를 사용

+0

N.B :'list'와 같은 변수 이름은'list' 유형에 대한 참조를 무시하므로 사용하지 마십시오. –

답변

3

처리 어떻게 예를 들어 100 인수를 제공하는 경우 때문에 : 여기 은 시도 할 수있다

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] 
,

별표를 사용하여 반복 호출을 함수 호출에서 별도의 매개 변수로 압축 해제합니다. 이 때문에, 아직 완전히 일치하지 않는 것을

참고 :

  1. sequences반복 가능 객체하지 자체를 나열해야한다, 그래서 우리가 할 수 항상 인덱스;
  2. map의 결과는 반복 가능이므로 목록이 아닙니다. 대부분의 파이썬 인터프리터 파이썬 코드보다 인터프리터 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])

    참고하지만, 그래서 내장을 사용하는 것이 확실히 더 효율적입니다 :

-like map 기능이 될 것이다 map, 직접 작성하는 것보다

N.B. : list, set, dict 등과 같은 변수 이름을 사용하지 않는 것이 좋습니다. list 유형에 대한 참조가 여기에서 (로컬에서는) 무시됩니다. 결과적으로 list(some_iterable)과 같은 전화는 더 이상 작동하지 않습니다.

관련 문제