Python range()函数详解及示例

653 阅读13分钟

range() 是一个内置的Python函数,它可以生成一个从给定起点到给定终点数字的不可变的整数序列。它返回一个可迭代的 对象,可以使用for循环语句进行迭代。range

通过for 循环和range 函数,我们可以创建一个循环结构,可以重复执行一个代码语句,最多可达一定的次数。让我们看看for 循环语句和range 函数的最小例子,并打印一个0到10的整数序列。

例子

#sequence [0,10)
for i in range(10):
    print(i)

#

注意: range函数只生成到尾数的整数序列,这意味着它不包括尾数。在上面的例子中,你也可以注意到它只生成0到9的序列,而不包括10。

如何使用range()函数

有两种语法可以在程序中实现range函数

range函数语法1

range(end)

在这种语法中,range函数只接受一个参数,这是必须的。

参数 end参数必须是一个整数,它代表序列的结束号,从 0.

返回

它返回一个可迭代的范围对象,这将是一个整数序列,从0 到. **end-1**.

我们可以使用内置的 type() 函数。

type(range(10))   # <class 'range'>

range(end) 函数的例子

让我们看看一些使用单参数值的 range() 函数的例子。

例子1

如果我们向range() 函数传递一个正整数,那么它将创建一个从0到指定正整数的序列。

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


例2

如果我们给单一的range函数参数传递一个负数,那么它将不会创建任何序列。

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

range函数语法2

range(start, end,[step=1])

在这种语法中,我们可以向range函数传递三个参数。

  1. start: 它是一个整数,定义了序列的起始点。
  2. end:它也是整数参数,但它定义了序列的排除结束数。
  3. step:它是可选的参数值,默认值为1,它定义了序列中连续数字之间的间隔数。

range() 例子

range(start, end)

当我们向range函数传递两个参数时,它会创建一个整数序列,从start 开始,在end-1 结束。

例子

#sequence of numbers
#from 10 to 19

for i in range(10, 20):
    print(i, end=",")   

输出

10,11,12,13,14,15,16,17,18,19,

在这个例子中,我们只给range() 函数指定了**开始 (10)结束 (20)**的参数值。由于step 参数是可选的,range 函数将其值视为 1,导致两个相邻数字之间的间隔为 1 步。

range(start, end, step)

现在让我们也来使用最后一个参数step ,看看它在代码中是如何发挥作用的。

当我们把所有三个参数传给range 函数 start, end, 和 steps 时,它将生成一个从 start 到 end-1 的整数序列,其步长为两个相邻数字之间的间隔。

例子

假设你想打印10到40之间的所有偶数,你只需要创建一个从10到40的范围函数,步长为2。

#even numbers between 20 to 40
for i in range(20, 40, 2):
    print(i, end =",")

输出

20,22,24,26,28,30,32,34,36,38

在这个例子中,你可以看到range 函数创建了一个从2040-1 的序列,而连续的数字之间的差值是2 ,指定为步长参数。

使用第三个参数step 的好处是,我们也可以创建一个负整数的序列,或者以相反的顺序。

例子

#sequence in negetive
for i in range(-1, -10, -1):
    print(i, end =",")   # -1,-2,-3,-4,-5,-6,-7,-8,-9,

#sequence in reverse order
for i in range(10, 1, -1):
    print(i, end =",")   # 10,9,8,7,6,5,4,3,2,

step 参数不能是0 ,否则,它将返回 ValueError: range() arg 3 must not be zero

注意: 所有的开始、结束和步骤参数都必须是整数。如果任何一个参数是字符串、浮点或任何其他数据类型,它将返回TypeError,错误如下。

带有range()的for循环

for 循环是一个迭代器,可以在一个可迭代的对象上迭代到固定的时间。在for循环的帮助下,我们可以迭代由range()函数生成的数字序列。

range函数是如何与for循环一起工作的?

range()函数并不是一次就能生成所有的序列号。与其说它是一个Python函数,不如说它是一个Python生成器,可以逐个生成序列号。

range 函数返回的范围对象并不包含序列的所有数字,相反,它只包含开始、结束和步骤值。当范围值很高时,这有助于节省内存空间。

x = range(1, 1000, 2)
print(x)     #range(1, 1000, 2)

范围函数只在需要时或for循环迭代时产生序列号。

