geekdoc-python-zh/docs/pythoncentral/how-to-use-pythons-xrange-a...

11 KiB
Raw Permalink Blame History

如何使用 Python 的 xrange 和 range

原文:https://www.pythoncentral.io/how-to-use-pythons-xrange-and-range/

Python 有两个创建列表的方便函数,或者一个整数的范围,帮助进行for循环。

这些功能是xrangerange。但是你可能已经猜到了!🙂

Python 中 xrange 和 range 的区别

在开始之前,先说一下xrangerange的不同之处。

在很大程度上,xrangerange在功能上是完全相同的。它们都提供了一种生成整数列表的方法,供您随意使用。唯一的区别是range返回一个 Python list对象,而xrange返回一个xrange对象。

那是什么意思?好问题!这意味着xrange并不像range那样在运行时生成静态列表。它用一种叫做产生的特殊技术创造出你需要的值。这项技术用于一种叫做发生器的物体。如果您想更深入地了解生成器和 yield 关键字,请务必查看文章 Python 生成器和 yield 关键字

好的,现在那个是什么意思?又一个好问题。意味着如果你有一个非常大的范围,比如说十亿,那么xrange就是要使用的函数。如果你有一个真正对内存敏感的系统,比如你正在使用的手机,这一点尤其正确,因为range将使用尽可能多的内存来创建你的整数数组,这会导致MemoryError并使你的程序崩溃。这是一只渴望记忆的野兽。

也就是说,如果您想多次迭代列表,使用range可能更好。这是因为xrange必须在每次访问索引时生成一个整数对象,而range是一个静态列表,整数已经“在那里”可以使用。

好了,现在说点好的。

xrange 函数是做什么的?

利用 Python 的 xrange()函数生成一个数列,使其类似于 range()函数。但是这两个函数的主要区别在于xrange()函数只在 Python 2 中可用,而 range()函数在 Python 2 和 3 中都可用。

xrange()函数的语法是:

【xrange(开始、结束、步进)

参数用于定义一个从开始到结束的数字范围,起始数字包含在内,最终数字不包含在内。

三个参数的含义如下:

  • 开始: 它指定了数字序列的开始位置。
  • 结束: 它指定了编号序列的结束位置。
  • 步: 它指定了序列中数字的区别。

值得注意的是,虽然起始位置和步长值可以选择定义,但编号序列的最终位置必须始终定义。

range 函数有什么作用?

当 range()函数中定义了一个数字范围时,它返回定义范围内的数字序列。当程序员需要执行一个动作指定的次数时,通常使用内置函数。

Python 3 中的 range()函数本质上是 Python 2 中 xrange()函数的重命名版本。该函数通常与 for 循环一起使用,因此,希望使用该函数的程序员必须了解 for 循环是如何工作的以及如何使用它。

range()函数的一个常见用例是用于迭代序列类型。

range()函数的语法是:

【启动、停止、步进】

用户可以使用参数决定数字序列的开始和结束位置以及数字之间的差异。使用所有参数不是强制性的-只有 停止 参数是强制性的。

参数的含义与 xrange()函数中参数的含义基本相同:

  • 开始: 是整数,是数列的起点。
  • Stop: 必须返回之前的数列的整数。数字序列以值“停止1”结束
  • 步: 定义数列中数字之间增量的是整数值。

range 和 xrange 的优点

使用 range()函数的主要优点是效率更高。它可以快速多次迭代相同的数字序列。

相比之下xrange()函数需要为数字序列的每次迭代重建 integer 对象。

range()函数使用实整数对象因此它在使用内存方面表现不佳。也就是说xrange()函数不能在所有需要真实列表的情况下使用,因为它不支持切片或列表方法。

继续讨论 xrange()函数的主要优点——xrange()对象。不管定义的范围有多大xrange()对象都占用相同的内存量。

它被称为不透明序列类型产生与相应列表相同的值而不同时存储数字。就性能而言xrange()函数在迭代一个大的数字序列时性能更好。

使用 xrange 功能的不同方式

使用 xrange()函数有三种不同的方法:只使用停止参数,同时使用开始和停止参数,以及使用所有参数。

#1 使用带有 Stop 参数的 xrange 函数

由于 start 和 step 参数是可选的,所以可以只使用 stop 参数来定义 xrange()函数。如果 Python 用户只传递一个参数Python 会假设它是停止值,而 start 和 step 参数的默认值分别设置为 0 和 1。

例如,如果要打印从 0 到 9 的数字序列必须将“10”作为 stop 参数传递给 xrange()函数。由于停止值是一个排他值,该函数将只生成 9 之前的数字。

n = xrange(10)

print(list(n))

需要 print 语句,因为 xrange(10)的输出必须显式转换成列表。上面脚本的输出将是:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

#2 使用带有开始和停止参数的 xrange 函数

当用户向 xrange()函数传递两个参数时Python 假设这些值表示起始值和终止值。因为没有定义 step 参数,所以它默认为 1。

假设你想打印一个从 10 到 19 的数字序列。为此,您必须将起始值定义为 10因为起始参数是包含性的。另一方面由于停止值是唯一的所以必须将“20”作为参数传递。

