[英]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
類實例化一個slice
對象 (start,stop,step),你可以在程序中稍后將其用作 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 是一個類,而不是一個返回對象的函數。
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() 對象進行矩陣操作的方式,很明顯,它經常在各處間接使用。
從你的問題我相信你正在尋找一個例子。 所以這就是我嘗試從range(1, 20)
以3為步長對列表進行slice
時所擁有的
>>> 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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.