[Python] 이터레이터와 제너레이터
Y
Yerim
- Python
l = [10, 20, 30] # 반복 가능 자료형인 리스트
l_iter = iter(l) # <list_iterator object at ...>
n = 100 # 반복 불가능 자료형인 int
n_iter = iter(n) # TypeError발생my_list = [1, 2, 3, 4]
my_iter = iter(my_list) # my_list에 __iter__가 호출된다
print(next(my_iter)) # 출력: 1 # my_list에 __next__가 호출됩니다.
print(next(my_iter)) # 출력: 2 # my_list에 __next__가 호출됩니다.class MyIterator:
def __init__(self, stop):
self.currentValue = 0
self.stop = stop
def __iter__(self):
return self
def __next__(self):
if self.currentValue >= self.stop:
raise StopIteration
result = self.currentValue
self.currentValue += 1
return result
my_iterator = MyIterator(5)
for i in my_iterator:
print(i)
# for는 iter 먼저 실행, next로 StopIterationa, b, c, d = MyIterator(4)
a
a, b, c, d = range(4)
a내장 함수 | 설명 |
all() | 반복 가능한 항목들이 모두 참일 때만 참 반환 |
any() | 임의의 반복 가능한 항목 중 참이 하나라도 있으면 참을 반환 |
ascii() | 주어진 객체를 표현할 수 있는 ASCII 문자열을 반환 |
bool() | 반복 가능 객체의 존재 여부를 부울 값으로 변환 |
filter() | 반복 가능한 항목들을 하나하나 꺼내어 함수를 넣는다 리턴 값이 참인 것만 묶어서 반환하는 함수 (일반적으로 람다 함수를 필터링할 때 사용) |
iter() | 반복 가능한 객체를 iterator로 반환 |
def mygen():
yield 'a'
yield 'b'
yield 'c'
g = mygen()
next(g)# generator.py
def mygen():
for i in range(1, 1000):
result = i * i
yield result
gen = mygen()
print(next(gen)) # 1
print(next(gen)) # 4
print(next(gen)) # 9# 제너레이터 컴프렌션에서 사용했던 문법을 함수형태의 제너레이터로 구현
def count():
count = 2
while True:
yield cont
count += 2
for i, j in zip(range(10), count()):
print(i, j)def count_up_to(n):
count = 1
while count <= n:
yield count
count += 1
count = count_up_to(5)
print(next(counter)) # 출력: 1
print(next(counter)) # 출력: 2def my_generator(data):
for i in data
yield i
my_list = [1, 2, 3, 4, 5]
my_iterator = my_generator(my_list)
for i in my_iterator:
print(i)def infinite_generator():
i = 0
while True:
yield i
i += 1
my_iterator = infinite_generator()
for i in my_iterator:
print(i)
if i >= 10:
breaka = [1, 2, 3]
b = ['a', 'b', 'c']
z = zip(a, b)
print(list(Z)) # [(1, 'a'), (2, 'b'), (3, 'c')]
# zip 객체는 한 번 사용되었으므로 빈 리스트가 반환
print(list(z)) # []li = [1, 2, 3]
st = ['a', 'b', 'c']
z = zip(li, st)
for i in z:
print(i)
for i in z:
print(i)li = [1, 2, 3]
i = iter(li)
next(i)
next(i)
next(i)
next(i) # StopIterationli = [1, 2, 3]
z = map(lambda x:x**2, li)
for i in z:
print(i)
for i in z:
print(i)li = [1, 2, 3]
z = reversed(lambda x:x**2, li)
for i in z:
print(i)
for i in z:
print(i)# 계속 순회가 가능하게 설계까 되어 있습니다.
# 이런 설계를 위에서 우리가 직접 해보게 될 것입니다.
li = [1, 2, 3]
z = sorted(li)
for i in z:
print(i)
for i in z:
print(i)gen = (x**2 for x in range(10))
print(next(gen)) # 출력: 0 (0의 제곱)
print(next(gen)) # 출력 :1 (1의 제곱)def create_gen():
alist = range(1, 4)
for x in alist:
yield x
my_generator = create_gen()
print(my_generator)
for n in my_generator:
print(n)
for n in my_generator:
print(n)# 일반 함수를 사용한 루프
import time
# function version
def fibon(n):
a = b = 1
result = []
for i in range(n):
result.append(a)
a, b = b, a +
return result
start_t = time.time()
for x in fibon(1000000):
pass
end_t = time.time()
print('total time = ', end_t - start_t)# 제너레이터를 사용한 루프
import time
# generator version
def fibon(n):
a = b = 1
for i in range(n):
yield a
a, b = b, a + b
start_t = time.time()
for x in fibon(1000000):
pass
end_t = time.time()
print('total time = ', end_t - start_t)