说明

range当您需要执行特定次数的操作时,Python的内置函数非常方便。作为一个经验丰富的Pythonista,您很可能曾经使用过它。但是它是做什么的呢?

在本指南结束时,您将:

  • 了解Pythonrange函数的工作原理
  • 了解Python 2和Python 3中的实现方式有何不同
  • 看到了许多动手的range()例子
  • 有能力克服一些局限性
  • 让我们开始吧!

Pythonrange()函数的历史

尽管range()在Python 2和Python 3中可能共享一个名称,但是它们是完全不同的动物。实际上,range()在Python 3中只是xrange在Python 2中调用的函数的重命名版本。

最初,两者range()和xrange()产生的数字都可以使用for循环进行迭代,但是前者一次生成所有这些数字的列表,而后者则懒惰地产生数字,这意味着需要时一次返回一个数字。

闲逛着巨大的清单会占用内存,因此xrange()替换range(),名称和所有内容不足为奇。您可以在PEP 3100中阅读有关此决定和xrange() vsrange()背景的更多信息。

注意: PEP代表Python增强建议。PEP是可以涵盖广泛主题的文档,包括建议的新功能,样式,治理和理念。
他们有很多。PEP 1解释了它们如何工作,是一个很好的起点。

在本文的其余部分,您将使用Python 3中存在的函数。

开始了!

让我们循环

在深入研究range()工作原理之前,我们需要看一下循环工作原理。循环是计算机科学的关键概念。如果您想成为一名优秀的程序员,那么掌握循环就是您需要采取的第一步。

这是Python中for循环的示例:

captains = ['Janeway', 'Picard', 'Sisko']for captain in captains:print(captain)

输出如下:

Janeway
Picard
Sisko

如您所见,for循环使您可以执行任意次数的特定代码块。在这种情况下,我们循环浏览了一系列队长并打印了他们的每个名字。

尽管《星际迷航》非常出色,但您可能要做的不只是简单地浏览一系列队长。有时,您只想执行一段代码特定次数。循环可以帮助您做到这一点!

尝试使用下面的代码将数字除以三:

numbers_divisible_by_three = [3, 6, 9, 12, 15]for num in numbers_divisible_by_three:quotient = num / 3print(f"{num} divided by 3 is {int(quotient)}.")

该循环的输出将如下所示:

3 divided by 3 is 1.
6 divided by 3 is 2.
9 divided by 3 is 3.
12 divided by 3 is 4.
15 divided by 3 is 5.

这就是我们想要的输出,因此循环充分完成了工作,但是还有另一种方法可以通过使用获得相同的结果range()。

注意:最后一个代码示例具有一些字符串格式。要了解有关该主题的更多信息,可以查看Python字符串格式最佳实践和Python 3的f字符串:改进的字符串格式语法(指南)。

现在您对循环更加熟悉了,让我们看看如何使用它range()来简化生活。

Pythonrange()基础

那么Python的range功能如何工作?简而言之,它range()允许您在给定范围内生成一系列数字。根据传递给函数的参数数量,您可以确定该系列数字在何处开始和结束以及一个数字与下一个数字之间的差值有多大。

这是range()行动的先睹为快:

for i in range(3, 16, 3):quotient = i / 3print(f"{i} divided by 3 is {int(quotient)}.")

在此for循环中,您可以简单地创建一系列可被整除的数字3,因此您不必自己提供每个数字。

注意:尽管此示例显示了的适当用法range(),但range()在for循环中使用它的频率通常过高。

例如,以下的用法range()通常被认为不是Pythonic:

captains = ['Janeway', 'Picard', 'Sisko']for i in range(len(captains)):print(captains[i])

range()这对于创建数字的可迭代变量非常有用,但是当您需要对可能被in运算符循环的数据进行迭代时,这并不是最佳选择。

如果您想了解更多信息,请查看如何使Python循环更Pythonic。
您可以通过三种方式致电range():

  1. range(stop) 有一个论点。
  2. range(start, stop) 有两个参数。
  3. range(start, stop, step) 需要三个参数。