n = xrange(10,20)

# converting n into a list and printing the list
print(list(n))

脚本的输出将是:

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

#3 使用带有开始、停止和步进参数的 xrange 函数

当用户将所有三个参数传递给 xrange()函数时,不考虑任何参数的默认值。

例如,如果你想打印 20 到 30 之间的数字,你必须传递 20 作为开始参数31 作为停止参数1 作为步长。

n = xrange(20,31,1)

# converting n into a list and printing the list
print(list(n))

脚本将打印数字序列:

[20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]

范围功能的不同使用方式

就像 xrange()函数一样range()函数有三种用法:

#1 范围(停止)

如果用户只向 range()函数传递一个参数Python 会假设它是停止值。Python 然后生成一个从 0 到停止值之前的数字的数字序列。

例如,要打印从 0 开始到 9 结束的十个数字,必须运行以下代码:

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

# Output 0 1 2 3 4 5 6 7 8 9

需要注意的是,起始值默认为 0步长值默认为 1。此外如果停止值设置为 0 或任何负值range()函数将返回一个空序列。

#2 范围(启动、停止)

当用户向 range()函数传递两个参数时Python 假定参数是 start 和 stop。该函数生成一个序列从起始值开始到 stop1 结束。

例如,如果你想打印一个从 10 到 15 的数字序列,你可以使用下面的脚本:

for i in range(10, 16):
    print(i, end=' ')

# Output 10 11 12 13 14 15

需要注意的是,步长值默认为 1如果停止值小于开始值range()函数返回一个空序列。

#3 范围(开始、停止、步进)

当用户将所有三个参数传递给 range()函数时,它将返回一个数字序列,该序列从起始值开始,以步长值为增量,在终止值之前结束。

例如,如果您想打印一个从 10 开始到 45 结束的序列,序列中的数字之间的增量为 5您可以使用下面的脚本:

for i in range(10, 50, 5):
    print(i, end=' ')

# Output 10 15 20 25 30 35 40 45

需要注意的是,如果步长值设置为 0Python 将抛出 ValueError 异常。

如何使用 Python 的 range 和 xrange

那么我们如何使用rangexrange?下面是一个最简单的例子:

[python]
>>> for i in xrange(10):
... print(i)
...
0
1
2
3
4
5
6
7
8
9
[/python]

太好了!很简单。注意,你也可以用range代替这里的xrange,但是我个人更喜欢xrange。可能是前面那个性感的“x”吧。🙂

好了,解释时间。函数xrangerange总共接受三个参数但是其中两个是可选的。参数是“开始”、“停止”和“步进”。“start”是你希望列表开始的整数“stop”是你希望列表停止的整数“step”是你的列表元素的增量。

Python 的 xrange 和奇数范围

假设我们只想要奇数。我们可以这样做:

[python]
>>> for i in xrange(1, 10, 2):
... print(i)
...
1
3
5
7
9
[/python]

我们告诉 Python我们希望第一个元素是 1最后一个元素比 10 小 1我们希望每个元素增加 2。非常简单的东西。

Python 的 xrange 和带负数的 range

好吧,那么如果我们想要一个负面清单呢?

简单。这里有一个例子:

[python]
>>> for i in xrange(-1, -10, -1):
... print(i)
...
-1
-2
-3
-4
-5
-6
-7
-8
-9
[/python]

就是这样!我们要做的就是把“开始”、“停止”、“步进”改成负数。太棒了。请注意,对于负面清单,您必须这样做。尝试使用xrange(-10)将不起作用,因为xrangerange使用默认的“步长”1。

另一个 Python xrange 和 range 示例

这里还有一个 100 到 120 之间偶数的例子:

[python]
>>> for i in xrange(100, 120, 2):
... print(i)
...
100
102
104
106
108
110
112
114
116
118
[/python]

对于xrangerange来说差不多就是这样。如果你想从技术上了解这两个函数的功能,请查阅 Python 文档中关于 xrangerange 的内容。

请注意,如果“开始”大于“停止”,则返回的列表将为空。此外,如果“步长”大于“停止”减去“开始”,那么“停止”将被提升为“步长”的值,并且列表将包含“开始”作为其唯一的元素。

这里有一张更清晰的图片:

[python]
>>> for i in xrange(70, 60):
... print(i)
...
# Nothing is printed
>>> for i in xrange(10, 60, 70):
... print(i)
...
10
[/python]

不赞成使用 Python 的 xrange

再补充一点。在 Python 3.x 中,xrange函数已经不存在了。在 Python 2.x 中,range函数现在做xrange做的事情,所以为了保持代码的可移植性,你可能想坚持使用range来代替。当然,你可以一直使用 Python 提供的 2to3 工具来转换你的代码,但是这会带来更多的复杂性。

之所以把xrange去掉,是因为基本上总是用起来比较好,性能影响可以忽略不计。所以 Python 3.x 的range函数是来自 Python 2.x 的 xrange

你可以在这里找到 PEP 文档来解释它被删除的原因。

完毕,士兵。完毕。