まず、質問を明確にしたいと思います:それは slice()
関数、notリストのスライスまたは_a[5:4:3]
_のような文字列。
ドキュメントでは、この関数はNumPyで使用されており、使用例は示されていません(の使用方法と言われていますが、言われていないいつ使用するか)。さらに、私はneverでこの関数があらゆるPythonプログラムで使用されているのを見ました。
プレーンPython(NumPyまたはSciPyなし))でプログラミングするときに、slice()
関数を使用する必要があるのはどのような例ですか?.
_a[x:y:z]
_は、a[slice(x, y, z)]
と同じ結果を返します。 slice
オブジェクトの利点の1つは、x
、y
、およびz
を保存する代わりに、単一のオブジェクトとして後で保存および取得できることです。
多くの場合、ユーザーが後でさまざまなケースに対処する必要なく、データに適用できる独自のスライスを定義できるようにするために使用されます。
いいえ、それだけではありません!
オブジェクトについては既に述べたように、最初に知っておく必要があるのは、スライスがクラスであり、オブジェクトではないということです。
Slice()インスタンスの2番目の使用法は、文字列、リストのように動作する独自のオブジェクトを作成するときに、引数を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バージョンはgetitem()の代わりに使用されるメソッドgetslice()をサポートしていました。チェックインすることをお勧めしますgetitem()スライスを取得したかどうか、取得した場合はgetslice()メソッドにリダイレクトします。これにより、完全な下位互換性が得られます。
これは、numpyがマトリックス操作にslice()オブジェクトを使用する方法であり、間接的にどこでも常に使用されていることは明らかです。
(関数のセマンティクスを使用)slice
クラスを呼び出すと、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
からのリストをrange(1, 20)
からのステップで試してみたとき
>>> 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]