Python Study Group: Generator
# Generator
# YiPo (2016-06-06)
# A) Getting Start
def gen_range(n):
the_list, i = [], 0
while i < n:
the_list.append(i)
i += 1
return the_list
for i in gen_range(10):
print(i)
print(sum(gen_range(10 ** 6))) # requires so much memory to hold the list.
# B) Iterable Object
class gen_range:
def __init__(self, n):
self.i, self.n = 0, n
# Step 1:
def __iter__(self):
return self
# Step 2: for Python 3
def __next__(self):
return self.next()
# Step 2: for Python 2
def next(self):
if self.i < self.n:
self.i += 1
return self.i - 1
else:
raise StopIteration # Step 3: throws the exception
# Today's Keyword: boilerplate
print(sum(gen_range(10 ** 6)))
# C) Generator Function
def gen_range(n):
i = 0
while i < n:
yield i
i += 1
# About 'yield'?
# http://en.cppreference.com/w/cpp/thread/yield
print(sum(gen_range(10 ** 6)))
# Summary
'''
| Python 2 | Python 3
----+----------+----------
1) | range() |
----+----------+----------
3) | xrange() | range()
----+----------+----------
'''
# Generator is a special iterator, while list and set (containers) are also interable.
# Reference: http://wiki.python.org/moin/Generators