Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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_Python 3.x_Loops_Iterator_Slice - Fatal编程技术网

Python 如何迭代切片?

Python 如何迭代切片?,python,python-3.x,loops,iterator,slice,Python,Python 3.x,Loops,Iterator,Slice,python中的切片是不可移植的。此代码: s = slice(1, 10, 2) iter(s) 导致此错误的原因: TypeError: 'slice' object is not iterable 这是我通过创建列表iterable来显示切片的代码: list(range(s.start, s.stop, s.step)) 这使用切片对象的开始、停止和步骤属性。我将它们插入一个范围(不可变序列类型)并创建一个列表: [1, 3, 5, 7, 9] 有什么东西不见了吗?我可以在切片上

python中的
切片
是不可移植的。此代码:

s = slice(1, 10, 2)
iter(s)
导致此错误的原因:

TypeError: 'slice' object is not iterable
这是我通过创建列表iterable来显示切片的代码:

list(range(s.start, s.stop, s.step))
这使用切片对象的
开始
停止
步骤
属性。我将它们插入一个范围(不可变序列类型)并创建一个列表:

[1, 3, 5, 7, 9]
有什么东西不见了吗?我可以在切片上迭代更好吗?

a不是一个iterable。它不包含元素,而是指定如果切片应用于某个其他iterable中的元素,则返回该iterable中的哪些元素

因为它不是iterable,所以不能对它进行迭代。但是,正如您所发现的,您可以使用-来获得索引,它将从应用它的iterable返回元素,并且您可以迭代:

s = slice(1, 10, 2)
indices = range(s.start, s.stop, s.step)
it = iter(indices)


将切片转换为一个范围,然后可以迭代该范围

range(10**10)[slice]

这个问题比答案更笼统。Slice可以将浮点数作为一个步骤,其中range只能采用整数。因此,更一般地说:

test=slice(0,1,0.01)
testlist=[x*test.step for x in range(0,int((test.stop-test.start)/test.step+1))]

您可能会遇到舍入错误,这里讨论了备选方案

您不应该只需要一个
范围(1、10、2)
?范围或多或少与切片非常相似,因此我可以使用范围来生成该序列,但我专注于深入了解切片是什么以及如何操作它。那片不是先来的吗?那么射程呢?Range似乎是一个生成器,内存效率更高。此外,当实现
\uuu setitem\uuuu
时,原始问题具有实际意义,您希望在其中支持切片。
Range(s.start、s.stop、s.step)
在s.start或s.step都为空时不起作用。我曾考虑过对切片()进行子类化。类Myslice(slice):然后def uu getitem uu(self,key),但我不知道还要在其中放什么。现在它已经超出了我的愚蠢程度。你会发现有点棘手…
类X(slice):pass
会导致
TypeError:type'slice'不是一个可接受的基类型
。如果它是可能的,你应该定义一个
\u iter\uuu
方法,返回
iter(范围(self.start,self.stop,self.step))
–但鉴于我之前的评论,这一点毫无意义。你说…'一片面包是不能吃的。它不包含元素,…'文档中说…'。。。返回一个表示索引集的切片对象…,现在是“索引集”-它们不是“元素”吗?“元素”有更具体的定义吗?在本文中,“索引集”不是元素,不是。它们是“你将得到的元素在哪里,在你应用这个片段的任何地方”。此外,请注意,使用的单词是“表示”,而不是“包含”。将切片看作是函数签名的一部分可能会有所帮助。这不是一个东西,而是一个描述。顺便问一下,为什么范围需要stop参数?为什么不默认为无穷大?似乎
range()。
test=slice(0,1,0.01)
testlist=[x*test.step for x in range(0,int((test.stop-test.start)/test.step+1))]