[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']

"""

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다