Generator
Expressions are generator version of list comprehensions. They look like list
comprehensions, but return a generator back instead of a list. One drawback
with the list comprehensions is that values are calculated all at once
regardless of whether the values are needed at that time or not. This sometimes
can consume amount of computer memory. Thus the generator expressions were
suggested.
Generator
expressions are like list comprehensions; the only difference
is that the square brackets in list comprehensions are replaced by circular
brackets that return. A simple list comprehension for getting the square
root is as follows
>>> squ =
[ i*2 for i in range(5)]
>>> print
squ
[0, 2, 4, 6, 8]
Now the same thing
can be generated using the Generator Comprehension are,
>>> squ =
(i*2 for i in range(5))
>>> print
squ
<generator
object <genexpr> at 0x8734870>
Now when we print
the squ, we don’t see the elements rather we see the Object type. Now if want
to see the element we need to use the for loop like,
>>> for s
in squ:
... print s
...
0
2
4
6
8
Now lets define a
sample Class that provides us the Generator approach,
#!/software/python/2.7
def Reverse(data):
for index in range(len(data)-1,-1,-1):
yield data[index]
def Main():
ref = Reverse("This is Jagadish")
for c in ref:
print c
if __name__ == "__main__":
Main()
The same thing can
be written using the generator expression approach as,
data ="master
is good"
print(list(data[i]
for i in range(len(data)-1,-1,-1)))
So where does these
Generators are being used,
So what does this
generator expression provide over list comprehensions -
Iterating over the
generator expression or the list comprehension will do the same thing. However,
the list comprehension will create the entire list in memory first while the
generator expression will create the items on the fly, so you are able to use
it for very large (and also infinite!) sequences
Use list
comprehensions when the result needs to be iterated over multiple times, or
where speed is paramount. Use generator expressions where the range is large or
infinite.
The benefit of a
generator expression is that it uses less memory since it doesn't build the
whole list at once.
No comments :
Post a Comment