对对象进行切片
s[a:b:c] 的形式对 s 在 a 和 b 之间以 c 为间隔取值。 c 的值还可以为负, 负值意味着反向取值。
>>> s = 'bicycle'
>>> s[::3]
'bye'
>>> s[::-1]
'elcycib'
>>> s[::-2]
'eccb'
前面取出卡牌中所有 'A'
>>> deck[12::13]
[Card(rank='A', suit='spades'), Card(rank='A', suit='diamonds'),
Card(rank='A', suit='clubs'), Card(rank='A', suit='hearts')]
对 seq[start:stop:step] 进行求值的时候, Python 实际会调用 seq.__getitem__(slice(start, stop, step))。用 [] 中来返回一个切片对象。
纯格式化文本的切片:
# a:b:c 这种用法只能作为索引或者下标用在 [] 中来返回一个切片对象:
# slice(a, b, c)。
# 对seq[start:stop:step] 进行求值的时候, Python 会调用
# seq.__getitem__(slice(start, stop, step))。
# 使用切片对象
invoice = """
0.....6................................40........52...55........
1909 Pimoroni PiBrella $17.50 3 $52.50
1489 6mm Tactile Switch x20 $4.95 2 $9.90
1510 Panavise Jr. - PV-201 $28.00 1 $28.00
1601 PiTFT Mini Kit 320x240 $34.95 1 $34.95
"""
SKU = slice(0, 6)
DESCRIPTION=slice(6,40)
UNIT_PRICE=slice(40,52)
QUANTITY=slice(52,55)
ITEM_TOTAL=slice(55,None)
line_items=invoice.split('\n')[2:]
for item in line_items:
print(item[UNIT_PRICE],item[DESCRIPTION])
切片赋值
l=list(range(10))
print(l) # [0,1,2,3,4,5,6,7,8,9]
print(l[2:5]) # [2,3,4]
l[2:5]=[11,12,13]
print(l) # [0,1,11,12,13,5,6,7,8,9]
del l[2:5]
print(l) # [0,1,5,6,7,8,9]
print(l[3::2]) # [6,8]
l[3::2]=[100,99]
print(l) # [0,1,5,100,7,99,9]
# l[3::2]=88 TypeError: must assign iterable to extended slice
# l[3::2]=[88] #ValueError: attempt to assign sequence of size 1 to extended slice of size 2
# 如果赋值的对象是一个切片, 那么赋值语句的右侧必须是个可迭代
# 对象。 即便只有单独一个值, 也要把它转换成可迭代的序列。
l[0]=123
l[3:]=[88] # [88]可替换连续多个值
print(l)
l[1:]=[] # 保留第一个元素,删除其余元素
print(l)