-
Notifications
You must be signed in to change notification settings - Fork 0
/
iter_generate.py
140 lines (111 loc) · 2.94 KB
/
iter_generate.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# for a in [1,2,3]:
# print(a)
print("Iter & Generate")
# # [1,2,3]을 for문으로 차례대로 하나씩 출력하는 예제
# # for 문과 같은 반복 구문에 적용할 수 있는 리스트와 같은 객체를
# # '반복 가능(iterable) 객체'라고 함.
# b = [1,2,3]
# print(type(b))
# ib = iter(b) # iter함수를 사용해서 이터레이터로 만들기
# print(type(ib))
# print(next(ib))
# print(next(ib))
# print(next(ib))
# print(next(ib))
# '''
# 1
# 2
# 3
# Traceback (most recent call last):
# File "c:\Users\JH\Desktop\python\DoIt\Python-Practice\iter_generate.py", line 19, in <module>
# print(next(ib))
# ^^^^^^^^
# StopIteration
# '''
# 이터레이터의 값을 가져오는 가장 일반적인 방법은 for문을 이용하는 것
# 이터레이터는 재사용 불가
# 이터레이터 만들기
# 1. __iter__
# 2. __next__ 2개의 메서드 구현 2개를 같이 구현해야한다. 반드시!!
class MyItertor:
def __init__(self, data):
self.data = data
self.position = 0
def __iter__(self):
return self
def __next__(self):
if self.position >= len(self.data):
raise StopIteration
result = self.data[self.position]
self.position += 1
return result
i = MyItertor([1,2,3])
for item in i:
print(item)
# reviterator.py
class ReverseItertor:
def __init__(self, data):
self.data = data
self.position = len(self.data) -1
def __iter__(self):
return self
def __next__(self):
if self.position < 0:
raise StopIteration
result = self.data[self.position]
self.position -= 1
return result
if __name__ == "__main__":
i = ReverseItertor([1,2,3])
for item in i:
print(item)
## 제너레이터
# -> 이터레이터를 생성해 주는 함수.
# return 대신에 yield 키워드 사용
def mygen():
yield 'a'
yield 'b'
yield 'c'
# 제너레이터는 yield라는 문장을 만나면 그 값을 리턴하되 현재 상태를 그대로 기억한다는 것이다. 이것은 마치 음악을 재생하다가 일시 정지 버튼으로 멈춘 것과 비슷한 모양새이다.
# generator.py
def mygen():
for i in range(1, 1000):
result = i * i
yield result
gen = mygen()
print(next(gen))
print(next(gen))
print(next(gen))
gen = (i * i for i in range(1, 1000))
# 제너레이터 vs 이터레이터
# generator2.py
import time
def longtime_job():
print("job start")
time.sleep(1) # 1초 지연
return "done"
list_job = [longtime_job() for i in range(5)]
print(list_job[0])
print(list_job[1])
print(list_job[2])
print(list_job[3])
print(list_job[4])
# job start
# job start
# job start
# job start
# job start
# done
# done
# done
# done
# done
#######################################
# generator2.py
import time
def longtime_job2():
print("job start")
time.sleep(1)
return "done"
list_job = (longtime_job2() for i in range(5))
print(next(list_job))