跳至主要内容

Python range() 函数教程

通过示例了解 Python range() 函数及其功能。
· 7分钟 阅读

使用 AI 探索

range() 函数是在 Python 中非常流行且广泛使用的函数,尤其是在使用 for 循环时,有时也会配合 while 循环。值得了解并熟练掌握 range(),因为它能打开许多大门:从控制程序流程到遍历用于数据分析的数据集,都会用到 range()。

如果您刚开始学习 Python 并希望了解更多,请参加 DataCamp 的 Introduction to Data Science in Python 课程。

什么是 Python 中的 range() 函数?

range() 函数返回一个数字序列,并且是不可变的,也就是说其值是固定的。range() 函数可接收一到三个参数,即 start、stop 和 step。

range() 在 Python3 中引入。在 Python2 中使用的是类似的函数 xrange(),其行为略有不同。比如,xrange() 返回的是生成器对象,内存占用更少,而 range() 则返回一个数字的列表或序列。

range() 函数之所以有用,部分原因在于它只存储 start、stop 和 step 三个值,与列表或元组相比更省内存。

Python range() 函数语法

range() 函数可以有三种形式,或可理解为三个 range() 参数:

  • range(stop_value):默认起点为 0。
  • range(start_value, stop_value):根据起止值生成序列。
  • range(start_value, stop_value, step_size):通过给起始值按步长递增,直到达到终止值为止来生成序列。
Python range 函数示例
Python range() 函数。作者制图。

我们也可以通过在 range() 外包一层 type() 来检查 range() 的类型。

my_range = range(100)
print(type(my_range))

# Expected output: <class 'range'>

Python range() 函数示例

现在来看一些示例,帮助您练习并掌握 range() 的用法。

使用 Python range() 打印一串数字

先从一个简单示例开始:打印十个数字的序列,这将覆盖您的第一个 range() 参数形式。为此,您只需传入 stop 值。由于 Python 使用从 0 开始的索引,因此序列将从 0 开始,在指定数字处停止,即 n-1,其中 n 是 range() 中指定的数字。

my_range = range(10)

for num in my_range:
	print(num)

# Expected output:
# 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9

如预期,上述单元返回从 0 开始到 9 结束的数字序列。

将 Python range() 与 list() 搭配使用

您也可以将 range 函数作为 list 的参数使用,此时会得到一个长度等于 stop 值的数字列表,如下所示:

my_range = list(range(10))
print(my_range)

range_length = len(my_range)
print(range_length)

# Expected output:
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 10

在 Python range() 中使用 start、stop 和 step

接下来看看使用 range() 的另一种方式。这里您将同时指定 start 和 stop 值。

my_range = range(5, 10)
print(my_range)

# Expected output: range(5, 10)
for num in range(5,10):
    print(num)

# Expected output:
# 5
# 6
# 7
# 8
# 9

类似地,您也可以使用 range() 打印负整数值。

for num in range(-5,0):
    print(num)

# Expected output:
# -5
# -4
# -3
# -2
# -1

现在为 range() 函数加入第三个参数,即 step 步长,看看它如何影响输出。您将指定 start 为 50,stop 为 1000,step 为 100。下面的 range 函数应输出一个从 50 开始、每次递增 100 的序列。

my_range = range(50,1000,100)
print(my_range)

# Expected output: range(50, 1000, 100)

您会注意到它会打印所有的偶数。

for num in range(50,1000,100):
    print(num)

# Expected output:
# 50
# 150
# 250
# 350
# 450
# 550
# 650
# 750
# 850
# 950

关于 Python range() 与浮点数的说明

需要注意的是,range() 只能在指定值为整数(整型)时工作。它不支持浮点数数据类型和字符串数据类型。不过,您可以向它传入正整数或负整数。来看当您尝试传入浮点数时会发生什么。

for num in range(0.2,2.4):
    print(num)

# Expected output:
# TypeError: 'float' object cannot be interpreted as an integer

在用 C 语言反转一个整型链表时,您可能至少有一次抓耳挠腮。但在 Python 中,只需交换 start 与 stop,并加上一个负的步长,就能用 range() 实现。这是不是很简单?一起来看看!

for num in range(100,10,-10):
    print(num)

# Expected output:
# 100
# 90
# 80
# 70
# 60
# 50
# 40
# 30
# 20

使用 range() 求列表之和

假设您有一个整数列表,希望使用 range() 来求列表的总和。让我们看看如何实现。

首先,定义由整数组成的列表。然后初始化一个计数器,每次遍历列表时都将当前列表值与旧的计数值相加并存储。

要访问列表中的元素,您将对列表的 length 使用 range() 函数,然后通过传入索引 i(从零开始到列表长度结束)来访问列表元素。

list1 = [2,4,6,8,10,12,14,16,18,20]
count = 0

for i in range(len(list1)):
    count = count + list1[i]
    print(count)
print('sum of the list:', count)

# Expected output:
# 2
# 6
# 12
# 20
# 30
# 42
# 56
# 72
# 90
# 110
# sum of the list: 110

将 range() 与 itertools 一起用于拼接列表

您也可以使用 itertools 包中的 chain 类来拼接两个或多个 range()。不仅是 range,还可以拼接列表、元组等。请记住,chain 方法返回一个生成器对象,要访问该生成器对象中的元素,您可以使用 for 循环,或使用 list 并将生成器对象作为参数传入。

from itertools import chain

a1 = range(10,0,-2)
a2 = range(30,20,-2)
a3 = range(50,40,-2)

final = chain(a1,a2,a3)

print(final) #generator object

# Expected output: <itertools.chain object at 0xae6330>
print(list(final))

# Expected output:
# [10, 8, 6, 4, 2, 30, 28, 26, 24, 22, 50, 48, 46, 44, 42]

Python range() 与相等性比较

您可以在 range() 之间进行相等性比较。给定两个 range(),如果它们表示的值序列相同,则被视为相等。也就是说,两个相等的 range() 并不需要拥有相同的 start、stop 和 step 属性。通过示例来理解。

# range(0, 10, 3) = [0, 3, 6, 9]
# range(0, 11, 3) = [0, 3, 6, 9]

print(range(0, 10, 3) == range(0, 11, 3))

# Expected output: True
# range(0, 10, 3) = [0, 3, 6, 9]
# range(0, 11, 2) = [0, 2, 4, 6, 8, 10]

print(range(0, 10, 3) == range(0, 11, 2))

# Expected output: False

从上述输出可以看到,尽管 range() 的参数不同,但由于两个函数的序列相同,仍被视为相等。在第二个例子中,更改 step 使比较结果为 False。

结语

恭喜您完成本教程。您可以继续尝试折腾一下 range() 函数,看看能否自定义它以接受除整数以外的数据类型。

如果读完之后觉得练习 Python 函数会有所帮助,不妨看看我们的 Python Functions 和 Beginner's Guide to Python for Loops 教程。想要系统化学习路径,可以了解我们的 Writing Efficient Python Code DataCamp 课程,该课程不仅深入讲解 range(),还涵盖更多通用的编码概念,帮助您在不增加太多开销的情况下写出高效代码。

主题