Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的片的迭代器等价物?_Python_Iterator_Slice - Fatal编程技术网

python中的片的迭代器等价物?

python中的片的迭代器等价物?,python,iterator,slice,Python,Iterator,Slice,获取此切片的迭代器等价物的惯用有效方法是什么 obj[start:stop:step] 在功能上相当于(我认为)这样的东西: def iter_slice(obj, start, stop, step=None): length = len(obj) range_step = 1 if step is None else step range_start = ((0 if range_step > 0 else length - 1)

获取此切片的迭代器等价物的惯用有效方法是什么

obj[start:stop:step]
在功能上相当于(我认为)这样的东西:

def iter_slice(obj, start, stop, step=None):
        
    length = len(obj)

    range_step = 1 if step is None else step
    
    range_start = ((0 if range_step > 0 else length - 1) if start is None
                   else start if start >= 0
                   else max(length + start, 0))

    range_stop = ((length if range_step > 0 else -1) if stop is None
                  else min(stop, length) if stop >= 0
                  else length + stop)

    for i in range(range_start, range_stop, range_step):
        yield obj[i]
我想知道是否有一种方法可以利用Python的内置切片功能或某些库函数,而不必尝试显式地处理所有情况(正如我在上面尝试的,无论是否正确)

有一些讨论,但答案都涉及以下一个方面:

  • 使用
    itertools.islice
    ,但这不支持负值,而且在可以索引的情况下,使用大
    start
    step
    迭代切片也不是一种有效的方法

  • 显式地在内存中创建一个切片,以便在其上迭代,而不是在原始对象上迭代

  • 范围
    的参数使用一些简单的表达式,这适用于范围内的非负数,但不容易推广到涵盖所有情况


有没有一种简洁的方法可以避免这些问题?

range()函数的工作原理与slice()类似。也许你能找到一个方法来使用它。@Blupper我看不到一个明显的简单方法-特别是,要处理许多情况(
None
或负索引,或超出范围索引),它需要知道
len(obj)
。我只是对你在做什么有点困惑。为什么切片不是一种选择?在obj[start:stop:step]:中对x不起作用吗?纯迭代器不支持负索引,因为它的长度未知。@Blupper如果在obj[start:stop:step]中对x执行
操作:
它会创建所有数据的副本,只是为了在其上进行迭代。