셀프스터디/파이썬

코드업 기초 100제로 파이썬 기초 개념 복습하기 (map, lambda, filter 함수)

티로즈 2022. 1. 17. 19:20

인간은 정말로 망각의 동물이다
회사에서 나름 반 년 넘는 기간동안 파이썬 공부를 했음에도,
Cos Pro 1급 준비한다고 따로 좀 더 공부를 했음에도..!
아직도 손에 안익은 파이썬 함수가 많다.

다시 까먹지 않도록 잘 정리해둬야지.

1. map() : 객체 내 원소들에게 함수를 각각 적용한 결과 값을 반환하는 함수

[형태] map(적용할 함수, 대상 객체(iterable)) → 결과값은 인덱싱/슬라이싱 불가!

map의 대상 객체가 'iterable' 해야 한다는 것은 객체 속 요소들을 순차적으로 접근 가능해야 한다는 의미로,
튜플, 리스트(문자열), range 등등의 객체를 생각하면 된다.

그리고 map의 결과 값은 그 자체로 인덱싱이나 슬라이싱은 불가하므로,
필요하다면 list(), tuple() 등의 형 변환을 해줘야 함
# 파이썬 map 함수 사용 예시 int_num = map(int, input().split()) # 입력 예시 : 1 3 5 # 왼쪽의 변수(int_num)을 입력값의 갯수만큼 써주면 각각의 정수들이 a, b, c에 저장된다 a, b, c = map(int, input().split())
위 코드를 해석해보면,
input().split() => 띄어쓰기 기준으로 입력 받음(숫자를 입력 받는다고 하면..)
input()은 무조건 str형을 반환하기 때문에, 원래는 string 리스트가 반환 될 것이다.
여기에 int 함수를 적용한 것이 최종 결과 값이 되고, int_num에 저장됨

2. filter() : 대상 객체에서 조건에 맞는 원소만 반환하는 함수

[형태] filter(조건 함수, 대상 객체(iterable)) →결과값은 인덱싱/슬라이싱 불가!

파이썬에서 map/lambda 함수와 함께 유용하게 쓰이는 함수다.
C, C++, JAVA 등에서는 여러 함수를 적용하거나, 꽤나 긴 코딩이 필요한 상황에 대해서
딱 한줄로 처리가 가능하게 만들 수 있는 함수

조건 함수에 대해서 'TRUE'인 요소만(만족하는 값) 대상 객체에서 반환한다.

그리고 map과 마찬가지로, filter 함수 결과 값은 그 자체로 인덱싱이나 슬라이싱은 불가하므로,
필요하다면 list(), tuple() 등의 형 변환을 해줘야 함
# 파이썬 filter 함수 사용 예시 (lambda 함수는 3번 설명 참고) # 홀수만 찾아내기 odd_num = filter(lambda x:x%2==1, [1, 2, 5, 6, 8]) print(odd_num) # 1, 5
위 코드를 해석해보면,
filter(lambda x:x%2==1,) [1, 2, 5, 6, 8]=> lambda 함수를 이용해서, 2로 나눈 나머지가 1인(홀수) 경우에만 TRUE 출력

[1, 2, 5, 6, 8] 이라는 정수 리스트가 대상 객체가 되므로,
여기에서 홀수인 1, 5만 최종 반환된다.

3. lambda 함수 : 입력 변수 여러 개, 함수식은 하나만 쓸 수 있는 사용자 정의 함수

[형태] lambda 매개변수 : 함수식

주로 filter 함수의 '조건 함수' 위치에 많이 들어가는 lambda 함수.
얘의 정의를 모르고 코드만 보면 괜히 복잡해 보이는데, 사실 알고 보면 전혀 어렵지 않은 함수
(def 함수를 축약해서 쓰는 형태라고 생각하면 됨!)

하나의 함수식만 쓸 수 있을 때, 유용하게 쓸 수 있는 함수
(하나의 함수식? 예를 들면, 값들의 전체 합이 필요하거나, 값들의 평균이 필요하거나, 가장 큰 값 하나만 필요하거나..등등
여러 과정을 거치지 않고 딱 하나의 과정만 필요한 경우!)

매개변수는 단수 또는 복수로 둘 수 있는데, 변수를 안쓸 수도 있다.
# 파이썬 lambda 함수 사용 예시 # 1. 변수에 할당하기 (변수를 함수명처럼 쓸 수 있음) num_sqrd = lambda x : x*x num_add = lambda a, b : a+b # 변수는 여러개 쓸 수 있음 just_say_hi = lambda : print("hi") # 매개변수 없이 쓸 수도 있음 print(num_sqrd(4)) # 14 print(num_add(2,3)) # 5 just_say_hi() # hi # 2. lambda 함수 자체를 인수로 사용하기 (filter 함수 등) # 1부터 10까지 중에서 2의 배수만 출력하기 result = filter(lambda x : x%2 == 0, range(1,11)) # [ 2, 4, 6, 8, 10 ] # range 함수 : range([시작 수], 원소 개수, [추출 간격]) #[] 표시한 요소는 Optional


1~3번은 필요한 상황에 딱! 쓸 수 있도록 꾸준한 연습이 필요함!

[코드잇] 6021 : [기초-입출력] 단어 1개 입력받아 나누어 출력하기(설명)(py)
for i in input(): # for문에서 in 다음에 리스트를 포함할 수 있어서, input()을 인라인 형태로 작성함 print(i)

[코드잇] 6022 : [기초-입출력] 연월일 입력받아 나누어 출력하기(설명)(py)
s = input() print(s[0:2], s[2:4], s[4:6], sep=' ') # sep='구분자'를 기준으로 문자열로 출력 # sep 활용 예제 print(10, 23, 10, sep=":") # 10:23:10 (시간 형태 출력) print(22, 01, 17, sep="-") # 22-01-17 (날짜 형태 출력)