[Python]제네레이터(Generator) 예제
파이썬의 제네레이터(Generator) 예제를 살펴보자
# 병행성(Concurrency) : 단일 프로그램에서 여러 일을 동시에 수행
# 병렬성(Parallelism) : 분산된 컴퓨터에서 여러 일을 동시에 수행
# Generator 예제1
def generator_ex1():
print('Start')
yield 'A point ' # yield 뒤의 값을 리턴해주고 잠시 멈춘다.
print('Continue')
yield 'B point '
print('End')
ex1 = iter(generator_ex1())
for v in ex1:
print(v)
print()
"""
Start
A point
Continue
B point
End
"""
# Generator 예제2
ex2 = [x * 3 for x in generator_ex1()]
ex3 = (x * 3 for x in generator_ex1())
print()
"""
Start
Continue
End
"""
print(type(ex2), type(ex3))
print()
"""
<class 'list'> <class 'generator'>
"""
for v in ex2:
print(v)
print()
"""
A point A point A point
B point B point B point
"""
for v in ex3:
print(v)
print()
"""
Start
A point A point A point
Continue
B point B point B point
End
"""
# Generator 예제3 (중요함수) : count, takewhile, filterfalse, accumulate, chain, product, groupby...
import itertools
# 무한대로 증가하는 generator
gen1 = itertools.count(1, 2.5)
print(type(gen1))
print(next(gen1))
print(next(gen1))
print(next(gen1))
print(next(gen1))
print()
# ... 무한대로 사용가능하다.
"""
<class 'itertools.count'>
1
3.5
6.0
8.5
"""
# 조건을 가진 generator
gen2 = itertools.takewhile(lambda n: n < 5, itertools.count(1, 2.5))
for v in gen2:
print(v)
print()
'''
1
3.5
'''
# 필터의 반대 값으로 generator 생성
gen3 = itertools.filterfalse(lambda n: n < 5, range(1, 10))
for v in gen3:
print(v)
print()
"""
5
6
7
8
9
"""
# 누적합계
gen4 = itertools.accumulate(range(1, 11))
for v in gen4:
print(v)
print()
"""
1
3
6
10
15
21
28
36
45
55
"""
# 연결1
gen5 = itertools.chain('ABCD', range(1, 10, 2))
print(type(gen5))
print(list(gen5))
print()
"""
<class 'itertools.chain'>
['A', 'B', 'C', 'D', 1, 3, 5, 7, 9]
"""
# 연결2
gen6 = itertools.chain(enumerate('ABCDE'))
print(list(gen6))
print()
"""
[(0, 'A'), (1, 'B'), (2, 'C'), (3, 'D'), (4, 'E')]
"""
# 개별
gen7 = itertools.product('ABCDE')
print(list(gen7))
print()
"""
[('A',), ('B',), ('C',), ('D',), ('E',)]
"""
# 연산(경우의 수?)
gen8 = itertools.product('ABCDE', repeat=3)
print(list(gen8))
print()
"""
[('A', 'A', 'A'), ('A', 'A', 'B'), ('A', 'A', 'C'), ('A', 'A', 'D'), ('A', 'A', 'E'), ('A', 'B', 'A'), ('A', 'B', 'B'), ('A', 'B', 'C'), ('A', 'B', 'D'), ('A', 'B', 'E'), ('A', 'C', 'A'), ('A', 'C', 'B'), ('A', 'C', 'C'), ('A', 'C', 'D'), ('A', 'C', 'E'), ('A', 'D', 'A'), ('A', 'D', 'B'), ('A', 'D', 'C'), ('A', 'D', 'D'), ('A', 'D', 'E'), ('A', 'E', 'A'), ('A', 'E', 'B'), ('A', 'E', 'C'), ('A', 'E', 'D'), ('A', 'E', 'E'), ('B', 'A', 'A'), ('B', 'A', 'B'), ('B', 'A', 'C'), ('B', 'A', 'D'), ('B', 'A', 'E'), ('B', 'B', 'A'), ('B', 'B', 'B'), ('B', 'B', 'C'), ('B', 'B', 'D'), ('B', 'B', 'E'), ('B', 'C', 'A'), ('B', 'C', 'B'), ('B', 'C', 'C'), ('B', 'C', 'D'), ('B', 'C', 'E'), ('B', 'D', 'A'), ('B', 'D', 'B'), ('B', 'D', 'C'), ('B', 'D', 'D'), ('B', 'D', 'E'), ('B', 'E', 'A'), ('B', 'E', 'B'), ('B', 'E', 'C'), ('B', 'E', 'D'), ('B', 'E', 'E'), ('C', 'A', 'A'), ('C', 'A', 'B'), ('C', 'A', 'C'), ('C', 'A', 'D'), ('C', 'A', 'E'), ('C', 'B', 'A'), ('C', 'B', 'B'), ('C', 'B', 'C'), ('C', 'B', 'D'), ('C', 'B', 'E'), ('C', 'C', 'A'), ('C', 'C', 'B'), ('C', 'C', 'C'), ('C', 'C', 'D'), ('C', 'C', 'E'), ('C', 'D', 'A'), ('C', 'D', 'B'), ('C', 'D', 'C'), ('C', 'D', 'D'), ('C', 'D', 'E'), ('C', 'E', 'A'), ('C', 'E', 'B'), ('C', 'E', 'C'), ('C', 'E', 'D'), ('C', 'E', 'E'), ('D', 'A', 'A'), ('D', 'A', 'B'), ('D', 'A', 'C'), ('D', 'A', 'D'), ('D', 'A', 'E'), ('D', 'B', 'A'), ('D', 'B', 'B'), ('D', 'B', 'C'), ('D', 'B', 'D'), ('D', 'B', 'E'), ('D', 'C', 'A'), ('D', 'C', 'B'), ('D', 'C', 'C'), ('D', 'C', 'D'), ('D', 'C', 'E'), ('D', 'D', 'A'), ('D', 'D', 'B'), ('D', 'D', 'C'), ('D', 'D', 'D'), ('D', 'D', 'E'), ('D', 'E', 'A'), ('D', 'E', 'B'), ('D', 'E', 'C'), ('D', 'E', 'D'), ('D', 'E', 'E'), ('E', 'A', 'A'), ('E', 'A', 'B'), ('E', 'A', 'C'), ('E', 'A', 'D'), ('E', 'A', 'E'), ('E', 'B', 'A'), ('E', 'B', 'B'), ('E', 'B', 'C'), ('E', 'B', 'D'), ('E', 'B', 'E'), ('E', 'C', 'A'), ('E', 'C', 'B'), ('E', 'C', 'C'), ('E', 'C', 'D'), ('E', 'C', 'E'), ('E', 'D', 'A'), ('E', 'D', 'B'), ('E', 'D', 'C'), ('E', 'D', 'D'), ('E', 'D', 'E'), ('E', 'E', 'A'), ('E', 'E', 'B'), ('E', 'E', 'C'), ('E', 'E', 'D'), ('E', 'E', 'E')]
"""
# 그룹화 : 같은 요소끼리 묶어서 반환한다.
gen9 = itertools.groupby('AAAABBCCCCDDDDDDDE')
for chr, group in gen9:
print(f'{chr} = {list(group)}')
print()
"""
A = ['A', 'A', 'A', 'A']
B = ['B', 'B']
C = ['C', 'C', 'C', 'C']
D = ['D', 'D', 'D', 'D', 'D', 'D', 'D']
E = ['E']
"""
최신 댓글