Python で文字列反転

文字列を反転させる方法として、例えば Java ならば StringBuffer クラスの reverse メソッドがあるが、Python で「いかにも Python っぽい !」という書き方があったので紹介しつつ考察したい。

まずは正解から言ってしまうと、ここに書いてある。
文字列を逆順にする - ひきメモ

>>> str = "abcdefg"
>>> str[::-1]
'gfedcba'

ではなぜこれが正解なのか。以下考察。
Python のドキュメントによれば、sequence type の s に対する s[i:j:k] は

slice of s from i to j with step k

とある。つまり i + k, i + 2k, … と取り出して、j に達したところで止まる。ただし注意書きとして

The slice of s from i to j with step k is defined as the sequence of items with index x = i + n*k such that 0 <= n < (j-i)/k. In other words, the indices are i, i+k, i+2*k, i+3*k and so on, stopping when j is reached (but never including j). If i or j is greater than len(s), use len(s). If i or j are omitted or None, they become “end” values (which end depends on the sign of k).

とある。

>>> str[:4:2]
'ac'
>>> str[2::2]
'ceg'

第一のケースでは 0 ≤ n < (4 - 'end')/2 から 'end' = 0 と推定され、第二のケースでは 0 ≤ n < ('end' - 2)/2 から 'end' = len(str) と推定されるのがおわかりだろう。

>>> str[:2:-2]
'ge'
>>> str[4::-2]
'eca'

第一のケースでは 0 ≤ n < (2 - 'end')/(- 2) から 'end' = len(str) - 1 と推定される。第二のケースでは 0 ≤ n < ('end' - 4)/(- 2) から 'end' = - 1 と推定される(ただし str[4:-1:-2] は意味が変わってしまうので注意)。

ここまで試したところで改めて

str[::-1]

という式を眺めれば、これは「文字列の末尾から 1 個ずつさかのぼって先頭まで要素を取りだす」という操作になるので、文字列を反転させる操作になることがお分かりいただけると思う。