[Python] map, filter, zip 함수 이해하기

orangesnail·2025년 2월 28일

Python

목록 보기
6/21

map()

리스트나 튜플의 모든 요소에 어떠한 함수를 적용하고 싶을 때사용한다.
이때 map()함수가 리턴하는 값은 제너레이터 객체이기 때문에 값을 사용하고 싶다면 리스트로 변환 후 사용해야 한다.

nums = [1, 2, 3]
newNums = list(map(lambda x: x * 2, nums))
print(newNums)	# [2, 4, 6] 출력됨

map 함수를 통해 nums 리스트의 모든 요소에 요소를 2배 해서 리턴하는 람다 함수를 적용했다.

🔎 제너레이터 객체

제너레이터 객체는 파이썬의 특별한 문법 구조 중 하나이다. 메모리의 효율성을 위해 (제너레이터)함수의 코드를 조금씩 실행할 때 주로 사용한다.

(* 제너레이터 함수는 함수 안에 yield 키워드를 사용한 함수를 말한다. 제너레이터를 리턴하기 때문에 일반 함수처럼 호출하면 실행되지 않는다. )

nums = [1, 2, 3]
newNums = map(lambda x: x * 2, nums)
print(newNums)

map 함수가 리턴하는 값을 리스트로 변환하지 않고 그대로 출력하면 아래처럼 제너레이터 객체가 출력되는 것을 볼 수 있다.

제너레이터 객체는 아래 코드처럼 next() 함수를 사용해 함수 내부의 코드를 실행한다.

def test():
    print("지점 1️⃣ 통과")
    yield 1

    print("지점 2️⃣ 통과")
    yield 2

    print("지점 3️⃣ 통과")

output = test()

a = next(output)
print(a)

b = next(output)
print(b)

c = next(output)
print(c)

next(output)

실행하면 아래와 같은 결과가 뜬다. 함수 안의 print문들이 조금씩 실행되는 것을 볼 수 있다. 함수를 마지막으로 실행할 때, print("지점 3️⃣ 통과") 아래에 yield 키워드가 없어서 StopIteration 예외가 발생한 것도 확인 가능하다.

filter()

말 그대로 리스트에서 특정 조건을 만족하는 요소만 남겨놓고 싶을 때 사용한다.

nums = [1, 2, 3, 4, 5]
evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens)	# [2, 4] 출력됨

filter 함수를 통해 nums 리스트에서 짝수인 요소만 남겼다.

zip()

여러 리스트를 묶어주는 함수이다. 이때 앞에서부터 순서대로 같은 인덱스끼리 묶인다.

names = ["cat", "dog", "cow"]
age = [4, 6, 7]
zipped = list(zip(names, age))
print(zipped)	# [('cat', 4), ('dog', 6), ('cow', 7)] 출력됨

zip 함수를 통해 문자열이 저장되어 있는 names 리스트, 정수가 저장되어 있는 age 리스트를 하나로 묶어줬다. 이때 각 요소는 튜플로 묶인다.

zipped = dict(zip(names, age))
print(zipped)	# {'cat': 4, 'dog': 6, 'cow': 7} 출력됨

zipped에 값을 저장해줄 때 zip 함수를 dict()로 감싸주면 딕셔너리 형태로 저장된다.

profile
초보입니다. 피드백 환영합니다 😗

0개의 댓글