Python中string、list的索引数字问题以及与range函数的关系详解
刚开始学 python,以前用过 C 和 Matlab。学到 string 和 list 的索引数字时比较困惑。
python 里是以元素的左边缘作为索引数字的位置,而 C 和 Matlab 直接以元素的位置作为索引数字。如下:
x = ’ P Y T H O N’
Python:0 1 2 3 4 5 6
C: 0 1 2 3 4 5
这样,python 里 x[0:3]是‘ PYT’,而 C 里 x[0:3]是’PYTH’。
我比较疑惑 PYTHON 为什么这样定义,有什么好处或优势?因为我自己觉得 C 的定义更直观一些。
另外,还有 range 函数,好像定义原理和索引数字一样。
range(0, 4 )是 0,1,2,3,不包括 4,是指只能有 4 个数字?
range(0, 10, 2)则是 0, 2, 4, 6, 8, 也不包括 10。
同样的问题,为什么第二个参数不是实际边界,这样做的好处是什么?
敬请大家帮我解惑,谢谢!
Python中string、list的索引数字问题以及与range函数的关系详解
如果你想从某个位置切开一个字符串,就可以不用考虑加减一的问题python<br>s = 'abcdef'<br>p = s.index('c')<br>left, right = s[:p], s[p:]<br>
帖子内容我理解,这是关于Python索引和range的基础知识。我直接说重点。
Python的索引是从0开始的。对于一个长度为n的序列(字符串、列表等),有效索引是0到n-1。-1是最后一个元素的索引,-n是第一个。
range函数生成一个整数序列,常用于循环。它的行为和索引是对应的:
range(stop): 生成0到stop-1。range(start, stop): 生成start到stop-1。range(start, stop, step): 按步长生成。
关键关系:range(len(my_seq)) 会生成0, 1, 2, ..., len(my_seq)-1,这正好是序列my_seq的所有有效索引。所以用for i in range(len(s)):来遍历索引是最常见的模式。
看个代码例子就全明白了:
s = "Python"
lst = ['P', 'y', 't', 'h', 'o', 'n']
# 正向索引 0 到 len-1
print("正向索引:")
for i in range(len(s)):
print(f"索引 {i}: s[{i}] = '{s[i]}', lst[{i}] = '{lst[i]}'")
# 反向索引 -1 到 -len
print("\n反向索引:")
for i in range(-1, -len(s)-1, -1):
print(f"索引 {i}: s[{i}] = '{s[i]}', lst[{i}] = '{lst[i]}'")
# 切片范围也遵循 start:stop-1 的规则
print("\n切片示例:")
print(f"s[1:4] 是 '{s[1:4]}'") # 索引 1, 2, 3 -> 'yth'
print(f"对应 range(1,4): {list(range(1,4))}") # [1, 2, 3]
输出:
正向索引:
索引 0: s[0] = 'P', lst[0] = 'P'
索引 1: s[1] = 'y', lst[1] = 'y'
索引 2: s[2] = 't', lst[2] = 't'
索引 3: s[3] = 'h', lst[3] = 'h'
索引 4: s[4] = 'o', lst[4] = 'o'
索引 5: s[5] = 'n', lst[5] = 'n'
反向索引:
索引 -1: s[-1] = 'n', lst[-1] = 'n'
索引 -2: s[-2] = 'o', lst[-2] = 'o'
索引 -3: s[-3] = 'h', lst[-3] = 'h'
索引 -4: s[-4] = 't', lst[-4] = 't'
索引 -5: s[-5] = 'y', lst[-5] = 'y'
索引 -6: s[-6] = 'P', lst[-6] = 'P'
切片示例:
s[1:4] 是 'yth'
对应 range(1,4): [1, 2, 3]
总结:记住range(stop)到stop-1,索引和切片也是到stop-1,这个概念就统一了。
C 没有 slice,没有[0:3]这种写法,每一个下标都对应那唯一一个位置
slice 是左开右闭区间,
(好处是循环迭代都是先验边界再进循环体,右闭在自增时能保证被迭代变量最终不会越界,顺带一提从 0 开始的索引也是为了自减时类似效果,顺带一提这点在初学编程时应该能感觉到)
matlab 的索引规则跟大多数编程语言不同
还有啥问题
说反了 左闭右开
python 里的 slice 和 range 都是包括左闭右开。
一是这样做有:s = s[:i] + s[i:]
二是 slice 的长度可以通过左右索引之差简单的算出来。
《流畅的 Python 》一书第 2.4.1 节对这个问题有解释,大致说了如下几个方面:


上面提到的延伸阅读<http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html>

我觉得试一下跟容易理解
One way to remember how slices work is to think of the indices as pointing between characters, with the left edge of the first character numbered 0. Then the right edge of the last character of a string of n characters has index n, for example:
±–±--±–±--±–±--+
| P | y | t | h | o | n |
±–±--±–±--±–±--+
0 1 2 3 4 5 6
-6 -5 -4 -3 -2 -1
<https://docs.python.org/3/tutorial/introduction.html#strings>
题主想的挺多也挺好,我是强记的,左闭右开
你会发现 random.randint 就包含声明数字了,嘿嘿

