본문 바로가기
C++,python (인프런+사이트)/python 파이썬 정리

Generator 제너레이터 ( Yield )

by 알 수 없는 사용자 2022. 4. 4.

 

https://dojang.io/mod/page/view.php?id=2412 

 

파이썬 코딩 도장: 40.1 제너레이터와 yield 알아보기

Unit 40. 제너레이터 사용하기 제너레이터는 이터레이터를 생성해주는 함수입니다. 이터레이터는 클래스에 __iter__, __next__ 또는 __getitem__ 메서드를 구현해야 하지만 제너레이터는 함수 안에서 yield

dojang.io

 

 


제너레이터는 이터레이터를 생성해주는 함수 이다.

함수 안에서 yield를 사용하면 함수는 제너레이터가 되며 yield에는 값(변수)을 지정합니다.

 

제네레이터는 다양한 방법으로 만들 수 있고,(iterable한것만)

그 중 import itertools 이라는 패키지를 이용하면 더 다양한 기능을 사용해 만들 수 있다.

 

중요시 볼건

1. 만드는 기본형식

2. 다양한 스킬들

3. yield 에 대한 개념

 

1. 만드는 기본형식

제네레이터용 함수

객체생성

안에 내용물 꺼내는 방식 2개

 

2.

import itertools

 

3. yield 에 대한 개념

return이라고 생각하면 좋다. 한번씩 불릴때마다 하나씩 return한다고 생각하면됨.

return할 yield가 없으면 에러 호출

 


코드

# Chapter06-02
# 병행성(Concurrency)
# 이터레이터, 제네레이터
# Iterator, Generator

# 파이썬 반복 가능한 타입
# for, collections, text file, List, Dict, Set, Tuple, unpacking, *args

# Generator Ex1
def generator_ex1():
    print('Start')
    yield 'A Point.'
    print('continue')
    yield 'B Point.'
    print('End')

temp = iter(generator_ex1())

# print(next(temp))
# print(next(temp))
# print(next(temp))

for v in generator_ex1():
    pass
    # print(v)

print()

# Generator Ex2
temp2 = [x * 3 for x in generator_ex1()]
temp3 = (x * 3 for x in generator_ex1())

print(temp2)
print(temp3)

for i in temp2:
    print(i)

print()
print()

for i in temp3:
    print(i)

print()
print()


# Generator Ex3(중요 함수)
# filterfalse, accumulate, chain, product, product, groupby
import itertools

gen1 = itertools.count(1, 2.5)

print(next(gen1))
print(next(gen1))
print(next(gen1))
print(next(gen1))
# ... 무한

print()

# 조건
gen2 = itertools.takewhile(lambda n : n < 1000, itertools.count(1, 2.5))

for v in gen2:
    print(v)


print()

# 필터 반대
gen3 = itertools.filterfalse(lambda n : n < 3, [1,2,3,4,5])

for v in gen3:
    print(v)


print()

# 누적 합계
gen4 = itertools.accumulate([x for x in range(1, 101)])

for v in gen4:
    print(v)

print()

# 연결1
gen5 = itertools.chain('ABCDE', range(1,11,2))

print(list(gen5))

# 연결2

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

print(list(gen6))

# 개별
gen7 = itertools.product('ABCDE')

print(list(gen7))

# 연산(경우의 수)
gen8 = itertools.product('ABCDE', repeat=2)

print(list(gen8))

# 그룹화
gen9 = itertools.groupby('AAABBCCCCDDEEE')

# print(list(gen9))

for chr, group in gen9:
    print(chr, ' : ', list(group))

print()

댓글