Python中的range函数及其使用技巧
Python是一种功能强大的编程语言,其内置的range函数是一种用于简化程序编写的方便的工具。
range函数的一般形式如下:
range([start], stop[, step])
其中,start参数表示序列开始的数字(默认值为0),stop参数表示序列停止的数字(必需),而step参数表示序列中数字之间的间距(默认为1)。
从这个定义中可以看出,range函数用于生成一个数字的序列,这个序列通常用于循环中,可以方便地迭代整数。
例如,要输出10个数字(从1到10),可以使用以下代码:
for i in range(1, 11):
print(i)
输出结果为:
1
2
3
4
5
6
7
8
9
10
在这个例子中,我们使用了range函数来生成整数序列(从1到11),然后使用for循环语句输出了每个数字。
在range函数中,start值是可选的,如果不提供,则默认为0。此时,range函数生成的数字序列将从0开始。例如:
for i in range(5):
print(i)
在这个例子中,我们没有提供start参数,所以range函数生成的数字序列从0开始(到5为止)。输出结果为:
0
1
2
3
4
另外一个可选参数是step,它表示数字之间的间隔。例如,要输出10以内的偶数可以使用以下代码:
for i in range(0, 10, 2):
print(i)
在这个例子中,我们从0开始,每隔2个数字输出一个数字,直到数字大于等于10为止。输出结果为:
0
2
4
6
8
在Python中,range函数同样支持反向计数。例如,要输出10到1之间的数字序列,可以使用以下代码:
for i in range(10, 0, -1):
print(i)
在这个例子中,我们从10开始,每次递减1,输出数字序列直到1为止。输出结果为:
10
9
8
7
6
5
4
3
2
1
range()的实现
在了解应用技巧前,了解Python3.7源码实现,及性能提升情况
def range(start, stop=None, step=1):
# range(stop)
if stop is None:
stop = start
start = 0
# placeholder for zero step check
effStep = step or 1
# Calculate the effective length of the range, taking into account the
# step (don't need to worry about signedness here because step != 0)
n = (stop - start) // effStep
if (stop - start) % effStep:
n += 1
if n <= 0:
# empty range
return []
# An unfortunate asymmetry, because the arguments to range() have
# their types checked lower down, so that nonsensical cases such as
# range(0, 'spam') also get stopped. So, we have to manually
# raise a TypeError in this situation here.
if step == 0:
raise ValueError("range() arg 3 must not be zero")
result = [0] * n
i = start
for j in range(n):
result[j] = i
i += step
return result
在Python3.7中,range函数计算方法改变,新增了“懒惰模拟”的算法以提升性能。
在Python的早期版本中range函数返回的是一个列表,而当数据量比较大的时候就会占用大量内存。为了避免这个问题,Python3.7中的range函数不再返回列表,而是返回一个range对象,当需要取出相应的元素时才计算其值。
这个算法的流程比较简单。当range函数被调用时,它会首先计算出这个数字序列的长度,也就是数字的个数。然后它会返回一个range对象,这个对象保存了数字序列的起始值、长度和数字之间的间隔。这些信息被保存在内存中,而不是保存整个数字序列。当需要取出某个数字时,range对象会根据这些信息计算出相应的值。这种算法被称为“懒惰模拟”,因为它仅在需要时才计算数字序列中的值。
应用技巧
1.将range转换成列表
有时候我们需要将一个数字序列转换成列表,这里利用列表推导式解决。
例如,将数字序列(从1到10)转换成列表,可以使用以下代码:
my_list = [i for i in range(1, 11)]
在这个例子中,我们使用列表推导式将数字序列转换成了列表,输出结果为:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2.使用range控制循环次数.
在循环语句中使用range函数,可以控制循环次数。
例如,需要从用户输入的数字中找出最大值,可以使用以下代码:
max_num = -float('inf')
for i in range(int(input('How many numbers? '))):
new_num = float(input('Enter a number: '))
if new_num > max_num:
max_num = new_num
print('The maximum number is:', max_num)
在这个例子中,我们使用range函数控制了循环次数,循环次数由用户输入的数字确定。每次循环中,我们从用户输入中读取一个新的数字,并将其与当前的最大值进行比较,以确定新的最大值。最后我们输出结果。
3.生成斐波那契数列(Fibonacci sequence)。
斐波那契数列是一种非常常见的数字序列,定义如下:
F(0) = 0
F(1) = 1
F(n) = F(n-1) + F(n-2), for n > 1
斐波那契数列的前几个数字为:0、1、1、2、3、5、8、13、21、34、55……以此类推。
要生成斐波那契数列,可以使用以下代码:
a, b = 0, 1
for i in range(10):
print(a)
a, b = b, a + b
在这个例子中,我们使用了一个变量 a 和 b,它们分别代表斐波那契数列中的两个数字。我们从0和1开始,并使用循环语句依次输出斐波那契数列的前10个数字。每次循环中,我们计算出新的斐波那契数列中的数字,并把它们赋值给a和b。
