⚡️ 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
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 를 직접 만들 때 사용됩니다.
보통 for i in 제너레이터: 형식으로 많이 사용된다.
제너레이터 = 함수()
for i in 제너레이터:
print(i)
🕹하.지.만. 한번 이렇게 실행하면 StopIteration 까지 모두 호출된 상태라서
한번 더 실행도 실행되지 않는다. 즉, ⚡️일회용 함수이다.
reverse() 함수와 비슷함.
numbers = [1, 2, 3, 4, 5]
이터레이터 = reversed(numbers)
🕹 함수가 호출될때 리스트가 만들어지거나 복사되는것이 아니라 ⚡️ iterator 라는 객체만 만들어지고 단순히 뒤부터 값이 출력하는것이다.
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)))