St_Hakky’s blog

Data Science / Human Resources / Web Applicationについて書きます

Effective python シリーズ6:Avoid Using start, end, and stride in a Single Slice

こんにちは。

○読んでいる本

以下の本を勉強がてら読んでいます。

www.effectivepython.com

ここにある通り、Pythonプログラムを改良する59項目が掲載されています。詳細は本に書かれているので、それを読めば良しとして、大事そうなところと、これに関連して勉強したことを書きます。

まとめページは以下より。

st-hakky.hatenablog.com


さて、今回は6つ目:「Avoid Using start, end, and stride in a Single Slice」をやります。

○Avoid Using start, end, and stride in a Single Slice

はい、これですね。前回のエントリで私が堂々とメモ書きしていたやつをやめなさいと言われていますね笑

■somelist[start:end:stride]

前回のエントリ以外にも、Pythonでは、リストをstartからendまでstrideずつ取ってくるという機能があり、例えば増分に2とか指定すると、偶数番目とか奇数番目のデータを取得できたりします。

somelist = ["odd", "even", "odd", "even", "odd", "even", "odd"]
odds = somelist[::2]
evens = somelist[1::2]
print(odds)
print(evens)

上記を実行すると、

['odd', 'odd', 'odd', 'odd']
['even', 'even', 'even']

ってな感じです。

■よくある文字列反転

なんかPythonっぽくて私は好きなんですが、ぱっと見確かに何やっているかわからないというのはあると思います。笑

somestring[::-1]

これの問題点の一つに、ASCII文字のバイト列にはうまく働くが、UTF-8バイト列で符号化したUnicode文字列にはダメというのがあります。

somestring = "これは動かない"
x = somestring.encode("utf-8")
y = x[::-1]
z = y.decode("utf-8")  # error!!

わかりにくさの観点で行けば、負の値をstartやendに指定しだすと、読みにくくなるというのがあります(詳しくは本参照)。

■問題点まとめ
  • 文字列反転によく使うあれはASCII文字のバイト列はうまくいくけどutf-8バイト列で符号化したUnicode文字列にはダメなので、バグの原因にもなるし別の方法を取ろう(逆に言えばこれ以外の場合は、、)
  • 混乱を避けるために、できるだけ正のstride値を使い(負のstrideは使わない)、startかendのうちどちらか一方のみと一緒に使うようにする。

それでは。