Posts /

파이썬의 Generator&Yield

08 May 2017

개요

Iterator를 생성해주는 function

일반 function과의 차이

yield

예시

 def gen(n):
  i = 0
  while i < n:
   yield i
   i += 1

 for x in gen(5):
  print(x)
  1. 우선적으로 for block의 gen()이 호출됨
  2. 함수 내부에서 진행하다 while 내부에서 yield를 만남
  3. Return 을 만난것 처럼 호출부로 반환 (여기서는 0) 그 후 함수가 종료되지 않음
  4. X에 yield로 받은 0이 대입되고 print 후 다시 반복하여 gen()을 호출
  5. 다시 gen()이 처음부터 시작되지 않고 yield 이후부터 시작(여기선 i += 1)
  6. While 내부에 있기 때문에 yield를 다시만나 증가한 값을 전달
  7. 반복…

generator expression

# List comprehension
[i for i in range(10) if i % 2]
# [1, 3, 5, 7, 9]

# Generator expression
(i for i in range(10) if i % 2)
# <generator object <genexpr> 0x0168F810>

활용

def sleep_func(x):
print "sleep..."
time.sleep(1)
return x

위와 같은 함수가 있을 때, List와 Generator의 차이는

# list 생성
list = [sleep_function(x) for x in range(5)]

for i in list:
print i

# 결과
sleep...
sleep...
sleep...
sleep...
sleep...
0
1
2
3
4
# generator 생성
gen = (sleep_function(x) for x in range(5))

for i in gen:
print i

# <결과>
sleep...
0
sleep...
1
sleep...
2
sleep...
3
sleep...
4

Twitter Facebook Google+