簡體   English   中英

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對象的優點之一是它可以作為單個對象存儲和檢索,而不是存儲xyz

它通常用於讓用戶定義自己的切片,以后可以應用於數據,而無需處理許多不同的情況。

(使用函數語義)調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM