范围(N)[X:Y:Z]

时间:2015-05-28 06:24:56

标签: python range python-2.x

[ ]函数之后,不确定range()内的参数是什么。

Exp:print ( range(5)[::-2]) 输出:[4, 2, 0]

但如果[x:y:z]代表[start:stop:step],那么当我添加print(range(5)[4:-2:-2])时,输出列表为[4]而非[4, 2, 0],不确定其工作原理

4 个答案:

答案 0 :(得分:8)

在Python 3中,range()创建了一个特殊的range对象。在Python 2中,它创建了一个list

List element:     0  1  2  3  4
Index:            0  1  2  3  4
Backwards index: -5 -4 -3 -2 -1

因此,从索引4转到索引-2实际上是从列表元素4转到列表元素3。由于您正在跳过所有其他元素,因此您无法访问3,只留下[4]

答案 1 :(得分:7)

你是对的,是[start:stop:step]。请注意,负启动和停止定义为从序列结束开始。因此,对于以值2, 3, 4结尾的范围,stop -2引用3(-1是最后一个,-2是倒数第二个,等等。) / p>

所以在你的情况下,范围的长度为5,从0开始到4结束。从索引4开始,到索引-2结束,即5-2 = 3。所以到目前为止,索引指的是[3, 4]。现在,从4开始,你有一个负2的步骤。所以你跳过3,结果只是[4]

如果你想要[4, 2, 0],那么你应该忽略停止:

>>> range(5)[4::-2]
[4, 2, 0]

你甚至可以忽略开始:

>>> range(5)[::-2]
[4, 2, 0]
  

range(5)[4:-2]结果为[]。那么range(5)[4:-2:-2]结果如何[4]

一次评估切片,而不是一个接一个的参数:

评估否定结果后,range(5)[4:-2]相当于range(5)[4:3]。由于未指定步骤,因此将使用正数1的默认步骤。这意味着切片必须以正步骤从索引4转到索引3。这是不可能的,所以返回一个空列表。

当我们采取否定步骤时,它看起来像这样:range(5)[4:3:-2]。现在,由于我们有一个消极的步骤,方向是相反的。所以我们可以从索引4开始,然后转到较低的索引3。

刚刚定义,对于一个积极的步骤,stop >= start必须为真,而对于一个反向步骤,stop <= start

答案 2 :(得分:2)

根据[start:stop:step]定义的三个参数的切片。巧合的是,这也是范围对象用三个参数定义的方式。我们很快就会看到它是如何发挥作用的。

你在做什么是这样的:

>>> range(5)
[0, 1, 2, 3, 4]
>>> range(5)[4:-2:-2]
[4]

Python中的负索引从序列的长度开始。因此,列表的长度为5,然后用-2向下两步,因此您将索引3作为停止值。换句话说,索引3是迭代器的标记值,此时切片操作将停止收集元素。你将逐步降低2个索引,但索引3是哨兵,因此切片在抓取索引4处的元素并达到停止索引后停止收集元素。

你可能真正想做的是:

>>> range(4, -2, -2)
[4, 2, 0]

答案 3 :(得分:-1)

你可以将[x:y:z]代表[start:stop:jumps]在5的范围内,它将迭代超过0-4(包括两者),因为你的z是负数,它将从4迭代到0 2跳4 --- 3 --- 2(---代表跳跃)所以输出是 4 ---(3)--- 2 ---(1)--- 0。   ------&GT; -------&GT;

快乐编码