Python을 이용한 객체 지향 프로그래밍 (1)

과제 내용 설명

DataLoader 예제를 더 발전시켜서 MydataLoader2를 만들어 봅시다. data를 하나 더 늘려서 data1과 data2를 인자로 받습니다.

  1. data1과 data2의 각 value를 제곱 하는 기능을 만들어 봅시다.(make_square) ex. data1 = [1,2,3] -> make_square -> [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]을 하나씩 리턴

우수과제로 뽑은 이유

yield를 사용한 generator를 추가로 구현해 주셔서 다른 분들에게도 도움이 될 듯 하여 선정하게 되었습니다

기존 데이터 로더

In [14]:

import random
class MyDataLoader:
    def __init__(self, data):
        self.size = len(data) 
        self.data = data
        
    def __iter__(self): 
        self.index = 0
        return self
 
    def __next__(self):
        if self.index >= self.size:
            raise StopIteration
        n = self.data[self.index]
        self.index += 1
        return n
    
    def shuffle(self):
        random.shuffle(self.data)

방법1 (next와 next 사용)

In [16]:

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

    # __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]

In [19]:

# 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}")

방법2 (iter에서 yield 사용 - generator 사용)

In [17]:

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

    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]

In [18]:

# 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}")
0 : 98101
1 : 37717
2 : 53341
3 : 82325
4 : 23173
5 : 81428
6 : 94357
7 : 60569
8 : 13025
9 : 9396
10 : 67810
11 : 93497
12 : 68500
13 : 105026
14 : 5416
15 : 55028
16 : 113125
17 : 118260
18 : 18721
19 : 80225
20 : 154180
21 : 37
22 : 11285
23 : 40882
24 : 95812
25 : 94561
26 : 28100
27 : 5729
28 : 73604
29 : 45617
30 : 41242
31 : 51812
32 : 76129
33 : 64445
34 : 21393
35 : 60164
36 : 86993
37 : 5536
38 : 108749
39 : 61738
40 : 28157
41 : 33058
42 : 82849
43 : 32157
44 : 33589
45 : 37825
46 : 99229
47 : 72125
48 : 99173
49 : 69418
50 : 96309
51 : 60517
52 : 3281
53 : 166549
54 : 94725
55 : 73585
56 : 99860
57 : 97642
58 : 85213
59 : 14948
60 : 79560
61 : 117704
62 : 112877
63 : 64100
64 : 112900
65 : 29410
66 : 39409
67 : 79330
68 : 137936
69 : 64525
70 : 24200
71 : 18281
72 : 115208
73 : 77812
74 : 22082
75 : 128362
76 : 47129
77 : 88173
78 : 7757
79 : 17978
80 : 76040
81 : 74161
82 : 5972
83 : 57616
84 : 100997
85 : 13130
86 : 29873
87 : 44200
88 : 46125
89 : 88292
90 : 34325
91 : 99034
92 : 54485
93 : 27529
94 : 70325
95 : 87844
96 : 1098
97 : 5114
98 : 132805
99 : 55204
100 : 62388
101 : 8840
102 : 18740
103 : 42772
104 : 38834
105 : 90025
106 : 49249
107 : 115477
108 : 59296
109 : 89465
110 : 52741
111 : 151450
112 : 20213
113 : 44149
114 : 2330
115 : 48857
116 : 99432
117 : 46890
118 : 134186
119 : 46957
120 : 118980
121 : 106010
122 : 89396
123 : 31041
124 : 55313
125 : 108778
126 : 20740
127 : 154730
128 : 9250
129 : 30053
130 : 18341
131 : 14185
132 : 4292
133 : 96148
134 : 59681
135 : 48529
136 : 84148
137 : 63325
138 : 9865
139 : 73988
140 : 43938
141 : 106234
142 : 121972
143 : 65905
144 : 126829
145 : 79106
146 : 85282
147 : 17165
148 : 59170
149 : 54449
150 : 24644
151 : 87965
152 : 40001
153 : 31937
154 : 8433
155 : 65837
156 : 94882
157 : 76585
158 : 4490
159 : 167681
160 : 82450
161 : 6292
162 : 106481
163 : 8282
164 : 19106
165 : 90337
166 : 33674
167 : 58945
168 : 16153
169 : 8098
170 : 40725
171 : 140193
172 : 55762
173 : 17154
174 : 7058
175 : 90632
176 : 92105
177 : 121
178 : 1844
179 : 23620
180 : 53924
181 : 91780
182 : 33226
183 : 105940
184 : 46269
185 : 122272
186 : 124290
187 : 16657
188 : 28913
189 : 65530
190 : 171113
191 : 121225
192 : 16945
193 : 94945
194 : 15632
195 : 13745
196 : 32481
197 : 119808
198 : 53608
199 : 70337
200 : 19061
201 : 130205
202 : 47533
203 : 70066
204 : 961
205 : 63493
206 : 78970
207 : 95812
208 : 89114
209 : 68074
210 : 14738
211 : 79460
212 : 57664
213 : 57869
214 : 28273
215 : 50984
216 : 64517
217 : 6613
218 : 9898
219 : 55801
220 : 68329
221 : 118805
222 : 85370
223 : 36505
224 : 12688
225 : 92957
226 : 28730
227 : 12704
228 : 98865
229 : 61090
230 : 19213
231 : 46546
232 : 104882
233 : 48242
234 : 58320
235 : 24968
236 : 16317
237 : 61546
238 : 14794
239 : 43609
240 : 15453
241 : 6565
242 : 24986
243 : 94090
244 : 64825
245 : 19249
246 : 89284
247 : 43936
248 : 47528
249 : 104717
250 : 99205
251 : 55332
252 : 37621
253 : 106741
254 : 19865
255 : 35645
256 : 56610
257 : 119074
258 : 125489
259 : 8500
260 : 19949
261 : 53066
262 : 5636
263 : 44362
264 : 130633
265 : 63785
266 : 79913
267 : 56381
268 : 21529
269 : 32272
270 : 77285
271 : 59449
272 : 39650
273 : 49205
274 : 84641
275 : 81005
276 : 53810
277 : 64034
278 : 95650
279 : 14594
280 : 54522
281 : 34961
282 : 11170
283 : 19850
284 : 77698
285 : 27997
286 : 9733
287 : 51417
288 : 89081
289 : 76481
290 : 100129
291 : 30689
292 : 103805
293 : 58409
294 : 77985
295 : 6317
296 : 35828
297 : 145109
298 : 92104
299 : 6245

Last updated