[python] generator (제너레이터)

김기용·2020년 10월 25일
0
post-thumbnail

🤔 generator (제너레이터)

⚡️ return 비슷함
⚡️ yield 양보하다라는 의미가 적합
🕹 ⚡️iterator 를 직접 만들 때 사용하는 구문이라고 한다. 만약 함수 내부에 ⚡️yield 가 선언되어 있으면 해당 함수는 제너레이터 객체가 되고 기본적으로 실행이 되지 않는다.

def generator():
    print("one")
    yield
    print("two")
    print("three")

🕹 next() 함수를 써서 generater를 실행시켜보자
기본적으로 실행되지 않는 제너레이터를 실행시키려면 next() 함수를 써야 한다. 그 대신 호출됬을때 제너레이터 객체를 반환한다.

def generator():
    print("one")
    yield
    print("two")
    print("three")
    
generated = generator()
print(generated)

# 출력(generator 객체 반환 ):
# <generator object generator at 0x7feb5ea6a350>

🕹 generater를 사용하고싶다면 ⚡️next() 라는 함수를 사용하고 내부에 제너레이터를 넣어야한다.

🕹 yield 100 yield의 반환값을 출력해주고 싶다면 변수로 받아서 출력해주어야함!

next(generated)
# 출력결과(yield 이후로는 출력되지않음!):
# one
# 만약 yield를 return 처럼 사용했다면
def generator():
    print("one")
    yield 100
    ...
    
value = next(generated())
print(value)

# 출력결과
one
100

🤯 도데체 yield 란 무엇인가?

def generator():
    print("one")
    yield 100
    print("two")
    yield 200
    print("three")
    yield 300
    
    value = next(generated)
    print(value)
    
    value = next(generated)
    print(value)
    
    value = next(generated)
    print(value)

    # 출력 결과
    one
    100
    two
    200
    three
    300
    # 만약 next(generated) 한번 더 입력하게 된다면 
    # StopIteration 예외를 발생시킨다.
    

	

⚡️yield 는 함수 내부에 여러번 ⚡️중복 사용가능합니다. ⚡️next() 를 실행하는 순간 위쪽부터 아래쪽으로 출력되고 ⚡️yield를 만나는 순간 100에서 양보받아서 멈춤니다. 나머지 아래 부분도 사용하고 싶으면 사용하고 싶은 수만큼 ⚡️next() 함수를 사용해 주어야합니다.

🕹 만약 모든 값이 출력이 됬는데도 한번더 ⚡️yield를 실행하면 ⚡️literation이 끝낫는데 왜 또 실행하냐! 라고 StopIteration 예외를 반환합니다..

이러한 특성을 사용해 ⚡️iterator 를 직접 만들 때 사용됩니다.


yield 사용방법

보통 for i in 제너레이터: 형식으로 많이 사용된다.

제너레이터 = 함수()
for i in 제너레이터:
	print(i)

🕹하.지.만. 한번 이렇게 실행하면 StopIteration 까지 모두 호출된 상태라서
한번 더 실행도 실행되지 않는다. 즉, ⚡️일회용 함수이다.

reverse() 함수와 비슷함.
numbers = [1, 2, 3, 4, 5]
이터레이터 = reversed(numbers)

🕹 함수가 호출될때 리스트가 만들어지거나 복사되는것이 아니라 ⚡️ iterator 라는 객체만 만들어지고 단순히 뒤부터 값이 출력하는것이다.


🤘 Reverse() 함수를 generator로 만들어 보자

num_list = [1, 2, 3, 4, 5]

def reverse(num_list):
    for i in range(len(num_list)):
        yield num_list[-i - 1]

for i in reverse(num_list):
    print(i)

실행되는 순간에 어떠한 데이터도 추가적으로 만들어지지 않고 제너레이터만 만들어진다. 그냥 출력만 해주는것.
메모리를 그래서 많이 절약가능하다.

자연로드 공부해보기

numbers = [1,2,3,4,5,6]
print("::".join(numbers))

str을 예상했는데 integer가 왔다.

print("::".join(map(str, numbers)))
profile
매일 새로운 배움을 통해 꾸준히 성장하는 것을 목표를 두고 있습니다. 논리적인 사고로 문제해결 하는것에 희열을 느끼고 언젠가 제가 만든 결과물들이 사람들에게 편이를 제공하며 사용되는 날을 간절히 소망하고 있습니다. 🙏

0개의 댓글