Generator
Iterable Objects
- #!/usr/bin/python
-
- #list
- l = range(10);
- for i in l:
- print i;
-
- #tuple
- t = (1, 2, 3, 4);
- for i in t:
- print i;
-
- #dict
- d = {'x':1, 'y':2};
- for k in d:
- print k;
-
- #string
- s = 'Hello World!';
- for i in s:
- print i;
-
Iterator
- #!/usr/bin/python
-
- l = iter(range(10)); #iterator
-
- try:
- while True:
- print l.next(); #if no more element, raise StopIteration
- except StopIteration:
- pass
-
Implement Iterator as Classes
- #!/usr/bin/python
-
- class yrange:
- def __init__(self, n):
- self.i = 0
- self.n = n
-
- def __iter__(self): # make an object iterable
- return self # return an iterator
-
- def next(self):
- if self.i < self.n:
- i = self.i
- self.i += 1
- return i
- else:
- raise StopIteration()
-
- y = yrange(10);
-
- l = list(y); # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- print l;
- l = list(y); # []
- print l;
-
- Iterable and iterator are same, it is consumed in a single iteration
- #!/usr/bin/python
-
-
- class zrange:
- def __init__(self, n):
- self.n = n
-
- def __iter__(self):
- return zrange_iter(self.n)
-
- class zrange_iter:
- def __init__(self, n):
- self.i = 0
- self.n = n
-
- def __iter__(self):
- # Iterators are iterables too.
- # Adding this functions to make them so.
- return self
-
- def next(self):
- if self.i < self.n:
- i = self.i
- self.i += 1
- return i
- else:
- raise StopIteration()
-
- l = zrange(10);
-
- print list(l); # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- print list(l); # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
- Iterable and iterator are not same, every time a new iterator is created, is able to be re-used, same as xrange
Generator
- #!/usr/bin/python
-
- def yrange(n):
- i = 0;
- while i < n:
- yield i;
- i += 1;
-
- l = yrange(10);
- for i in l:
- print i;
-
- for i in l: # do not print anything, l has been consumed
- print i;
-
- Generator is iterator, can be consumed in a single iteration
Generator Expression
- #!/usr/bin/python
-
- # list
- l = [x*x for x in range(4)]; # [0, 1, 4, 9]
- print l;
-
- # generator
- g = (x*x for x in range(4));
- for i in g:
- print i;
-
Reference