Python range() Function Explained

The Python range() function creates a sequence of numbers.

Beginners usually use it in for loops to repeat something a certain number of times or to work with number patterns. A very important detail is that range() stops before the end value.

Quick example

for i in range(5):
    print(i)

# Output:
# 0
# 1
# 2
# 3
# 4

range(5) creates numbers starting at 0 and stopping before 5.

What range() does

range() is used to generate numbers in order.

Key points:

  • range() creates a sequence of numbers
  • It is commonly used with for loops
  • The stop value is not included
  • It returns a range object, not a regular list

You will often see it with a loop like this:

for number in range(3):
    print(number)

Output:

0
1
2

If you are still learning loops, see Python for loops explained.

range() syntax

range() has three common forms:

range(stop)
range(start, stop)
range(start, stop, step)

Meaning of each argument:

  • start = first number
  • stop = end limit, not included
  • step = amount to move each time

range(stop)

When you give one value, Python treats it as the stop value and starts from 0.

print(list(range(5)))

Output:

[0, 1, 2, 3, 4]

range(start, stop)

This starts at start and stops before stop.

print(list(range(2, 6)))

Output:

[2, 3, 4, 5]

range(start, stop, step)

This also lets you control how much the value changes each time.

print(list(range(1, 10, 2)))

Output:

[1, 3, 5, 7, 9]

How the arguments work

Here are the most common patterns beginners use.

range(5)

print(list(range(5)))

Output:

[0, 1, 2, 3, 4]

This starts at 0 and stops before 5.

range(2, 6)

print(list(range(2, 6)))

Output:

[2, 3, 4, 5]

This starts at 2 and stops before 6.

range(1, 10, 2)

print(list(range(1, 10, 2)))

Output:

[1, 3, 5, 7, 9]

This moves by 2 each time, so it gives odd numbers from 1 to 9.

Using a negative step

A negative step makes range() count backward.

print(list(range(5, 0, -1)))

Output:

[5, 4, 3, 2, 1]

This works because the numbers move downward.

If the direction does not match the step, you may get an empty result:

print(list(range(1, 5, -1)))

Output:

[]

step cannot be 0

This causes an error:

range(1, 5, 0)

Python raises a ValueError because it cannot move by zero.

Using range() in a for loop

range() is most useful when:

  • You want to repeat something a set number of times
  • You need the current number in each loop
  • You are using the common pattern for i in range(n)

Example:

for i in range(3):
    print("Loop number:", i)

Output:

Loop number: 0
Loop number: 1
Loop number: 2

Repeating something a fixed number of times

for i in range(5):
    print("Hello")

This prints "Hello" five times.

Using the current number

for i in range(1, 4):
    print("Current number is", i)

Output:

Current number is 1
Current number is 2
Current number is 3

range() and indexing

You may see code like this:

items = ["a", "b", "c"]

for i in range(len(items)):
    print(i, items[i])

Output:

0 a
1 b
2 c

This works, and it uses len() to get the number of items.

But for beginners, direct looping is often simpler:

items = ["a", "b", "c"]

for item in items:
    print(item)

If you need both the index and the value, enumerate() is usually a better choice:

items = ["a", "b", "c"]

for index, item in enumerate(items):
    print(index, item)

You can learn more in how to use enumerate() in Python.

Converting range() to a list

range() does not directly show all numbers as a normal list.

To see the values, convert it with list():

print(list(range(3)))

Output:

[0, 1, 2]

This is helpful for:

  • learning how range() works
  • checking your values
  • debugging code

For example:

numbers = range(4)

print(numbers)
print(list(numbers))

Output:

range(0, 4)
[0, 1, 2, 3]

If you want to understand this difference more clearly, see Python range vs list(range) explained.

Common beginner mistakes

Here are some common problems with range().

Expecting the stop value to be included

Many beginners think this:

print(list(range(1, 5)))

will produce:

[1, 2, 3, 4, 5]

But the real output is:

[1, 2, 3, 4]

The stop value is excluded.

Assuming range(5) starts at 1

It starts at 0, not 1.

print(list(range(5)))

Output:

[0, 1, 2, 3, 4]

Using a string instead of an integer

This often happens with input():

user_number = input("Enter a number: ")

for i in range(user_number):
    print(i)

This fails because input() returns a string.

Correct version:

user_number = int(input("Enter a number: "))

for i in range(user_number):
    print(i)

If you see an error here, read TypeError: 'str' object cannot be interpreted as an integer.

Using a negative step with start smaller than stop

This does not count backward correctly:

print(list(range(1, 5, -1)))

Output:

[]

If the step is negative, the start usually needs to be larger than the stop.

Trying to use step = 0

This is not allowed:

range(1, 10, 0)

Python raises an error because the sequence cannot move.

Forgetting that range() is not a list

This can confuse beginners when printing values:

print(range(5))

Output:

range(0, 5)

To see the numbers, use:

print(list(range(5)))

Output:

[0, 1, 2, 3, 4]

Useful checks while debugging

If range() is not doing what you expect, these quick checks can help:

print(range(5))
print(list(range(5)))
print(list(range(2, 8)))
print(list(range(10, 0, -2)))
print(type(range(5)))

These help you confirm:

  • what values are being created
  • whether the direction is correct
  • whether you are working with a range object

FAQ

Does range() include the last number?

No. The stop value is excluded.

Why does range(5) start at 0?

When only one argument is given, Python uses it as the stop value and starts from 0.

Can range() count backward?

Yes. Use a negative step, such as range(5, 0, -1).

Is range() a list?

No. It returns a range object. Use list(range(...)) if you need a list.

Why does range(input()) fail?

input() returns a string. Convert it first with int(input()).

See also