4.7 è¿ä»£å™¨åˆ‡ç‰‡Â¶
问题¶
ä½ æƒ³å¾—åˆ°ä¸€ä¸ªç”±è¿ä»£å™¨ç”Ÿæˆ�çš„åˆ‡ç‰‡å¯¹è±¡ï¼Œä½†æ˜¯æ ‡å‡†åˆ‡ç‰‡æ“�作并ä¸�能å�šåˆ°ã€‚
解决方案¶
函数 itertools.islice() æ£å¥½é€‚用于在è¿ä»£å™¨å’Œç”Ÿæˆ�器上å�šåˆ‡ç‰‡æ“�作。比如:
>>> def count(n):
... while True:
... yield n
... n += 1
...
>>> c = count(0)
>>> c[10:20]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'generator' object is not subscriptable
>>> # Now using islice()
>>> import itertools
>>> for x in itertools.islice(c, 10, 20):
... print(x)
...
10
11
12
13
14
15
16
17
18
19
>>>
讨论¶
è¿ä»£å™¨å’Œç”Ÿæˆ�器ä¸�èƒ½ä½¿ç”¨æ ‡å‡†çš„åˆ‡ç‰‡æ“�ä½œï¼Œå› ä¸ºå®ƒä»¬çš„é•¿åº¦äº‹å…ˆæˆ‘ä»¬å¹¶ä¸�知é�“(并且也没有实现索引)。
函数 islice() 返回一个å�¯ä»¥ç”Ÿæˆ�æŒ‡å®šå…ƒç´ çš„è¿ä»£å™¨ï¼Œå®ƒé€šè¿‡é��历并丢弃直到切片开始索引ä½�ç½®çš„æ‰€æœ‰å…ƒç´ ã€‚
ç„¶å�Žæ‰�å¼€å§‹ä¸€ä¸ªä¸ªçš„è¿”å›žå…ƒç´ ï¼Œå¹¶ç›´åˆ°åˆ‡ç‰‡ç»“æ�Ÿç´¢å¼•ä½�置。
这里è¦�ç�€é‡�强调的一点是 islice() ä¼šæ¶ˆè€—æŽ‰ä¼ å…¥çš„è¿ä»£å™¨ä¸çš„æ•°æ�®ã€‚
必须考虑到è¿ä»£å™¨æ˜¯ä¸�å�¯é€†çš„这个事实。
æ‰€ä»¥å¦‚æžœä½ éœ€è¦�之å�Žå†�次访问这个è¿ä»£å™¨çš„è¯�ï¼Œé‚£ä½ å°±å¾—å…ˆå°†å®ƒé‡Œé�¢çš„æ•°æ�®æ”¾å…¥ä¸€ä¸ªåˆ—表ä¸ã€‚