范围函数不会一次性创建所有的序列号,使得对象在内存中的大小很小,并且加载速度很快。

句法

for i in range(start, end, [step]):
    #for loop body

例子

print("Multiples of 3")
for i in range(3, 31, 3):
    print(i, end =",")

输出

Multiples of 3
3,6,9,12,15,18,21,24,27,30,

使用range函数和for循环遍历一个列表

尽管像 list、string 和 tuples 这样的对象是可迭代的对象,而且for 循环可以直接在它们上面进行迭代,每次迭代一个项目。但是这些对象也支持索引,这意味着我们可以使用索引值访问它们的项目或字符。

当我们使用for循环遍历一个列表时,我们遍历的是列表中的项目,我们无法访问其索引值。假设你想根据for循环中的某些条件对列表项做一些改变,那么你可以使用

在这种情况下,我们利用range() 函数的帮助,用索引号遍历列表。使用 range()来遍历一个列表的好处是,我们可以用索引号来改变项目的值,并得到项目在列表中的位置。

当我们使用 range() 函数遍历一个列表对象时,我们需要列表对象的长度,这可以通过len() 函数找到。

让我们用一个 Python 程序来讨论它。

例子

假设我们有一个列表prices ,我们需要对大于 2999 卢比的价格给予10% 的折扣。

#list
prices = [129, 5372, 983, 636, 384, 7732, 3000, 999]
print("Old Prices:")
print(prices)

for i in range(len(prices)):
    #10% off on product with > 2999 
    if prices[i]>2999:
        prices[i] = prices[i] - (10/100)*prices[i]

print("New Prices:")
print(prices)

反向范围

range() 函数和step 参数的帮助下,我们也可以创建一个降序和逆序的整数序列。

如何使用range函数创建逆序序列

我们可以用两种方法来用范围函数创建一个逆序的数字序列。

  1. 使用负数的步骤。
  2. 使用带有范围函数的反转函数

1.使用负数步长

使用负的步长值是使用范围函数生成反向整数序列的一种更本源的方法。

在使用负的step 参数时,我们需要确保start 参数值必须大于end 参数值。

例子

让我们使用范围函数和负数步长创建一个反向的数字序列。

#reverse sequence from 10 to 1 using range function
for i in range(10, 0, -1):
    print(i, end =" ")

输出

10 9 8 7 6 5 4 3 2 1 

2.使用反转函数

reversed()是一个内置的函数,它可以将一个列表和元组元素按相反的顺序反转。 我们也可以用这个函数来反转一个范围对象,它是由范围函数返回的。

它还可以返回一个可迭代对象range_iterator ,可以使用for 循环进行迭代。

type(reversed(range(1,10)))   # <range_iterator object at 0x0000016217500110>

例1 将一个范围函数的序列从10倒转到1

#reverse the range function sequence using reversed function
for i in reversed(range(1, 10)):
    print(i, end= " ")  

输出

9 8 7 6 5 4 3 2 1

例2 将一个范围函数序列从20逆向到1,有两个步骤

#reverse the range function sequence using reversed function
for i in reversed(range(1, 20, 2)):
    print(i, end= " ")

输出

19 17 15 13 11 9 7 5 3 1

使用范围函数反转一个列表

在上一节中,我们看到了如何使用 range() 函数从左到右循环通过一个 Python 列表。

现在我们来讨论一下如何使用 range() 函数来回溯一个列表。

当涉及到使用for 循环和range 函数遍历一个列表的项目时,我们总是使用range 函数来表示列表的索引号。而要以反向顺序访问一个列表,我们需要创建一个range函数,它将给我们提供从n-1 到 -1 的索引值,步长为-1。

例子

prices = [100, 200, 300, 400, 500, 600, 700]

#start point will be the last value of list index
start = len(prices)-1

#end will be -1 because we want to include 0
end = -1

#step will be -1 because we want to a sequence in reverse order
step = -1

for i in range(start, end, step):
    print(prices[i], end =" ")

输出

700 600 500 400 300 200 100

使用range函数创建一个列表

我们知道,range函数返回一个整数序列作为一个范围对象。使用list() 函数可以将返回的范围对象转换为一个 Python 列表。

通过 range 和 list 函数,我们可以用一个固定的大小来初始化一个新的 list。

