欢迎访问宙启技术站
智能推送

Python中的range函数及其使用技巧

发布时间:2023-06-24 22:43:48

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。