이전에 배웠던 내용을 바탕으로 특정 숫자가 홀수인지 짝수인지를 출력하는 코드를 작성해보자
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줄을 한줄로 줄여썼다라는 점에서 의의가 있다
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]
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까지 성인/청소년을 구분)
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예시 코드와 같은 결과를 얻게됨을 알 수 있다
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로 이루어진 딕셔너리 리스트를 얻게 되었다