《流畅的python》学习笔记 - 切片

切片特性

  • [start, stop, step]
  • 列表、元组、字符串等所有的序列(sequence)类型都支持切片;
  • 当只有stop参数时,可以快速看出切片和区间中有几个元素;
  • 当start、stop参数都可见时,可以快速计算切片和区间的长度(stop- start);
  • 给切片起个名字:
>>>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

给切片赋值

>>> 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
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only assign an iterable
>>> l[2:5] = [100]
>>> l
[0, 1, 100, 22, 9]

注意:赋值语句右侧,必须是“可迭代对象”,看第13行语句!

+ 和 *

  • + 两侧的序列应该是相同类型的序列。
>>> l = (1, 2, 3)
>>> n = (4, 5, 6)
>>> l + n
(1, 2, 3, 4, 5, 6)
>>> n = [4, 5, 6]
>>> l + n
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate tuple (not "list") to tuple
>>> n = ('4', '5', '6' )
>>> l + n
(1, 2, 3, '4', '5', '6')
>>> 

由序列组成的序列

看似简单,实则…

>>> board = [['_'] * 3 for i in range(3)]
>>> board
[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
>>> weird_board = [['_'] * 3] * 3
>>> weird_board
[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]

board和weird_board看似一样,其实不一样…

>>> board[1][2] = 'x'
>>> weird_board[1][2] = 'x'
>>> board
[['_', '_', '_'], ['_', '_', 'x'], ['_', '_', '_']]
>>> weird_board
[['_', '_', 'x'], ['_', '_', 'x'], ['_', '_', 'x']]

增量赋值 += *=

切片的增量赋值运算符表现,取决于第一个运算符(左侧),对那些实现了__iadd__方法的对象,实现的是“就地”运算(不产生新的对象),如果没有实现__iadd__方法,则产生一个新的对象然后再赋值给左侧的运算符(a+=b ==> a = a + b)

猜你喜欢

转载自blog.csdn.net/steventian72/article/details/85633852