# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernel_info:
#     name: Untitled
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# # 과제
# * DataLoader 예제를 더 발전시켜서 MydataLoader2를 만들어 봅시다. data를 하나 더 늘려서 data1과 data2를 인자로 받습니다. 
# 1. data1과 data2의 각 value를 제곱 하는 기능을 만들어 봅시다.(make_square) ex. data1 = [1,2,3] -> make_shuffle -> [1,4,9] 
# 2. shuffle 기능을 data1, data2 둘다 섞을 수 있도록 바꿉니다. 
# 3. for loop가 돌 때마다 i번째 data1의 값과 data2의 값을 더한 값을 인쇄할 수 있게 바꿔봅시다.
# ex. data1 = [1,9,4] data2 = [4,1,9] -> [5,10,13]을 하나씩 리턴 
#

# ![image.png](./class_ex.png)

# +
import random
class MyDataLoader2:
    def __init__(self, data1, data2):
        # data1과 data2 크기는 같다고 가정합시다
        self.size = len(data1) 
        self.data1 = data1
        self.data2 = data2

    # 이렇게도 Generator 로도 구현 가능
    # __next__ 없어도 됨
    def __iter__(self): 
        for n1, n2 in zip(self.data1, self.data2):
            yield n1 + n2
        

#     __iter__에서는 나를 반환해주고 __next__에서는 for loop가
#     돌떄마다 인쇄하고 싶은 값을 리턴합니다.
#     def __iter__(self): 
#         self.index = 0
#         return self

#     def __next__(self):
#         ##################
#         #data1과 data2를 더해서 리턴할 수 있는 iterator를 완성해주세요
#         ##################
#         if self.index >= self.size:
#             raise StopIteration
        
#         result = self.data1[self.index] + self.data2[self.index]
#         self.index += 1
#         return result
    
    def __getitem__(self, key):
        return self.data1[key] + self.data2[key]
        

    def shuffle(self):
        #########
        # data1과 data2를 shuffle해주세요
        #########
        random.shuffle(self.data1)
        random.shuffle(self.data2)
        
    def make_square(self):
        ######### 
        # data1과 data2의 값들을 다 제곱해주세요!
        #########
        self.data1 = [n**2 for n in self.data1]
        self.data2 = [n**2 for n in self.data2]
        
# -

loader = MyDataLoader2([i for i in range(300)], [i for i in range(300)])

print(loader[1]) # 2번째 값 확인
print([x for i, x in enumerate(loader)][:10]) # 10번째까지의 합 확인

# data1과 data2 크기는 같다고 가정합시다
loader = MyDataLoader2([i for i in range(300)], [i for i in range(300)])
loader.make_square() ## data1과 data2를 제곱할 수 있는 method를 완성해주세요!
loader.shuffle()
for i, x in enumerate(loader): # for loop 가 도니까 __iter__
    print(f"{i} : {x}")





StarcoderdataJupyterScriptsDedupFiltered