본문 바로가기

카테고리 없음

AIOT - 제너레이터

제너레이터는 파이썬의 특수한 문법 구조 !

 

제너레이터는 이터레이터를 직접 만들 때 사용하는 코드입니다.

함수 내부에 yield 키워드를 사용하면 해당 함수는 제너레이터 함수가 되며, 일반 함수와는 달리 함수를 호출해도 함수 내부의 코드가 실행되지 않습니다.

 

제너레이터 함수 예제

#함수를 선언합니다.
def test():
    print("함수가 호출되었습니다.")
    yield "test"

#함수를 호출합니다.
print("A 지점 통과")
test()

print("B 지점 통과")
test()
print(test())
<실행 결과>
A 지점 통과
B 지점 통과
<generator object test at 0x0000021BDA761A10>

원래 test() 함수를 호출하면 "함수가 호출되었습니다." 라는 문자열이 출력되어야 하지만, 출력되지 않습니다.

제너레이터 함수는 제너레이터를 리턴합니다.

출력된 </generator object test at 0x0000021bda761a10>는 제너레이터 객체입니다.

 

제너레이터 객체는 next() 함수를 사용해 함수 내부의 코드를 실행합니다. 이때 yield 키워드 부분까지만 실행하며, next() 함수의 리턴값으로 yield 키워드 뒤에 입력한 값이 출력됩니다.

 

next()함수 예제

#함수를 선언합니다.
def test():
    print("A 지점 통과")
    yield 1
    print("B 지점 통과")
    yield 2
    print("C 지점 통과")
#함수를 호출합니다.
output = test()
#next() 함수를 호출합니다.
print("D 지점 통과")
a = next(output)
print(a)
print("E 지점 통과")
b = next(output)
print(b)
print("F 지점 통과")
c = next(output)
print(c)
#한번 더 실행하기
next(output)
<실행 결과>
D 지점 통과
A 지점 통과
1
E 지점 통과
B 지점 통과
2
F 지점 통과
C 지점 통과

예외가 발생했습니다. StopIteration X
exception: no description
    File "C:\Users\day52\OneDrive\Desktop\파이썬\generator.py", line 18, in <module>
        c = next(output)
StopIteration:

코드를 실행하면 next() 함수를 호출할 때마다 "A 지점 통과", "B 지점 통과" 처럼 함수 내부의 내용이 진행되는 모습을 확인할 수 있습니다.

next() 함수를 호출한 이후 yield 키워드를 만나지 못하고 함수가 끝나면 StopIteration이라는 예외가 발생합니다.

 

이처럼 제너레이터 객체는 함수의 코드를 조금씩 실행할 때 사용합니다.