为什么切片要忽略最后一个元素

# 切片
# 为什么切片和区间会忽略最后一个元素
# 在切片和区间操作里不包含区间范围的最后一个元素是Python 的风格,这个习惯符合Python C和其他语言里以0作为起始下标的传统.
# 当只有最后一个位置信息时,我们也可以快速看出切片和区间里有一个元素:range(3)和my_list[:3]都返回3个元素
# 当起止位置信息都可见时,我们可以快速计算出切片和区间的长度,用后一个数减去前一个下标即可
# 这样做也让我们可以利用任意一个下标来吧序列分割成不重叠的两部分: list[:x] list[x:]
l = [10, 20, 30, 40, 50, 60]
print(l[:2], "---", l[2:])  # 在下标2的地方分割

# 对对象进行切片

# 一个众所周知的秘密是,我们可以用s[a:b:c]的形式对s在a和b之间以c为间隔取值.
# c的值还可以为负,负值意味着反向取值.
s = "python"
print(s[::2])
print(s[::-1])
print(s[::-2])

# a:b:c这种用法只能作为索引或者下标用在[]中来返回一个切片对象.
# 对seq[start:end:step]进行求值的时候,Python会调用seq.__getitem__(slice(start, end, step)).
# 可以给切片命名,提示代码的可读性
students = """
0001    小明  16  99
0002    小红  18  98
0003    小李  17  99
0004    小王  20  100
"""
number = slice(0, 4)
name = slice(8, 10)
age = slice(12, 14)
student_items = students.split("
")
for item in student_items:
    print(item[number], "---", item[name], "---", item[age]) if item else None

# 给切片赋值 如果把切片放在赋值语句的左边,或者把它作为del操作的对象,我们就可以对序列进行嫁接,切除或就地修改操作.
l = list(range(10))
print(l)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
l[2:5] = [20, 30]
print(l)  # [0, 1, 20, 30, 5, 6, 7, 8, 9]
del l[5:7]
print(l)  # [0, 1, 20, 30, 5, 8, 9]
l[3::2] = [11, 22]
print(l)  # [0, 1, 20, 11, 5, 22, 9]
l[2:5] = [100]  # 如果赋值的对象是一个切片,那么赋值语句的右侧必须是个可迭代对象,即便只有单独的一个值,也要把它转换成可迭代的序列.
print(l)  # [0, 1, 100, 22, 9]
l[2:4] = [11, 22, 33, 44, 66]  # 步长为1时,切片长度和赋值长度可以不等
print(l)
# l[::2] = [1, 2, 3, 4, 5]  # 步长不为1时,切片长度和赋值长度必须相等
# ValueError: attempt to assign sequence of size 6 to extended slice of size 4
原文地址:https://www.cnblogs.com/zyyhxbs/p/13140938.html