[python] 파이썬에서 동일하게 유지되는 함수를 매핑하기 위해 여러 인수를 수행하는 방법은 무엇입니까?

다음과 같이 함수가 추가되었다고 가정 해 봅시다.

def add(x, y):
    return x + y

배열에 map 함수를 적용하고 싶습니다

map(add, [1, 2, 3], 2)

의미는 배열의 모든 요소에 2를 추가하고 싶습니다. 그러나이 map함수에는 세 번째 인수에도 목록이 필요합니다.

참고 : 간단하게 추가 예제를 작성하고 있습니다. 내 원래 기능은 훨씬 더 복잡합니다. 물론 y추가 기능 의 기본값을 설정하는 옵션은 모든 호출에 대해 변경되므로 의문의 여지가 없습니다.



답변

하나의 옵션은 목록 이해입니다.

[add(x, 2) for x in [1, 2, 3]]

더 많은 옵션 :

a = [1, 2, 3]

import functools
map(functools.partial(add, y=2), a)

import itertools
map(add, a, itertools.repeat(2, len(a)))


답변

문서는 이것이 다음의 주요 용도라고 명시 적으로 제안합니다 itertools.repeat.

반복해서 객체를 반환하는 반복자를 만듭니다. times 인수가 지정되지 않으면 무한정 실행됩니다. map()호출 된 함수 에 대한 불변 매개 변수 에 대한 인수로 사용됩니다 . zip()튜플 레코드의 고정 부분을 만드는 데에도 사용됩니다 .

그리고 패스에 대한 이유가되지 len([1,2,3])는 AS times인수; map첫 번째 iterable이 소비되는 즉시 중지되므로 무한 iterable은 완벽하게 좋습니다.

>>> from operator import add
>>> from itertools import repeat
>>> list(map(add, [1,2,3], repeat(4)))
[5, 6, 7]

실제로 이것은 repeat문서 의 예제와 동일합니다 .

>>> list(map(pow, range(10), repeat(2)))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

이것은 파이썬 반복자 용어로 완벽하게 읽을 수있는 멋진 게으른 기능 언어 솔루션을 만듭니다.


답변

목록 이해력을 사용하십시오.

[x + 2 for x in [1, 2, 3]]

당신이 경우 정말 , 정말 , 정말 사용하려면 map, 그것을 첫 번째 인수로 익명 함수를 제공합니다 :

map(lambda x: x + 2, [1,2,3])


답변

지도에는 여러 개의 인수가 포함될 수 있습니다. 표준 방법은

map(add, a, b)

귀하의 질문에, 그것은

map(add, a, [2]*len(a))


답변

정답은 생각보다 간단합니다. 간단히 :

map(add, [(x, 2) for x in [1,2,3]])

그리고 튜플을 가져 오기 위해 add 구현을 변경하십시오.

def add(t):
   x, y = t
   return x+y

이것은 두 추가 매개 변수가 모두 동적 인 복잡한 사용 사례를 처리 할 수 ​​있습니다.


답변

때로는 클로저 를 사용하여 유사한 상황 (예 : pandas.apply 메소드 사용)을 해결했습니다.

그것들을 사용하기 위해 함수의 래퍼를 동적으로 정의하고 반환하는 함수를 정의하여 효과적으로 매개 변수 중 하나를 상수로 만듭니다.

이 같은:

def add(x, y):
   return x + y

def add_constant(y):
    def f(x):
        return add(x, y)
    return f

그런 다음 주어진 값 add_constant(y)에 추가 y하는 데 사용할 수있는 함수를 반환 합니다.

>>> add_constant(2)(3)
5

매개 변수가 한 번에 하나씩 제공되는 모든 상황에서 사용할 수 있습니다.

>>> map(add_constant(2), [1,2,3])
[3, 4, 5]

편집하다

다른 곳에서 클로저 함수를 작성하지 않으려는 경우 람다 함수를 사용하여 즉시이를 작성할 수 있습니다.

>>> map(lambda x: add(x, 2), [1, 2, 3])
[3, 4, 5]


답변

사용 가능한 경우 numpy를 사용하는 것이 좋습니다. 이러한 유형의 작업에는 매우 빠릅니다.

>>> import numpy
>>> numpy.array([1,2,3]) + 2
array([3, 4, 5])

이것은 실제 응용 프로그램이 수학 연산을 수행한다고 가정합니다 (벡터화 가능).