itertools.islice(iterable, start, stop[, step]) 函数的实现问题

def islice(iterable, *args):

# islice('ABCDEFG', 2) --> A B
# islice('ABCDEFG', 2, 4) --> C D
# islice('ABCDEFG', 2, None) --> C D E F G
# islice('ABCDEFG', 0, None, 2) --> A C E G
s = slice(*args)
start, stop, step = s.start or 0, s.stop or sys.maxsize, s.step or 1
it = iter(range(start, stop, step))
try:
    nexti = next(it)
except StopIteration:
    # Consume *iterable* up to the *start* position.
    for i, element in zip(range(start), iterable):
        pass
    return
try:
    for i, element in enumerate(iterable):
        if i == nexti:
            yield element
            nexti = next(it)
except StopIteration:
    # Consume to *stop*.
    for i, element in zip(range(i + 1, stop), iterable):
        pass
        

https://docs.python.org/zh-cn... 官方文档下的实现islice的大致方法

请问 for i, element in zip(range(start), iterable):pass 和 for i, element in zip(range(i + 1, stop), iterable):pass,捕捉异常之后for循环之后pass,既然是pass,这两段代码有什么作用呢?

阅读 2.2k
1 个回答
In [1]: from itertools import islice 
                                     
In [2]: a = (i for i in range(5))    
                                     
In [3]: b = islice(a, 3, 3)          
                                     
In [4]: list(b)                      
Out[4]: []                           
                                     
In [5]: list(a)                      
Out[5]: [3, 4]                       

我想你理解了这几行代码的输出,就明白为什们islice要那么设计了。
另外你思考下list(a) 和 list(b) 出现的先后顺序不同会有什么影响。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题