当需要执行特定次数的操作时,Python内置的range函数十分方便。
读罢本文,你将:
理解Python的range函数是如何工作的
了解Python 2和Python 3中的实现方式有何不同
看过了不少range()函数操作实例
有能力解决它的一些局限性
让我们开始吧!
range()函数的历史
虽然Python 2的range()和Python3中的range()共享了一个名字,但它们是完全不同的家伙。事实上,Python 3中的range()只是Python 2中被称为xrange的函数的重命名版本。
最初range()和xrange()都生成可以用for循环迭代的数字,但是前者同时生成这些数字的列表,而后者则懒洋洋地生成数字,这意味着后者只能在需要时一次返回一个数字。
巨大的列表会占用内存,所以xrange()取代range()的名称和一切都不奇怪。您可以在PEP 3100中了解更多关于这个决定和xrange() vs range()的背景信息。
注:PEP代表Python改善提议。PEPs是涵盖广泛主题的文档,其主题包括提出的新特性、风格、管理和哲学。
他们有很多。PEP 1解释了它们是如何工作的,并且是一个入门的好地方。
在本文其余部分中,您将使用Python 3中的range()函数。
让我们开始吧!
让我们来循环
在深入研究range()如何工作之前,我们需要先看看循环是如何工作的。循环是计算机科学中的一个重要概念。掌握循环是成为一名优秀程序员的第一步。
下面是Python中for循环的一个例子:
输出如下:
正如你所见,for循环使您可以执行特定的代码块,多少次都没问题。在这种情况下,我们遍历一个船长舰长名单,打印他们的名字。
虽然《星际迷航》很棒,但你可能想做的不仅仅是简单的圈出舰长的名单。有时,您只希望执行特定次数的代码块。循环可以帮助你做到这一点!
试运行下面的代码,其中的数字可以被3整除:
该循环的输出如下:
这是我们想要的输出,所以循环充分地完成了工作,但是还有另一种方法通过使用range()获得相同的结果。
注:最后一个代码示例有一些字符串格式化。更多相关内容参见:Python String Formatting Best Practices和Python 3’s f-Strings: An Improved String Formatting Syntax (Guide)
到此你已对循环更熟悉了,接下来让我们看看如何使用range()来简化。
从range()开始
那么Python的range函数是如何工作的呢?简单地说,range()允许你在给定范围内生成一系列数字。你可以根据传递给函数的参数数量决定该系列数字的开始和结束位置,以及该系列数字与下一个数字之间的步长。
让我们在操作中先睹为快:
在这个for循环中,你可以轻松地创建可被3整除的一系列数字,而不必自己提供每个数字。
注:尽管这个例子适当的使用了range(),但通常不喜欢在for循环里中频繁使用range()。
例如,下面的range()用例,一般不被认为是Python风格的:
range()非常适合创建数字的迭代,但是当你需要迭代可用in操作符完成循环的数据时,它不是最佳选择。
更多详情参见:How to Make Your Python Loops More Pythonic.
你可用下述三种方式调用range():
需要一个参数
需要两个参数
需要三个参数
range(stop)
当使用一个参数调用range()时,您将得到一系列数字,这些数字从0开始,包括直到(但不包括)stop的每个整数。
以下是实践中的情况:
循环的输出如下
结果显示:输出的所有数字都在0到3之间,但不包括提供的3。
range(start, stop)
当你用两个参数调用range()时,你不仅要决定一系列数字停止的位置,而且还要决定它从哪里开始,所以你不必总是在0点开始。可以使用range()来使用范围(A,B)生成从A到B的一系列数字。让我们来看看如何生成一个从1开始的范围。
尝试用两个参数调用range():
输出如下:
到目前为止,非常好:您拥有从1(作为开始提供的数字)到但不包括8(作为停止提供的数字)的所有整数。
但是如果您再添加一个参数,那么您就能够重现前面使用number_divisible_by_three列表时得到的输出。
range(start, stop, step)
当使用三个参数调用range()时,您不仅可以选择数字序列的开始和停止位置,还可以选择一个数字与下一个数字之间的步长。如果不提供step,那么range()将自动取step=1。
注:step可以是正数也可以是负数,但不能为0:
若以0为步长,将报错。
现在你知道如何使用step,可以回到我们之前看到的循环除以3。
自己试试看:
输出将完全类似于本文前面看到的使用名为number_divisible_by_three的列表时的for循环的输出:
正如你在这个例子中看到的,你可以使用step参数增加到一个更高的数值。这叫做递增
用range()实现递增
如果你想实现递增,那么你需要将step设为正数。为了解这个的现实意义,键入以下代码:
如果step取25,那么循环的输出将是这样的
你得到的数字比前一个数字大25——你提供的step。
现在,你已经看到了如何向前迈进一个距离,现在是时候看看你如何向后递减。
用range()实现递减
如果你的step是正数,那么你会得到一系列不断递增的数字。如果你的step为负数,那么你会得到一系列递减的数字。这可以让你从数字中倒退过来。
在下面的示例中,step取-2。这意味着每个循环的递减步长为2
递减循环的输出如下:
你有一串数字,每一个都比前一个数字小2,这是你提供的step的绝对值。
创建一个递减范围的最快速的方法是使用range(start,stop,step)。但是Python确实有一个内置的反函数。如果在reversed()中包装range(),则可以以相反的顺序打印整数
试试看:
你将得到如下结果:
range()使迭代递减的数序列成为可能,而reversed()通常用于以相反的顺序对序列进行循环。
领取专属 10元无门槛券
私享最新 技术干货