Friday 7 December 2018

Does the Python range generator generate all values or yields them progressively?





When you do something like this:



for i in range(5):
print i



What does Python do? Does it first generate an array with [0,1,2,3,4] and then goes over each item printing it?
Similar to:



for i in [0,1,2,3,4]:
print i


Or does it print each number as it generates them? Something like:





Generate 0 assign 0 to i print i



Generate 1 -> assign 1 to i -> print i



Generate 2 -> assign 2 to i -> print i



Generate 3 -> assign 3 to i -> print i



Generate 4 -> assign 4 to i -> print i





Update



I have added the tag for Python 2.7. I didn't think my question was version specific, but it seems it is!



Right now I am working with Python 2.7 so my question refers to that. But I find very valuable the information comparing Python 2 range against Python 3 range.


Answer



In Python 2, range() returns the whole list object then that list
object is iterated by for.




In Python 3, it returns a memory efficient iterable, which is an
object of its own with dedicated logic and methods, not a list. Now
for will get each value as it is generated by that iterable.



In Python 2 there is xrange() to get something like what Python 3's
range() do. Python 2's xrange is kind of halfway between Python 2's
range and Python 3's range. It's better than the former but not as
good as the latter.




Finally, in Python 3, if you want the whole list do:



>>> list(range(...))

No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...