[Python] iterable / iterator의 차이와 제너레이터(Generator)에 대해 알아보자!

정은·2023년 7월 18일

PYTHON

목록 보기
4/6
post-thumbnail

해당 개념은 완벽하게 이해되지는 않지만 사용하고 있는 문법이다.
이번 기회에 이해를 완벽하게 해보자!

iterable / iterator는 어떤 차이가 있어❓

iterable 객체의 의미

반복 가능한 객체를 의미한다.
for문을 이용하여 객체 안의 항목을 하나씩 가져올 수 있다.
ex) string, list, tuple, dic, set, range()의 결과값

# iterable 객체
for i in range(3):
	print(i, end=" ")
>>> 0 1 2
# iterable 객체
for i in ["토요일", "일요일"]:
	print(i, end=" ")
>>> 토요일 일요일
  • iterable 객체를 print() 함수를 이용해 출력하면 iterable 객체 전체가 출력되고 iterable 객체 안의 항목을 하나씩 가져오기 위해서는 for문을 사용해야 한다.

iterator 객체

iterable 한 객체가 iter() 함수를 통해 iterator 객체로 생성된다.

# iterator 객체
x = ["토요일", "일요일"]
print(type(x))
>>> <class 'list'>

x = iter(x)
print(type(x))
>>> <class 'list_iterator'>

y = next(x)
print(y)
>>> 토요일

y = next(x)
print(y)
>>> 일요일

iter()함수를 통해 iterator 객체로 변환하였다면 next() 함수를 사용하여 iterator 객체의 항목을 하나씩 출력할 수 있다.

  • iterator 객체로 변환하게 되면 필요할 때에 객체 안의 항목을 하나씩 가져와 사용 가능하다.

제너레이터 (Generator)

iterator를 생성하는 함수이다.
일반적인 함수와 같은 형태를 갖고 있으나 return 대신에 yield를 사용한다.

  • 제너레이터 함수 실행 중에 yield 문을 만나면 그 상태로 정지하고 값을 호출한 쪽으로 반환한다. next()가 호출될 때 마다 제너레이터의 실행이 중지된 곳에서 실행이 재개된다.
  • next()함수를 실행할 때 값을 생성하여 메모리에 적재하므로 효율적으로 메모리를 사용할 수 있다.
def gen():
	print("첫 번째")
    yield # return가 비슷하지만 다음 호출은 아래부터 실행 (return은 처음부터)
    print("두 번째")
    yield 2

g = gen()
y1 = next(g) # (1)
print(y1)

y2 = next(g) # (2)
print(y2)
  • 제너레이터 함수의 객체 g를 생성하여 next() 함수를 이용하여 호출하면 제너레이터 함수의 첫 번째 yield문까지의 명령이 실행된 후 호출한 곳으로 리턴한다. (1)
  • 두 번째 next() 함수에 의해 제너레이터가 다시 호출되면 실행이 중지된 곳부터 실행이 재개되고 두 번째 yield문까지의 명령이 실행된 후 호출한 곳으로 리턴한다. (2)
profile
정니의 이런거 저런거 기록 일지 😛

0개의 댓글