1. range(stop)

当您range()使用一个参数调用时,您将获得一系列数字,其起始于0并包括直到(但不包括)以所提供的数字为单位的所有整数stop。

这是实际的情况:

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

循环的输出将如下所示:

0
1
2

可以检查出:我们拥有从0到的所有整数,但不包括3您提供的stop。

2. range(start, stop)

当range()使用两个参数进行调用时,不仅要决定一系列数字的终止位置,而且还要决定其起始位置,因此您不必一直都在开始0。您可以使用range()来从一系列数字的一到乙使用range(A, B)。让我们了解如何从开始生成范围1。

尝试range()使用两个参数进行调用:

for i in range(1, 8):print(i)

您的输出将如下所示:

1
2
3
4
5
6
7

到目前为止,一切都很好:您拥有从1(您提供的编号start)到但不包括8(您提供的编号stop)的所有整数。

但是,如果再添​​加一个参数,则可以重用之前使用名为的列表时得到的输出numbers_divisible_by_three。

3. range(start, stop, step)

当range()使用三个参数调用时,不仅可以选择一系列数字的起始和终止位置,还可以选择一个数字与下一个数字之间的差值。如果不提供step,那么range()会自动表现得好像step是1。

注意: step可以是正数或负数,但不能是0:

>>> range(1, 4, 0)
Traceback (most recent call last):File "<stdin>", line 1, in <module>
ValueError: range() arg 3 must not be zero

如果您尝试将其0用作步骤,则会收到错误消息。

现在,您知道如何使用它step,您终于可以重新访问我们之前用除以看到的那个循环3。

自己尝试:

for i in range(3, 16, 3):quotient = i / 3print(f"{i} divided by 3 is {int(quotient)}.")

输出将看起来就像for循环您看到本文前面的输出,当你使用命名名单

numbers_divisible_by_three:3 divided by 3 is 1.
6 divided by 3 is 2.
9 divided by 3 is 3.
12 divided by 3 is 4.
15 divided by 3 is 5.

如本例所示,您可以使用step参数将其增加到更大的数字。这就是所谓的增量。

随着增加 range()

如果要增加,则需要step为正数。要了解这实际上意味着什么,请输入以下代码:

for i in range(3, 100, 25):print(i)

如果您step是25,则循环的输出将如下所示:

3
28
53
78

你有一定范围的各自大于由前面的数字号码25中,step您所提供。

既然您已经了解了如何在范围内前进,那么现在该看看如何向后退。

递减 range()

如果您的观点step是肯定的,那么您将经历一系列递增的数字并且正在递增。如果您step为负数,那么您将经历一系列递减的数字并递减。这使您可以倒转数字。

在以下示例中,您step为-2。这意味着您将为2每个循环递减:

for i in range(10, -6, -2):print(i)

递减循环的输出将如下所示:

10
8
6
4
2
0
-2
-4

您得到的数字范围分别比前面的数字小,即您提供2的绝对值step。

创建递减范围的最Pythonic方法是使用range(start, stop, step)。但是Python确实具有内置reversed功能。如果包裹range()在中reversed(),则可以按相反顺序打印整数。

试试看:

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

您将获得:

4
3
2
1
0

range()使得可以对递减的数字序列进行迭代,而reversed()通常用于以相反的顺序循环序列。

注意: reversed()也适用于字符串。您可以reversed()在如何在Python中反转字符串中了解有关with字符串功能的更多信息。

Python range()函数的高级用法示例

既然您已经知道了如何使用的基础知识range(),那么该深入了解了。

range() 主要用于两个目的:

  1. 执行for循环的主体特定次数
  2. 比使用列表或元组创建更有效的整数可迭代
    第一次使用可能是最常见的用法,并且可以证明itertools为您提供了一种比构造iterables更有效的方式range()。

使用范围时,请记住以下几点。

range() 是Python中的一种类型:

>>> type(range(3))
<class 'range'>

