제너레이터라는 게 있길래 궁금해서 질문 올려요. 함수에서 return 대신 yield를 쓰는 걸 봤는데, 결과만 보면 for로 돌려서 값 꺼내는 게 그냥 리스트 돌리는 거랑 똑같아 보이거든요.


이 두 개가 저한텐 그냥 똑같아 보여요.


def make_list(n):
    result = []
    for i in range(n):
        result.append(i * i)
    return result

def make_gen(n):
    for i in range(n):
        yield i * i


둘 다 for문 돌리면 제곱값이 똑같이 나와요. 그래서 굳이 yield를 왜 쓰는지 모르겠어요. 오히려 제너레이터는 print 해보면 값이 안 보이고 이상한 generator object 뭐시기가 찍혀서 불편하기만 하던데요.


근데 어디서 듣기론 큰 데이터 다룰 때 메모리 때문에 제너레이터가 유리하다고 하더라고요. 이게 무슨 말인가요? 리스트는 값을 다 만들어서 어디 저장해두고 제너레이터는 안 그런다는 건가 싶은데 정확히 이해가 안 돼요.


예를 들어 range(n)에서 n이 1억 이런 식으로 엄청 커지면 두 방식이 실제로 어떻게 달라지나요? 언제 리스트 쓰고 언제 제너레이터 쓰는 게 맞는지 감을 잡고 싶어요. 설명 부탁드립니다.