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]=100


TypeError: can only assign an iterable
>>> l[2:5]=[100]
>>> l
[0, 1, 100, 22, 9]

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值