Python 中的 slice() 函数有什么作用?
What does the slice() function do in Python?
首先,我想澄清一下问题:它是关于 slice()
函数的, 不是 列表或字符串的切片,例如 a[5:4:3]
.
文档提到这个函数在 NumPy 中使用,但没有给出使用示例(它说 如何使用它 但没有说 何时使用它)。此外,我 从未 见过任何 Python 程序中使用过此函数。
在纯 Python(没有 NumPy 或 SciPy)编程时,什么时候应该使用 slice()
函数?任何示例将不胜感激。
a[x:y:z]
给出与 a[slice(x, y, z)]
相同的结果。 slice
对象的优点之一是它可以作为单个对象存储和检索,而不是存储 x
、y
和 z
.
它通常用于让用户定义自己的切片,以后可以将其应用于数据,而无需处理许多不同的情况。
从你的问题来看,我相信你正在寻找一个例子。所以这就是我尝试 slice
来自 range(1, 20)
的列表时所拥有的,步骤为 3
>>> x = range(1, 20)
>>> x[1:20:3]
[2, 5, 8, 11, 14, 17]
>>> x[slice(1, 20, 3)]
[2, 5, 8, 11, 14, 17]
不,这还不是全部!
由于已经提到了对象,首先您必须知道 slice 是一个 class,不是一个返回对象的函数。
slice() 实例的第二次使用是将参数传递给 getitem() 和 getslice() 方法使您自己的对象的行为类似于字符串、列表和其他支持切片的对象。
当你这样做时:
print "blahblah"[3:5]
自动转换为:
print "blahblah".__getitem__(slice(3, 5, None))
因此,当您编写自己的索引和切片对象时:
class example:
def __getitem__ (self, item):
if isinstance(item, slice):
print "You are slicing me!"
print "From", item.start, "to", item.stop, "with step", item.step
return self
if isinstance(item, tuple):
print "You are multi-slicing me!"
for x, y in enumerate(item):
print "Slice #", x
self[y]
return self
print "You are indexing me!\nIndex:", repr(item)
return self
试一试:
>>> example()[9:20]
>>> example()[2:3,9:19:2]
>>> example()[50]
>>> example()["String index i.e. the key!"]
>>> # You may wish to create an object that can be sliced with strings:
>>> example()["start of slice":"end of slice"]
较旧的 Python 版本支持方法 getslice(),该方法将用于代替 getitem()。在 getitem() 中检查我们是否得到一个切片是一个很好的做法,如果得到了,将它重定向到 getslice() 方法.这样您将拥有完全的向后兼容性。
这就是 numpy 使用 slice() 对象进行矩阵操作的方式,很明显它经常间接地到处使用。
(使用函数语义)调用 slice
class 实例化一个 slice
对象(开始、停止、步骤),稍后您可以在程序中将其用作切片说明符:
>>> myname='Rufus'
>>> myname[::-1] # reversing idiom
'sufuR'
>>> reversing_slice=slice(None,None,-1) # reversing idiom as slice object
>>> myname[reversing_slice]
'sufuR'
>>> odds=slice(0,None,2) # another example
>>> myname[odds]
'Rfs'
如果您有一个经常使用的切片,这比在多个程序区域中使用常量更可取,并且省去了必须输入 2 或 3 个引用的痛苦
每次。
当然,它确实让它看起来像一个索引,但是在使用Python一段时间后,你会发现一切都不是乍一看的样子,所以我建议更好地命名你的变量(正如我对 reversing_slice
所做的那样,与 odds
相比,这还不是很清楚。
首先,我想澄清一下问题:它是关于 slice()
函数的, 不是 列表或字符串的切片,例如 a[5:4:3]
.
文档提到这个函数在 NumPy 中使用,但没有给出使用示例(它说 如何使用它 但没有说 何时使用它)。此外,我 从未 见过任何 Python 程序中使用过此函数。
在纯 Python(没有 NumPy 或 SciPy)编程时,什么时候应该使用 slice()
函数?任何示例将不胜感激。
a[x:y:z]
给出与 a[slice(x, y, z)]
相同的结果。 slice
对象的优点之一是它可以作为单个对象存储和检索,而不是存储 x
、y
和 z
.
它通常用于让用户定义自己的切片,以后可以将其应用于数据,而无需处理许多不同的情况。
从你的问题来看,我相信你正在寻找一个例子。所以这就是我尝试 slice
来自 range(1, 20)
的列表时所拥有的,步骤为 3
>>> x = range(1, 20)
>>> x[1:20:3]
[2, 5, 8, 11, 14, 17]
>>> x[slice(1, 20, 3)]
[2, 5, 8, 11, 14, 17]
不,这还不是全部!
由于已经提到了对象,首先您必须知道 slice 是一个 class,不是一个返回对象的函数。
slice() 实例的第二次使用是将参数传递给 getitem() 和 getslice() 方法使您自己的对象的行为类似于字符串、列表和其他支持切片的对象。
当你这样做时:
print "blahblah"[3:5]
自动转换为:
print "blahblah".__getitem__(slice(3, 5, None))
因此,当您编写自己的索引和切片对象时:
class example:
def __getitem__ (self, item):
if isinstance(item, slice):
print "You are slicing me!"
print "From", item.start, "to", item.stop, "with step", item.step
return self
if isinstance(item, tuple):
print "You are multi-slicing me!"
for x, y in enumerate(item):
print "Slice #", x
self[y]
return self
print "You are indexing me!\nIndex:", repr(item)
return self
试一试:
>>> example()[9:20]
>>> example()[2:3,9:19:2]
>>> example()[50]
>>> example()["String index i.e. the key!"]
>>> # You may wish to create an object that can be sliced with strings:
>>> example()["start of slice":"end of slice"]
较旧的 Python 版本支持方法 getslice(),该方法将用于代替 getitem()。在 getitem() 中检查我们是否得到一个切片是一个很好的做法,如果得到了,将它重定向到 getslice() 方法.这样您将拥有完全的向后兼容性。
这就是 numpy 使用 slice() 对象进行矩阵操作的方式,很明显它经常间接地到处使用。
(使用函数语义)调用 slice
class 实例化一个 slice
对象(开始、停止、步骤),稍后您可以在程序中将其用作切片说明符:
>>> myname='Rufus'
>>> myname[::-1] # reversing idiom
'sufuR'
>>> reversing_slice=slice(None,None,-1) # reversing idiom as slice object
>>> myname[reversing_slice]
'sufuR'
>>> odds=slice(0,None,2) # another example
>>> myname[odds]
'Rfs'
如果您有一个经常使用的切片,这比在多个程序区域中使用常量更可取,并且省去了必须输入 2 或 3 个引用的痛苦 每次。
当然,它确实让它看起来像一个索引,但是在使用Python一段时间后,你会发现一切都不是乍一看的样子,所以我建议更好地命名你的变量(正如我对 reversing_slice
所做的那样,与 odds
相比,这还不是很清楚。