Skip to content

Python覚書

HIRO edited this page Jul 2, 2023 · 15 revisions

命名規則

名前をつけるもの 命名規則
変数 スネークケース variable_name
定数 全部大文字のスネークケース CONSTANT_NAME
グローバル変数 スネークケース global_variable_name
関数 スネークケース function_name
関数の引数 スネークケース function_parameter_name
クラス パスカルケース ClassName
インスタンス変数 スネークケース instance_variable_name
メソッド スネークケース method_name
パッケージ スネークケース package_name
モジュール スネークケース module_name

出典: https://python.softmoco.com/basics/python-naming-conventions.php

インデント

他言語と異なり、インデントの深さでブロックが決まることに注意。
多くのライブラリで空白スペース4つとなっている。
決まりはなく、プロジェクト内で統一されていれば良い。

コメント

行中 # 以降はコメント扱いになる。

制御文

for~in

要素数だけ繰り返す処理。

for item in items:
    print(item.value)

内包表記

リストに対して同じ処理をしたい場合に有効。
list(オブジェクト.メソッド() for オブジェクト名 in リスト名)

class Obj:
  def __init__(self, value):
    self.value = value
    
  def add(self, v):
    self.value += v
    
li = list([Obj(1), Obj(3), Obj(5)])
list(o.add(2) for o in li)
# [3, 5, 7]

パフォーマンスは、内包表記 > map() > for文
参考:Pythonでfor文とlambdaの書き方&速度を比較してみた

while

条件がtrueの限り繰り返す処理。

while len(list) > 0:
  list.pop(0)

match-case文

他言語のswitch-case文に該当するが、様々なバリエーションがある。

number = 10

match number:
    case 0:
        raise Exception('失敗')
    # ここがマッチ 
    case 10:
        print('成功')
    case _:
        raise Exception('失敗')

参考:https://www.lifewithpython.com/2021/06/python-structual-pattern-matching.html

List操作

要素の追加

list.append(item)

要素の参照

# 先頭は0
list[0]

要素の削除

# clear(): 全削除
list.clear()

# pop(): 指定した位置の要素を削除し、値を取得
# 先頭の要素は0
list.pop(0)
# 最後の要素は-1
list.pop(-1)

# remove(): 指定した値と同じ要素を検索し、最初の要素を削除
# 存在しない場合はエラー
list.remove("something")

# del: 削除したい要素をインデックスで指定する。
# 先頭の要素は0
del list(0)
# 最後の要素は-1
del list(-1)

参考:https://note.nkmk.me/python-list-clear-pop-remove-del/#pop

List => String

print(list)
# ['A', 'B', 'C']

print(" ".join(list))
# [A B C]

try-except

try-catchに該当する構文。
excepttryの中で例外が起きた場合に、
elsetryの中で例外が起きなかった場合に実行される。

except (例外クラス) as (変数名): で、例外の内容を捕捉できる。

try:
    value1 = 0
    value2 = 1
    
    print(value2 / value1)
except Exception as e:
    print(e)
else:
    print("No Error!")
finally:
    print("Done!")

出力例

division by zero
Done!

クラスとインスタンス

クラス

# 通常のクラス
class MyClass:
    # static属性
    staticValue = "static"

    # コンストラクタ
    __init__(self):
        # インスタンス属性
        self.name = "suzuki"
        self.lang = "ja"
        # 慣習的に、自クラス以外からアクセスさせたくないことを意味した属性
        self._lang = "ja"   
        # 自クラス以外からアクセスできないようにする
        self.__lang = "ja"

    # staticメソッド
    @staticmethod
    def static_do():
        print(MyClass.staticValue)

    # classメソッド ※staticメソッドとの違いは、第一引数からそのクラス自身にアクセスできる
    @classmethod
    def class_do(class):
        pass

    # インスタンスメソッド
    def do(self):
        print(self.name)

# 派生クラス
class Parent:
    # 内容が存在しない場合は pass でブロックを閉じる
    pass

class Child(Parent):
    pass

参考: なぜPythonにはgetter/setterがないのか?

インターフェース

# インターフェースを定義するために ABC を利用する
from abc import ABC

# インターフェース
class IMyClass(ABC):
    # 抽象クラス
    @abstractmethod
    def abstract_do(self):
        pass

# 具象クラス
class MyClass(IMyClass):
    __init__(self):
        pass

    # 抽象メソッドの実装
    abstract_do(self):
        pass

インスタンスの型判定

type(判定対象) で型を取得できる。

def is_str(v):
    return type(v) is str # 複数の型を判定したい場合は、in (Class1, Class2) とする

print(is_str('string'))
# True

print(is_str(100))
# False

print(is_str([0, 1, 2]))
# False

instance(比較対象, クラス)は比較対象が派生クラスのオブジェクトでも一致とみなす。

print(type(True))
# <class 'bool'>

print(type(True) is bool)
# True

print(type(True) is int)
# False

print(isinstance(True, bool))
# True

# Pythonの bool は int の派生クラス
print(isinstance(True, int))
# True

hasattr()

対象のインスタンスが属性を持っているならTrueを返す。

obj.value = 1
hasattr(obj, value)
# True

参考:https://docs.python.org/ja/3/library/functions.html#hasattr