python 고급 함수 map/reduce 간단하게 알 아 보기

고급 함수 map/reduce
Python 에 map()와 reduce()함 수 를 만 들 었 습 니 다.
지도 부터 봅 시다.map()함 수 는 두 개의 인 자 를 받 습 니 다.하 나 는 함수 이 고 하 나 는 Iterable 입 니 다.map 는 들 어 오 는 함 수 를 순서대로 배열 의 모든 요소 에 작용 하고 결 과 를 새로운 Iterator 로 되 돌려 줍 니 다.
예 를 들 어 예 를 들 어 우 리 는 함수 f(x)=x2 가 있 는데 이 함 수 를 하나의 list[1,2,3,4,5,6,7,8,9]에 작용 하려 면 map()로 다음 과 같이 실현 할 수 있다.

현재,우 리 는 Python 코드 로 실현 합 니 다.

def f(x):
return x * x
r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print list(r)
실행 결과:

[1, 4, 9, 16, 25, 36, 49, 64, 81]
Process finished with exit code 0
map()가 들 어 오 는 첫 번 째 매개 변 수 는 f,즉 함수 대상 자체 입 니 다.결과 r 는 Iterator 이 고 Iterator 는 타성 서열 이기 때문에 list()함 수 를 통 해 전체 서열 을 계산 하고 list 로 되 돌려 줍 니 다.
map()함수 가 필요 없 이 순환 을 써 도 결 과 를 계산 할 수 있다 고 생각 할 수 있 습 니 다.

L = []
for n in [1, 2, 3, 4, 5, 6, 7, 8, 9]:
L.append(f(n))
print L
그 럴 수 있 습 니 다.하지만 위의 순환 코드 에서'f(x)를 list 에 작용 하 는 모든 요 소 를 한눈 에 보고 결 과 를 새로운 list 로 만 들 수 있 습 니까?'
그래서 map()는 고급 함수 로 서 사실상 연산 규칙 을 추상 화 했다.따라서 우 리 는 간단 한 f(x)=x2 를 계산 할 수 있 을 뿐만 아니 라 임의의 복잡 한 함수 도 계산 할 수 있다.예 를 들 어 이 list 의 모든 숫자 를 문자열 로 바 꿀 수 있다.

print list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
실행 결과:

['1', '2', '3', '4', '5', '6', '7', '8', '9']
Process finished with exit code 0
코드 한 줄 만 필요 합 니 다.
reduce 의 용법 을 다시 보다.reduce 는 하나의 함 수 를 하나의 서열[x1,x2,x3,...]에 작용 합 니 다.이 함 수 는 반드시 두 개의 매개 변 수 를 받 아야 합 니 다.reduce 는 결 과 를 계속 서열 의 다음 요 소 를 누적 계산 해 야 합 니 다.그 효 과 는 다음 과 같 습 니 다.

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
예 를 들 어 하나의 서열 에 대해 화 해 를 구하 면 reduce 로 실현 할 수 있다.

from functools import reduce
def add(x, y):
return x + y
print reduce(add, [1, 3, 5, 7, 9])
실행 결과:

25
Process finished with exit code 0
물론 구 와 연산 은 Python 내 에 함수 sum()을 직접 만 들 수 있 으 며 reduce 를 사용 할 필요 가 없습니다.
그러나 서열[1,3,5,7,9]을 정수 13579 로 바 꾸 려 면 reduce 가 도움 이 될 수 있다.

from functools import reduce
def fn(x, y):
return x * 10 + y
print reduce(fn, [1, 3, 5, 7, 9])
실행 결과:

13579
Process finished with exit code 0
이 예 자 체 는 그다지 쓸모 가 없 지만 문자열 str 도 하나의 서열 임 을 감안 하여 위의 예 를 약간 바 꾸 고 map()에 맞 추 면 str 를 int 로 변환 하 는 함 수 를 쓸 수 있 습 니 다.

def fn(x, y):
return x * 10 + y
def char2num(s):
digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
return digits[s]
print reduce(fn, map(char2num, '13579'))
실행 결과:

13579
Process finished with exit code 0
str2int 로 정리 한 함 수 는:

from functools import reduce
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def str2int(s):
def fn(x, y):
return x * 10 + y
def char2num(s):
return DIGITS[s]
return reduce(fn, map(char2num, s))
lambda 함수 로 더욱 간소화 할 수 있 습 니 다.

from functools import reduce
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def char2num(s):
return DIGITS[s]
def str2int(s):
return reduce(lambda x, y: x * 10 + y, map(char2num, s))
즉,Python 이 int()함 수 를 제공 하지 않 았 다 고 가정 하면 문자열 을 정수 로 바 꾸 는 함 수 를 스스로 쓸 수 있 고 몇 줄 의 코드 만 필요 합 니 다!
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기