1.11 命�切片¶
问题¶
å¦‚æžœä½ çš„ç¨‹åº�包å�«äº†å¤§é‡�æ— æ³•ç›´è§†çš„ç¡¬ç¼–ç �åˆ‡ç‰‡ï¼Œå¹¶ä¸”ä½ æƒ³æ¸…ç�†ä¸€ä¸‹ä»£ç �。
解决方案¶
å�‡å®šä½ è¦�ä»Žä¸€ä¸ªè®°å½•ï¼ˆæ¯”å¦‚æ–‡ä»¶æˆ–å…¶ä»–ç±»ä¼¼æ ¼å¼�)ä¸çš„æŸ�些固定ä½�ç½®æ��å�–å—æ®µï¼š
###### 0123456789012345678901234567890123456789012345678901234567890'
record = '....................100 .......513.25 ..........'
cost = int(record[20:23]) * float(record[31:37])
ä¸Žå…¶é‚£æ ·å†™ï¼Œä¸ºä»€ä¹ˆä¸�åƒ�è¿™æ ·å‘½å��切片呢:
SHARES = slice(20, 23)
PRICE = slice(31, 37)
cost = int(record[SHARES]) * float(record[PRICE])
在这个版本ä¸ï¼Œä½ é�¿å…�了使用大é‡�难以ç�†è§£çš„硬编ç �ä¸‹æ ‡ã€‚è¿™ä½¿å¾—ä½ çš„ä»£ç �æ›´åŠ æ¸…æ™°å�¯è¯»ã€‚
讨论¶
一般æ�¥è®²ï¼Œä»£ç �ä¸å¦‚果出现大é‡�的硬编ç �ä¸‹æ ‡ä¼šä½¿å¾—ä»£ç �çš„å�¯è¯»æ€§å’Œå�¯ç»´æŠ¤æ€§å¤§å¤§é™�低。 æ¯”å¦‚ï¼Œå¦‚æžœä½ å›žè¿‡æ�¥çœ‹çœ‹ä¸€å¹´å‰�ä½ å†™çš„ä»£ç �ï¼Œä½ ä¼šæ‘¸ç�€è„‘袋想那时候自己到底想干嘛啊。 这是一个很简å�•çš„è§£å†³æ–¹æ¡ˆï¼Œå®ƒè®©ä½ æ›´åŠ æ¸…æ™°çš„è¡¨è¾¾ä»£ç �的目的。
内置的 slice() 函数创建了一个切片对象。所有使用切片的地方都�以使用切片对象。比如:
>>> items = [0, 1, 2, 3, 4, 5, 6]
>>> a = slice(2, 4)
>>> items[2:4]
[2, 3]
>>> items[a]
[2, 3]
>>> items[a] = [10,11]
>>> items
[0, 1, 10, 11, 4, 5, 6]
>>> del items[a]
>>> items
[0, 1, 4, 5, 6]
å¦‚æžœä½ æœ‰ä¸€ä¸ªåˆ‡ç‰‡å¯¹è±¡aï¼Œä½ å�¯ä»¥åˆ†åˆ«è°ƒç”¨å®ƒçš„ a.start , a.stop , a.step 属性æ�¥èŽ·å�–更多的信æ�¯ã€‚比如:
>>> a = slice(5, 50, 2)
>>> a.start
5
>>> a.stop
50
>>> a.step
2
>>>
å�¦å¤–ï¼Œä½ è¿˜å�¯ä»¥é€šè¿‡è°ƒç”¨åˆ‡ç‰‡çš„ indices(size) æ–¹æ³•å°†å®ƒæ˜ å°„åˆ°ä¸€ä¸ªå·²çŸ¥å¤§å°�çš„åº�列上。
这个方法返回一个三元组 (start, stop, step) ,所有的值都会被缩å°�,直到适å�ˆè¿™ä¸ªå·²çŸ¥åº�列的边界为æ¢ã€‚
è¿™æ ·ï¼Œä½¿ç”¨çš„æ—¶å°±ä¸�会出现 IndexError 异常。比如:
>>> s = 'HelloWorld'
>>> a.indices(len(s))
(5, 10, 2)
>>> for i in range(*a.indices(len(s))):
... print(s[i])
...
W
r
d
>>>