yipo
6/7/2016 - 1:39 PM

Python Study Group: Generator

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