はじめに
最近、Pythonを勉強し始めて、「退屈なことはPythonにやらせよう」という本で勉強していったときに参考になった小技集の紹介です。その他、便利な小技がありましたら、ぜひご教授の方、お願いします!
小技集
配列
タプル型
( )を用いてリスト型のように表現する。基本的には、大かっこ[ ]で記述するリスト型とほぼ同じ。リスト型との違いは、初期化後は再代入不可(イミュータブル)であること。以下に例を示す。他の実装者にこの配列は、変更するつもりがないことを意図させる時に便利。
>>> li = ("a", "b")
>>> li[0] = "c"
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
要素指定
コロン(:)を用いて、要素の範囲を一括に指定することが可能。例えば、「3~5文字目がほしい」、「2文字目以降がほしい」とかいう時に便利。
例)文字列の3~5文字目が欲しい
>>> li = "abcdef"
li[2:4]
'cd'
例)文字列の2文字目以降が欲しい
>>> li = "abcdef"
>>> li[1:]
'bcdef'
enumerate関数
for文時にindexとkey(要素)の両方が取得することができる。
>>>li = "abcdef"
>>>for idx, key in enumerate(li):
>>> print("idx: " + str(idx) + ", key: " + key)
...
idx: 0, key: a
idx: 1, key: b
idx: 2, key: c
idx: 3, key: d
idx: 4, key: e
idx: 5, key: f
文字列操作
join関数
引数として指定された配列を指定された文字で結合する。以下のように用いる。例えば、csvでカンマ(,)で区切った要素にしたいという時に便利。
例) str1の要素をカンマ区切りで取得
>>>str1 = "abc"
>>>",".join(str1)
'a,b,c'
例) str1とstr2の要素をカンマ区切りで取得
>>>str1 = "abc"
>>>str2 = "def"
>>>",".join([str1, str2])
'abc,def'
raw文字列
文字列を生のまま扱うことが可能。つまりわざわざエスケープシーケンスを挿入することなく文字列を表現することができる。文字列の先頭に「r」を付与することで指定可能。正規表現の文字列に良く用いられる。
例) 改行を生のまま扱う
・raw文字列を用いない場合
>>>str = "\\n" # エスケープシーケンスを2回使う必要がある
>>>print(str)
\n
・raw文字列を用いる場合
>>>str = r"\n" # 生のまま表現可能("\\n"と変換してくれる)。
>>>print(str)
\n
デバッグ
logging関数
様々なログ情報(実行時間、ログレベル、ログファイルの出力先の指定etc.)の出力ができる。説明や実装はこちらの方がすごく良くまとめられています。個人的には実行した行が出力できるlinenoがおすすめです。
logging.basicConfig(format='%(asctime)s - %(lineno)s - %(message)s')
__repr__関数
クラスをprint関数にそのまま渡すと__repr_を変わりに呼んでくれる。同様に_\str関数があり、こちらが定義されている場合には__str_関数が優先して呼ばれる。ちなみアンダースコア2つで囲まれている関数を特殊メソッドと呼ぶそうです。デバッグ時にクラスのメンバ変数まとめて出力したいという時に便利。
>>> class Foo:
... def __init__(self, a, b):
... self._a=a
... self._b=b
... def __repr__(self):
... return "_a: " + self._a + ", _b: " + self._b
>>> foo = Foo("abc", "def")
>>> print(foo)
_a: abc, _b: def
謝辞
@shiracamus様から__repr_関数について__str関数に関するご指摘を受けて訂正させていただきました。ご指摘ありがとうございますm( _)m