[Python 심화] Map 함수

허상범·2023년 3월 23일
0
post-thumbnail

역시 두뇌 회전, 사고력 연습에는 파이썬만한게 없는 것 같다.

파이썬에서 Map(), Zip() 함수는 매우 많은 용처를 갖고 있다. Map()의 경우에는 특정 데이터에 대해 연산을 깔끔하게 시켜주고 싶을 때, Zip()의 경우에는 배열을 2차원으로 구성해내고 싶을때 쓸 수 있던 것 같다.

프로그래밍에서 어떤 함수라는 것은 반복된 작업을 피하거나 생산성을 최적화하기 위해 필요한 연장, 도구이다. 따라서, 데이터를 가지고 특정 작업을 할 때 "아, 이 작업은 W라는 작업이고 a1, a2라는 행위가 필요하기 때문에 이를 구조적으로 수행할 수 있는 F라는 함수가 필요하지" 정도의 구조적, 정의 기반의 사고가 나름대로 많이 필요하고 유용한 것 같다.

오늘은 1) 2개 이상의 데이터에 대해, 2) 함수를 적용시켜줄 필요가 있을 때 사용하는 map() 함수를 알아보자.

1. Map() 함수

기본 구조

map(function, iterable)

첫번째 인자로는 함수가 오고, 두번째 인자로는 반복 가능한 자료형(리스트 or 튜플)이 오게 된다.

Map() 함수의 동작 원리는 1) 두번째 인자로 들어온 자료형(리스트 or 튜플)을 2) 첫번째 인자의 함수에 하나씩 넣어서 실행시키는 구조다.

예를 들어, f()는 +1을 시켜주는 함수, list는 [1,2,3]로 정의해보면 map(f(), list)의 실행 결과는 [2,3,4]로 반환이 될 것이다. 단순 반복문을 작성할 때보다 훨씬 적은 코드를 써도 무방한, 아주 좋은 상황이다.

2. 예제 (백준 대소비교 알고리즘)

지금 보면 내가 이 코드를 어떻게 쓴건가 싶다.

사실 대소비교 조건문은 전혀 어렵지 않지만, 정수 a와 b를 입력(input)한 후 이에 대한 대소비교에 어려움을 겪었던 모양이다.

처음에는 이런 형태로 코드를 만들었다.

a = int(input())
b = int(input())

if a>b:
    print('>')
elif a==b:
    print('==')
else:
    print('<')

이렇게 하면 jupyter notebook 환경에서는 무리없이 원하는 연산과 과업을 수행할 수 있지만, 백준 테스트 채점 결과로는 ValueError가 나왔다.

그래서 조금 더 세련되게 아래와 같이 묶어준 것 같다.

a, b = map(int, input().split())

if a>b:
    print('>')
elif a==b:
    print('==')
else:
    print('<')

input() 뒤에 split() 메서드를 추가한 이유는 split()의 결과값이 리스트로 반환되기 때문이다.

map(f, d)에서 d는 리스트(또는 튜플)여야 한다. 또한, a와 b를 함께 입력(input)받기 때문에 이를 공백 기준으로 끊어서 리스트로 처리한 후 int로 각각 처리하여 변수로 바인딩해낼 수 있는 방법이 위 방법 밖엔 없었다.

순서

i) input().split() 실행 => 입력받은 a,b 값을 split() 메서드를 통해 [a,b]로 만들어줌
ii) int() 실행 => [a, b]를 정수 a, b로 바인딩함
iii) 조건문 실행

역시, 코딩을 하면서 겪는 논리적, 구조적 사고 과정은 충분히 재밌다.

3. 다음 주제

  • Zip() 함수
  • lambda() 함수

Reference

profile
Engineering & Science, Since 2021 | Finance, Backend, Data

0개의 댓글