例子

假设我们想初始化一个包含 100 个项目的 list。我们可以用list() 函数将一个range(100) 对象转换为一个 list,而不是创建一个空 list 并追加 100 个元素。

#a list with 100 elements
my_list = list(range(100))

print(my_list)

输出

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

包容性和排他性范围参数

无论我们在range函数中使用一个、两个或全部三个参数,开始参数的值将是包容的,结束参数是排他的。

例如,range(10) 序列将从0开始,在9结束,10将被排除。另一个例子,range(10, 20, 2) 序列将从10开始,在18结束,排除20。

为了包括结束值,我们需要在结束值上加1。

例子

for i in range(10, 20+1, 2):
    print(i,end=" ")

输出

10 12 14 16 18 20 

连接两个范围函数序列

假设你有两个包含不同范围序列的范围函数对象,并希望将这两个序列串联成一个单一的序列。

比方说,你希望将range(3)range(3, 10, 2) 串联成[0,1,2,3,5,7,9] ,为此,你可以使用itertools模块中的连锁方法。chain() 方法接受迭代对象作为参数,并将其链入一个单一的迭代对象。

例子

from itertools import chain

#concatenate two range sequences
concatenated = chain(range(3), range(3,10, 2))

for i in concatenated:
    print(i, end =" ")

输出

0 1 2 3 5 7 9

range()函数和切分

与列表、元组和字符串类似,我们可以对range对象进行索引和切片。

对range对象进行索引

通过索引,我们可以从范围对象的序列中访问一个单独的项目。

例子

>>> range(10)[2]
2

>>> range(10)[1]
1
>>> range(10)[5]
5

我们还可以在范围对象上执行负数索引。

>>> range(10)[-2]
8
>>> range(10)[-1]
9
>>> range(10)[-5]
5

在范围对象上进行切分

当我们使用切片语法对一个范围对象进行切片时,它会返回一个范围对象序列。

range_slice = range(10)[2:7]

print(slice)   #<class 'slice'>


我们可以像普通的范围对象一样在返回的切片范围对象上进行迭代。

例子

range_slice = range(10)[2:7]

for i in range_slice:
    print(i, end=" ")

输出

2 3 4 5 6

注意: 在范围索引和切片中,如果我们使用任何超出序列范围的索引号,我们将收到错误信息 IndexError: range对象的索引超出了范围。

在字符和字母上的 range()

字符和字母在Python中表示为字符串,如果我们在range函数中使用字符串数据类型,如range('a', 'z') ,我们会收到TypeError。

为了在Python字符上执行range函数,我们首先需要使用ord() 函数将字符转换为其等效的整数ASCII码,使用该ASCII码形成一个range对象,然后使用chr() 函数将该ASCII码转换回该字符。

例子

让我们使用range函数创建一个从a到z的范围序列。

a_ascii = ord('a')
z_ascii = ord('z')

for i in range(a_ascii,z_ascii+1):
    print(chr(i), end=" ")

输出

a b c d e f g h i j k l m n o p q r s t u v w x y z 

总结

作为一个 Python 开发者,你将在你的脚本中经常使用 range 函数。当我们想重复执行一个代码块到一定的次数时,范围函数主要与for 循环一起使用。当我们想用索引号在 list、元组和字符串上循环时,也会用到它。

Python范围函数返回一个范围对象,它还包含一些属性,如start,stopstep ,这些属性返回对象的开始、结束和步骤参数值。

Python范围面试问题

问题。range()函数是否总是从0开始?

回答:不是。不是,只有当我们只向range函数传递一个参数时,它才从0开始,例如,range(9) ,序列从0开始,在8结束。而如果我们向range函数传递两个或三个参数时,序列将从指定的起点开始。

问题。Python中range()函数的返回值是什么?

答案: range() 函数返回一个可迭代的range 对象。

问题:range和list在Python中是否相同?在Python中,range和list是一样的吗?

回答:不是。不,两者是不同的数据对象,range() 是一个函数,列表是一个数据结构。但是我们可以用 list() 函数将一串范围内的数字转换成整数。

问题:如何求一个区间序列的总和?

回答:我们可以应用sum()函数。我们可以在范围对象上应用sum()函数,例如sum(range(10))将返回45,这是0到9的前10个数字的总和。