본문 바로가기
프로그래밍 언어/Python

[파이썬] 이터레이터, 제너레이터, 데코레이터

by 작지만 중요한 것들을 발견하는 블로그. 2024. 5. 20.

이터레이터, 제너레이터, 데코레이터 이름이 비슷해서 헷갈려 내가 보려고 정리하는 글 입니당.

 

특징 및 차이점

  1. 이터레이터

  2. 제너레이터

  3. 데코레이터

 

사용법

  1. 이터레이터

  2. 제너레이터

  3. 데코레이터

 


특징 및 차이점

 

  • 이터레이터
    • 이터레이터는 여러번 사용 가능
    • 반복 가능한 객체를 다루는 데 사용되는 개념
    • 'next()' 메서드를 사용하여 다음 요소로 이동
    •  next() 메서드를 통해 모든 요소를 다 진행했을 때 StopIteration' 예외를 발생
    • 이터레이터는 필요할 때만 메모리를 사용하여 메모리 효율에 좋은 장점
  • 제너레이터
    • 제너레이터는 이터레이터를 생성해주는 함수
    • return 대신 yield 사용
    • 모든 함수를 한꺼번에 실행하는 것이 아닌 필요할 때만 실행하는 방식(느긋한 계산법, lazy evaluation) - 메모리 효율에 좋은 장점이 있음
    • 리스트는 모든 데이터를 메모리에 올려둠. 데이터 크기가 커질 경우, 쓰지 않는 데이터까지 올려 빅 데이터 처리시, 제너레이터가 이용되기도 함.
    • 제너레이터는 '한번'만 사용 가능
  • 데코레이터
    • 데코레이터는 기존 함수를 수정하지 않으면서 추가 기능을 구현할 때 사용
    • 데코레이터를 여러 개 지정해서 사용 가

 


사용법

 

  • 이터레이터 :
    • 변수.__iter__() , iter(), next()
# __iter__() 함수로 이터러블하게 만들기
range_iter = range(0, 5).__iter__()

# iter() 도 가능!
a = iter(range(0,5))

# next()로 하나씩 메모리에 올려 사용
range_iter.__next__()
a.__next__()

# 이터러블 객체
# str, 리스트, 튜플, 집합set, 딕셔너리, range()

 


 

  • 제너레이터 :
    • ( x for x in range(0,6) ) 튜플의 컴프리헨션 처럼 표기. (※ 튜플은 앞에 tuple을 붙여줍니다.)
    • class 형태로도 사용
Generator_1 = (n ** 2 for n in range(1, 11))

def generator():
    for n in range(1, 11):
        yield n ** 2
 
Generator_2 = generator()
print(*Generator_1)
print(*Generator_2)

 

결과

1 4 9 16 25 36 49 64 81 100
1 4 9 16 25 36 49 64 81 100

 


 

  • 데코레이터 : 
    • @deco 붙이기
# 데코레이터 함수 정의
def deco(fn):
	def innerDeco():
    	print("*" * 20)
        fn()
    	print("*" * 20)
    return innerDeco

#데코레이터 함수 사용한 함수 정의
@deco
def useDeco():
	print("데코레이터는 예뻐요.")
    
#데코레이터 적용한 함수 실행
useDeco()

 

결과

********************
데코레이터는 예뻐요.
********************