您可以range()像按列表一样访问by索引中的项目:

>>> range(3)[1]
1
>>> range(3)[2]
2

您甚至可以在上使用切片符号range(),但是一开始在REPL中的输出似乎有点奇怪:

>>> range(6)[2:5]
range(2, 5)

虽然该输出可能看起来很奇怪,但将a切片range()仅会返回另一个range()。

您可以访问range() by 元素并切片arange()的事实突出了一个重要事实:range()与列表不同,它是惰性的,但不是迭代器。

浮动和 range()

您可能已经注意到,到目前为止,我们一直在处理的所有数字都是整数,也称为整数。那是因为range()只能接受整数作为参数。

浮游物语

在Python中,如果数字不是整数,则为浮点数。整数和浮点数之间有一些区别。

整数(int数据类型):

  • 是整数
  • 不包含小数点
  • 可以是正数,负数或 0

浮点数(float数据类型):

  • 可以是任何包含小数点的数字
  • 可以是正数或负数

尝试range()以浮点数进行通话,看看会发生什么:

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

您应该收到以下错误信息:

Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: 'float' object cannot be interpreted as an integer

如果需要找到一种允许使用浮点数的解决方法,则可以使用NumPy。

range()与NumPy一起使用

NumPy是第三方Python库。如果要使用NumPy,则第一步是检查是否已安装它。

您可以在REPL中执行以下操作:

>>> import numpy

如果您获得ModuleNotFoundError,则需要安装它。为此,请转到命令行并输入pip install numpy。

安装完成后,放入以下内容:

import numpy as npnp.arange(0.3, 1.6, 0.3)

它将返回此:

array([0.3, 0.6, 0.9, 1.2, 1.5])

如果要在每个行上打印每个数字,可以执行以下操作:

import numpy as npfor i in np.arange(0.3, 1.6, 0.3):print(i)

这是输出:

0.3
0.6
0.8999999999999999
1.2
1.5

哪里0.8999999999999999来的?

计算机在将十进制浮点数保存为二进制浮点数时遇到麻烦。这导致各种意外的数字表示。

注意:要了解有关为什么存在代表小数的问题的更多信息,可以查看本文和Python文档。

您可能还想看一看十进制库,它在性能和可读性方面有些降级,但允许您精确地表示十进制数。

另一个选择是使用round(),您可以在如何在Python中对数字进行四舍五入了解更多信息。请记住,round()它有自己的怪癖,可能会产生一些令人惊讶的结果!

这些浮点错误是否对您来说是一个问题,取决于您要解决的问题。错误将在小数点后第16位出现,这在大多数情况下都是无关紧要的。它们是如此之小,除非您正在计算卫星轨道轨迹或其他东西,否则您无需担心。

另外,您也可以使用np.linspace()。它实际上执行相同的操作,但是使用不同的参数。使用np.linspace(),您可以指定start和end(包括两者)以及数组的长度(而不是step)。

例如,np.linspace(1, 4, 20)给出20个等距的数字:1.0, …, 4.0。另一方面,np.linspace(0, 0.5, 51)给出0.00, 0.01, 0.02, 0.03, …, 0.49, 0.50。

注意:要了解更多信息,您可以阅读Look Ma,No-Loops:使用NumPy进行数组编程,以及此便捷的NumPy参考。

前进并循环

现在,您了解了如何使用range()和解决其局限性。您还应该了解此重要功能在Python 2和Python 3之间如何演变。

下次您需要执行特定次数的操作时,一切都准备好了!

快乐的Pythoning!

参考

https://realpython.com/python-range/

