Advanced Uses of range()
So far, you’ve seen how you can use the range function to generate a list of integers. It might appear that using range() in a for loop is equivalent to using a list of incrementing or decrementing values, but that’s not the case. There are some important similarities and differences. range() is its own class in Python:
>>> type(range(3))
<class 'range'>
range isn’t a list, but it dynamically manages a list in memory.
00:00
So far, we’ve seen how we can use the range() function to generate a list of integers. It would appear that using range() in a for loop is equivalent to using a list of incrementing or decrementing values—but that’s actually not the case.
00:20 There are some important similarities and differences. To explain them, I’m going to use the interactive shell.
00:28
I’ve been saying that the range() function generates a list of numbers, which is true, but it’s not the same as just having a list. To prove this, I’ll use the type() function, passing in a call to range().
00:47
As you can see, range is its own class in Python. range is clearly not a list, but instead it dynamically manages a list in memory.
01:01
Even though range itself isn’t an iterable type, we can still use common indexing and slicing techniques as if it were an iterable. For example, I can say range(3) and get the element at index 1, which is 1. Now take a look at this.
01:25
I’m going to slice a range like this, range(6) from 2 to 5. This is the same way we would slice a string or a list in Python, but this probably wasn’t what you were expecting. Rather than exposing the underlying list, slicing a range just returns another range that can generate the list we need.
01:54
But why does this even matter? One word: performance. In Python 3, range() is lazy, which means that it generates new values on a need-by-need basis, rather than when execution reaches the range() call.
02:13 If the whole list of numbers isn’t needed by our program, it isn’t stored in memory, which can result in some noticeable performance improvements in very large programs.
02:25
If we want to force the range() function to spit out the underlying list, we can simply pass it in to the built-in list() function just like this.
02:37
Back in Python 2, things used to be a little bit different. range() would generate the numbers all at once and xrange() would generate the numbers lazily.
02:51
In Python 3, range() replaces the old xrange(), and xrange() no longer exists.
Become a Member to join the conversation.