[내일배움캠프] 파이썬 문법 기초(7) - 한줄의 마법, map/filter/lambda

재명·2021년 12월 14일
0

Python

목록 보기
7/8
post-thumbnail

1-15 한줄의 마법


1) 조건문을 한줄로 작성하는 케이스

이전에 배웠던 내용을 바탕으로 특정 숫자가 홀수인지 짝수인지를 출력하는 코드를 작성해보자

num = 3

if num % 2 == 0:
    result = '짝수'
else:
    result = '홀수'
    
print(f'{num}은 {result}입니다')

>>> 3은 홀수입니다

#이처럼 나타내는것도 여전히 간결하고 훌륭한 작성법이라 볼수 있지만, minimalist들은 뭔가 좀더 압축하고싶다는 욕구를 참을 수 없을것이다. 그런경우

num = 3
result = ('짝수' if num % 2 == 0 else '홀수')

print(f'{num}은 {result}입니다)

>>> 3은 홀수입니다

#이와같이 문장을 압축해서 쓸수도 있는데, 해석해보면 사실상 똑같은 로직으로 홀/짝을 구분하는 것이나 조건문으로 구분된 4줄을 한줄로 줄여썼다라는 점에서 의의가 있다



2) 반복문을 한 줄로 줄여쓰는 케이스

a_list = [1,3,2,5,1,2]
b_list = []

for a in a_list:
    b_list.append(a*2)
    
print(b_list)

>>> [2,6,4,10,2,4]

#a_list에 담겨있던 각 자료들을 2로 곱하여 b_list에 담아준 형태이다. 이 또한 한 줄로 줄여 쓸 수 있다

a_list = [1,3,2,5,1,2]
b_list = [i*2 for i in a_list]
    
print(b_list)

>>> [2,6,4,10,2,4]

사실 풀어쓰던, 한 줄로 줄여쓰던 큰 차이는 없으며 가독성의 측면에서 사용자의 편의에 따라 선택할 수 있다는 점만 기억하면 될 것 같다.


1-16 map/filter/lambda


1) map

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

def check_adult(person):
    if person['age'] > 20:
        return '성인'
    else:
        return '청소년'
        
result = map(check_adult, people)
print(list(result))

>>>
['청소년', '성인', '청소년', '청소년', '성인', '성인', '성인', '성인']

1-1) 어떤 배열을 가지고 있는 모집단에 대하여 각 배열을 돌면서 그 안에 담긴 자료값들을 순회시켜 새로운 값을 얻어내는 메서드를 map이라고 한다.

1-2) 해당 코드 안에서는 check_adult라는 함수를 만들어 20살을 기준으로 성인/청소년을 나누었고

1-3) map메서드를 통해 people이라는 모집단 배열을 돌며 각 항목에 대해 check_adult함수를 적용시킨 모습이다 (bob부터 queen까지 성인/청소년을 구분)



2) lambda

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]
        
result = map(lambda person: ('성인' if person['age'] > 20 else '청소년'), people)

print(list(result))

>>> 
['청소년', '성인', '청소년', '청소년', '성인', '성인', '성인', '성인']

2-1) lambda식은 이전의 한줄축약형 코딩방식처럼 자칫 길어질 수 있는 형태를
lambda (매개변수):(리턴 값)의 형태로 축약해 주는것이다

2-2) map메서드에서 사용했던 함수의 조건문 역시 lambda식으로 변환이 가능하다 (반복문 또한 가능)

2-3) people의 각 배열을 돌면서 얻어낸 매개변수 person에 조건을 추가하여 20세 이상이면 '성인'을 그 외에는 '청소년'을 리턴하도록 하자, 상단의 map예시 코드와 같은 결과를 얻게됨을 알 수 있다



3) filter

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]
        
result = filter(lambda x: x['age'] > 20 , people)

print(list(result))

>>> 
[{'name': 'carry', 'age': 38}, {'name': 'ben', 'age': 27}, {'name': 'bobby', 'age': 57}, {'name': 'red', 'age': 32}, {'name': 'queen', 'age': 25}]

3-1) 명칭에서부터 알 수 있다시피 배열 중 원하는 속성을 가진 타겟을 선별하기 위한 메서드이다

3-2) 조건문과 반복문의 조합으로도 위와같은 결과를 만들어 낼 수 있겠지만, 사용하다 보면 filter를 사용하는 편이 좀더 간편하고 짧은 코드로 완성시킬 수 있다

3-3) lambda식을 통해 people의 배열 중 'age'가 20을 초과하는 변수들만을 필터링 하여 리스트의 형태로 반환하도록 했기 때문에, 위와 같이 성인인 사람들의 name,age로 이루어진 딕셔너리 리스트를 얻게 되었다

profile
개발자가 되고싶은 늦깎이 코린이

0개의 댓글

관련 채용 정보