翻译: Python range 函数指南 -- 从入门到精通相关推荐

  1. Python range 函数 - Python零基础入门教程

    目录 一.Python range 函数简介 二.Python range 函数使用 1.Python range 函数常规使用 2.Python range 函数在 for 循环中使用 三.猜你喜欢 ...

  2. python range函数范围_Python range函数

    Python range函数教程 range函数详解 语法 range(start, stop[, step]) 参数 参数 描述 start 计数从 start 开始.默认是从 0 开始. stop ...

  3. Python range() 函数用法

    Python 内置函数 python range() 函数可创建一个整数列表,一般用在 for 循环中. 函数语法 range(start, stop[, step]) 参数说明: start: 计数 ...

  4. python range函数怎么表示无限_python range函数怎么用

    python range函数怎么用? python range() 函数可创建一个整数列表,一般用在 for 循环中. 函数语法range(start, stop[, step]) 参数说明: sta ...

  5. python range函数怎么表示无限_Python range() 函数 | 菜鸟教程

    Python range() 函数用法 python range() 函数可创建一个整数列表,一般用在 for 循环中. 函数语法 range(start, stop[, step]) 参数说明: s ...

  6. python range函数什么意思_python range函数怎么用,_Python_ 少侠科技

    详细内容 python range函数怎么用? python range() 函数可创建一个整数列表,一般用在 for 循环中. 函数语法range(start, stop[, step]) 参数说明 ...

  7. Python range() 函数用法细解(附猴子吃桃问题引例)

    Python range() 函数用法细解 --步入大学,好多计算机系的同学可能专业课学c或者java,但是随着python变成语言的崛起,往往一些学校也会要求学生们学习Python这门编程语言(我们 ...

  8. python语言中range函数的功能_python应用:python range函数

    在您开始之前,在你的计算机将需要Python,但您可能不需要下载它.首先检查(在同级目录下在命令行窗口输入python)有没有安装Python.如果你看到了一个Python解释器的响应,那么就能在它的 ...

  9. python数据分析可视化实例-Python数据分析与可视化从入门到精通

    (1)没有高深理论,每章都以实例为主,读者参考书中源码运行,就能得到与书中一样的结果.(2)专注于Python数据分析与可视化操作中实际用到的技术.相比大而全的书籍资料,本书能让读者尽快上手,开始项目 ...

  10. python可视化数据分析-Python数据分析与可视化从入门到精通

    (1)没有高深理论,每章都以实例为主,读者参考书中源码运行,就能得到与书中一样的结果.(2)专注于Python数据分析与可视化操作中实际用到的技术.相比大而全的书籍资料,本书能让读者尽快上手,开始项目 ...

最新文章

  1. 是否顺应互联网大脑的发育趋势决定科技企业兴衰
  2. 超酷的超级DataGrid
  3. schedule() 和 scheduleAtFixedRate() 的区别--转载
  4. 软件设计过程经验谈 之 如何做好领域模型设计
  5. operator new在C++中的各种写法
  6. 资深工程师为何否定这种单例模式
  7. 输出亲朋字符串(信息学奥赛一本通-T1133)
  8. Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals
  9. 依时利考勤机说明书_指纹考勤机如何安装及使用说明|依时利
  10. Java jdk7升级到jdk8
  11. 当代最值得收藏的画家作品_当代最具潜力和收藏价值的十大画家
  12. 苍穹官网HTML源码带音乐
  13. html实现点赞动画效果代码,Twitter“点赞”红心按钮CSS3动画特效
  14. 一个站长找回域名的艰辛之路
  15. 使用了未定义的类_解决方法
  16. 《python编程从入门到实践》读书笔记1
  17. Linux命令 - zip命令
  18. Neo4j 完整版安装——neo4j-3.5.6
  19. E4A MPChart折线图 曲线图
  20. Linux系统上的防火墙命令

热门文章

  1. 花里胡哨的c语言程序,通达信花里胡哨主图公式源码
  2. 常用的ajax的代码
  3. 未能加载文件或程序集“AjaxControlToolkit”或它的某一个依赖项
  4. hadoop-06-http服务
  5. (13)Result机制,让视图更丰富
  6. Python(函数的参数)
  7. SSH KEY免密码验证
  8. android动画浅析
  9. Linux的程序安装和包管理
  10. Javascript交互式金融股票基金图表JavaScript Stock Chart