Python

ArgumentParser (argparse)
スクリプトの引数の取り方
公式ドキュメント
Qiita
Python 用ロギング機能
logging

Python 標準ライブラリー一覧

for文とwhile文の使い分け
for文はリストの要素を逐一確認して、最後の要素まで繰り返すための構文。
while文は、ある条件が成立する間、処理を繰り返す構文。
lst = [1, 2, 3, 4, 5]
for v in lst:
print(v)
v = 1
while v < 5:
print(v)
v += 1
print(v)
for文とwhile文を使い分けるコツは、繰り返す回数が決定できるのか否か。
繰り返し回数が決まっているのであれば、for文。
繰り返す回数はわからないけど終了条件は明確の場合は、while文を使う。
while文の条件は True 、 None以外のオブジェクト 、 ゼロ以外の数値 、 空文字(1文字もない状態)以外の文字列 、 空でないコンテナ(リスト、辞書、タプル) などの場合は継続する。
False 、 None 、 0 、 空文字 、 空のコンテナ などの場合は終了します。

breakとcontinueの違い
breakは処理を終了させる。
continueは処理をスキップさせる。
arr = [1, 2, 3, 4, 5]
for v in arr:
if v == 3:
break
print(v)
# output-> 1, 2
arr = [1, 2, 3, 4, 5]
for v in arr:
if v == 3:
continue
print(v)
# output-> 1, 2, 4, 5

クラス変数とインスタンス変数
クラス変数
クラス自体が保持する変数
「クラス名.変数名」 で呼び出し
class Sample1:
name = 'name' # クラス変数(クラス自体が保持する変数)
print(Sample1.name) # name
インスタンス変数
オブジェクト固有の変数。データ属性ともいう。
「オブジェクト名.変数名」 で呼び出し(※クラス変数にもアクセス可)
class Sample2:
def __init__(self, value):
self.value = value
s1 = Sample2('AAA')
s2 = Sample2('BBB')
print(s1.value) # AAA
print(s2.value) # BBB

ユーティリティークラス
よく使う関数群をまとめたクラスをユーティリティクラスという
クラス関数には2種類ある。
- クラスメソッド
- スタティックメソッド
関数の頭に@classmethodまたは@staticmethodのデコレーターをつけて使い分ける。
class TaxCalc:
@classmethod
def class_method(cls, price):
assert cls.__name__ == TaxCalc.__name__
return int(price * 0.1)
@staticmethod
def static_method(price):
return int(price * 0.1)
print(TaxCalc.class_method(1000))
print(TaxCalc.static_method(1000))
クラスメソッドとスタティックメソッドの違い
クラスメソッドはメソッドのselfと同じで、第1引数にclsが格納される。
スタティックメソッドにはない。
使い分け
基本的には@staticmethodでOK。
クラスの情報が必要な場合や、派生クラスでオーバーライドする場合には@classmethodを使う。

publicとprivate
クラスが保持している変数や関数に対して、他のクラスのアクセスを制限できる。
class Sample:
num1 = 100
__num2 = 200
def __init__(self):
self.__num3 = 300
def show_num(self):
print(Sample.__num2)
print(self.__num3)
print(Sample.num1)
- print(Sample.__num2) # AttributeError
s = Sample()
s.show_num()
- print(s.__num3) # AttributeError
通常はpublicだが 「 __ 」を変数や、関数の頭につけるとprivateに変更できる。
privateはクラスの内部の関数しかアクセスできない。
※private変数は継承もできない。

継承(Inheritance)
クラスの情報(変数や関数)を引き継いで、新しいクラスを作成できる。
継承元、継承後のクラスをそれぞれスーパークラス、サブクラスと呼ぶ。
class A:
def __init__(self):
self.name = 'Class A'
class B(A):
pass
b = B()
print(b.name) # Class A
オーバーライド(override)
継承したクラスの関数はサブクラスでオーバーライド(上書き)することができる。
また、super関数で親クラスのオーバーライド前の関数にもアクセスできる。
※ super()が関数になっているのは、親→子→孫→ひ孫→玄孫という深い継承関係にあったときでも追えるようにするため。
class A:
def hello(self):
print('Class A says Hello')
class B(A):
def hello(self):
super().hello()
print('Class B says Hello')
b = B()
b.hello()
# >>> Class A says Hello
# >>> Class B says Hello
