失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Python学习笔记(五)—— Slicing

Python学习笔记(五)—— Slicing

时间:2021-07-03 23:57:20

相关推荐

Python学习笔记(五)—— Slicing

代码及内容源自《Fluent Python》——Luciano Ramalho 著

在slice和range中排除掉最后一项的约定非常适合从0开始的计数方法,如Python,C等等。其便利之处在于:

在只给出结束位置的情况下,容易看出slice或者range的长度,如range(3)和my_list[:3]的返回结果都包含三项。在给出开始和结束位置的情况下,易于计算slice或者range的长度,只需 stop - start可以方便地在任意位置将一个序列分成两部分且不会重叠,比如 my_list[:x],my_list[x:].

>>> l=[10,20,30,40,50,60]>>> l[:2]

[10, 20]

>>> l[2:]

[30, 40, 50, 60]

>>> l[:3]

[10, 20, 30]

>>> l[3:]

[40, 50, 60]

s[a:b:c]通过定义跨越幅度c,可以在slice的过程中跳过特定项。c可以为负值,即返回值反序。

>>> s='bicycle'>>> s[::3]

'bye'

>>> s[::-1]

'elcycib'

>>> s[::-3]

'eyb'

a:b:c的记法用作指数或下标时,仅在[]中有效,它会生成一个slice对象:slice(a:b:c)。在检查表达式seq[satrt:stop:step]时,Python实际上会调用seq.__getitem__(slice(start, stop, step))。了解这一点非常有用,因为它能帮助你给slices赋予名字。

>>> 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])

$17.50 Pimoroni PiBrella $4.95 6mm Tactile Switch x20 $28.00 Panavise Jr. - PV-201 $34.95 PiTFT Mini Kit 320x240

>>> invoice

'\n0.....6.................................40........52...55........\n1909 Pimoroni PiBrella $17.50 3 $52.50\n1489 6mm Tactile Switch x20 $4.95 2$9.90\n1510 Panavise Jr. - PV-201 $28.00 1 $28.00\n1601 PiTFT Mini Kit 320x240$34.95 1 $34.95\n'

Slice不仅能够用于从序列中提取信息,也能够用于在适当的位置改变一个可变序列。

>>> l=list(range(10))>>> l

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> l[2:5]=[20,30]>>> l

[0, 1, 20, 30, 5, 6, 7, 8, 9]

>>> del l[5:7]>>> l

[0, 1, 20, 30, 5, 8, 9]

>>> l[3::2]=[11,22]>>> l

[0, 1, 20, 11, 5, 22, 9]

>>> l[2:5]=100

---------------------------------------------------------------------------TypeError Traceback (most recent call last)<ipython-input-20-321a846f91d2> in <module>()----> 1 l[2:5]=100TypeError: can only assign an iterable

>>> l[2:5]=[100]>>> l

[0, 1, 100, 22, 9]

如果赋值的对象是slice,那么右项必须是一个可迭代对象,即使只有一项。

如果觉得《Python学习笔记(五)—— Slicing》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。