我得到的答案' b'是范围(4,-1,-1)。 所以我没有得到,如果[:-1]意味着"除了最后一个元素"或排除最后一个元素,但范围怎么样?' b'是逆转? 请解释一下。
答案 0 :(得分:2)
<强>切片强>
start
和stop
的负数表示“从结尾”。它与len-value
完全相同。step
的负数表示“按相反顺序”。len
。停止参数是独占的!所以[::-1]
表示从第1个元素到最后一个元素,步长为1,顺序相反。
[start:stop]
,则与step=1
相同。所以[:-1]
它意味着最后的一切。再次,这是独家的最后一个元素。它与[:-1:]
或[0:-1:1]
相同。如果您只有start
,则返回索引start
给出的一个元素。因此[-1]
表示最后一个元素。与[len-1]
相同。
<强>范围强>
范围也有语法start,stop,step
,但该步骤具有不同的含义。从start
开始重复添加步骤。因此,您从4
开始,然后添加-1
,直到您点击stop
,同时也是。因此range(5,0)[::-1]
相当于range(4,-1,-1)
。你可以计算它。
为什么口译员会说range(0,5)[::-1] => range(4, -1, -1)
?
Python解释器非常智能,可以将range
切片转换为另一个range
。这是一个优化,范围是生成器。它们是动态的,即它们不会立即将所有元素保存在存储器中。你正在使用的解释器一步一步地工作,它必须生成整个列表,只是为了能够以相反的顺序迭代。计算新发电机更聪明。
如何完成,详细解释Łukasz的回答。
顺便说一下。您可以强制它生成list
,并阻止优化:
range(0,5)[::-1]
=> range(4, -1, -1)
list(range(0,5))[::-1]
=> [4, 3, 2, 1, 0]
答案 1 :(得分:1)
compute_slice
函数用于在现有range
对象(rangeobject *r
)及其新值之间进行转换。如您所见,它基于range
和slice
的开始/停止/步骤值作为O(1)操作完成。
static PyObject *
compute_slice(rangeobject *r, PyObject *_slice)
{
PySliceObject *slice = (PySliceObject *) _slice;
rangeobject *result;
PyObject *start = NULL, *stop = NULL, *step = NULL;
PyObject *substart = NULL, *substop = NULL, *substep = NULL;
int error;
error = _PySlice_GetLongIndices(slice, r->length, &start, &stop, &step);
if (error == -1)
return NULL;
substep = PyNumber_Multiply(r->step, step);
if (substep == NULL) goto fail;
Py_CLEAR(step);
substart = compute_item(r, start);
if (substart == NULL) goto fail;
Py_CLEAR(start);
substop = compute_item(r, stop);
if (substop == NULL) goto fail;
Py_CLEAR(stop);
result = make_range_object(Py_TYPE(r), substart, substop, substep);
if (result != NULL) {
return (PyObject *) result;
}
fail:
Py_XDECREF(start);
Py_XDECREF(stop);
Py_XDECREF(step);
Py_XDECREF(substart);
Py_XDECREF(substop);
Py_XDECREF(substep);
return NULL;
}
答案 2 :(得分:0)
您使用的方法在Python中称为Slicing
。
切片语法如下,
[ <first element to include> : <first element to exclude> : <step> ]
添加step
部分是可选的。
以下是python列表如何考虑正负索引的表示。
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5
-6 -5 -4 -3 -2 -1
使用时,
a = range(10)
# a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a[10:0:-1] #or
a[-1:-10:-1]
# Output = [9, 8, 7, 6, 5, 4, 3, 2, 1]
为什么因为当我们将0
/ -10
作为第二个参数时,它会排除0
/ -10
位置中的元素。
如此简单的方法是省略切片中的第二个参数。也就是说,
a[10::-1] #or
a[-1::-1]
# Output = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
# Which is what we want.
为了进一步简化,如果省略开始值和结束值并将步骤设为-1,则会再次产生相同的结果。
a[::-1]
# Output = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
# The -1 at step position traverse the element from the last to the beginning
这是一个简单的备忘单,用于理解切片,
a[start:end] # items start through end-1
a[start:] # items start through the rest of the array
a[:end] # items from the beginning through end-1
a[:] # a copy of the whole array
a[start:end:step] # start through not past end, by step
a[-1] # last item in the array
a[-2:] # last two items in the array
a[:-2] # everything except the last two items
要了解有关切片的更多信息,请see this
希望这有帮助! :)