Python/파이썬 심화

제너레이터 + itertools 모듈

monstro 2025. 9. 28. 21:49
728x90
반응형

- 개요

컴퓨터에서 사용하는 병행성(Concurrency)과 병렬성(Parallelism)의 개념은 다음과 같다

  • 병행성 : 단일 프로그램에서 여러 작업을 동시에 수행
  • 병렬성 : 여러 컴퓨터에서 여러 작업을 동시에 수행

 

이때 제네레이터를 사용하면 yield 키워드를 사용하여 병행성을 구현할 수 있다

 

1) generator를 사용한 병행성 작업 예시

def gen_ex1():
    print('Start')
    yield 'First Step'
    print('Continue')
    yield 'Second Step'
    print('End')

tmp = iter(gen_ex1())

# 첫 번째 사용예시
print(next(tmp))
print(next(tmp))
print(next(tmp))

# 두 번째 사용예시
for t in gen_ex1():
    print(t)

 

위와 같이 코드를 작성하였다

yield 키워드를 사용하여 각기 다른 상태를 저장하는 방식으로 여러 작업을 동시에 처리할 수 있다

 

첫 번째 예시

 

next 함수를 통해 iterator로부터 값을 가져와 사용한다

단, 마지막 코드에서 더 이상 값을 가져올 수 없어 StopIteration 예외가 발생한다

 

두 번째 예시

 

for문을 사용하는 경우 StopIteration 예외에 대한 처리가 자동으로 이뤄진다

따라서 위와 같은 결과를 얻을 수 있다

 

2) itertools 모듈

itertools 모듈은 내장 모듈로서, iterator유용하게 사용할 수 있는 함수들을 제공한다

 

2 - 1) count 함수

# count 함수 : 인자로 시작값 / 증감값을 사용
gen1 = itertools.count(1, 2.5)
print(next(gen1))
print(next(gen1))

 

count 함수시작값부터 시작하여 증감값을 더하여 값을 반환한다

이때 반환된 iterator 객체로부터 next 함수를 사용하여 값을 추출할 수 있다

 

 

실행결과는 위와 같다

 

2 - 2) takewhile 함수

takewhile 함수 : 조건이 참일때까지 iterable의 요소에 접근
gen2 = itertools.takewhile(lambda n : n < 15, itertools.count(1, 3))
for v in gen2:
    print(v)

 

takeawhile 함수 조건이 참일 때까지 iterable한 객체의 요소에 접근하는 함수이다

조건은 람다를 사용하여 지정한다

 

 

실행 결과는 위와 같다

 

2 - 3) filterfalse 함수

# filterfalse 함수 : 조건이 거짓이 될때까지 iterable의 요소에 접근
gen3 = itertools.filterfalse(lambda n : n < 3, [1, 2, 3, 4, 5])
for v in gen3:
    print(v)

 

filterfalse 함수 조건이 거짓일 때까지 iterable한 객체의 요소에 접근하는 함수이다

마찬가지로 람다를 사용하여 조건을 지정한다

 

 

실행 결과는 위와 같다

 

2 - 4) accumulate 함수

# accumulate 함수 : 누적 합계
gen4 = itertools.accumulate([x for x in range(1, 11)])
for v in gen4:
    print(v)

 

accumulate 함수 iterator 객체로부터 누적합을 반환하는 함수이다

 

 

실행결과는 위와 같다

 

2 - 5) chain 함수

# chain 함수 : iterable 객체를 서로 연결
gen5 = itertools.chain('ABCDE', range(1, 11, 2))
print(list(gen5))

gen6 = itertools.chain(enumerate('ABCDE'))
print(list(gen6))

 

chain 함수 iterable한 객체를 서로 연결하는 함수이다

예시에서는 하나로 연결된 객체를 list 형태로 출력한다

 

 

실행결과는 위와 같다

 

2 - 6) product 함수

# product 함수 : 개별 튜플로 분리
gen7 = itertools.product(enumerate('ABCDE'))
print(list(gen7))

# repeat 인자를 설정하여 개별 분리되는 튜플 내부의 데이터 개수를 설정
gen8 = itertools.product(enumerate('ABCDE'), repeat=2)
print(list(gen8))

 

product 함수iterable한 객체의 원소를 짝지어 튜플로 분리하는 함수이다

repeat 인자를 사용하여 분리된 튜플 내부의 데이터 개수를 설정할 수 있다

 

 

실행결과는 위와 같다

 

2 - 7) groupby 함수

# groupby 함수 : 그룹화
gen9 = itertools.groupby('AAABBBCCCDDD')
for chr, group in gen9:
    print(chr, ' : ', list(group))

 

groupby 함수iterable한 객체 key 함수를 통해 연속적인 그룹으로 묶어서 반환하는 함수이다

 

 

실행결과는 위와 같다

728x90
반응형

'Python > 파이썬 심화' 카테고리의 다른 글

코루틴 (2)  (0) 2025.10.12
코루틴 (1)  (0) 2025.10.12
병행성 - 기본 (2)  (0) 2025.09.14
병행성 - 기본 (1)  (0) 2025.09.14
데코레이터  (0) 2025.09.02