プロジェクト

全般

プロフィール

Python言語の書き方

プログラム(ツール)構成

最初に、Pythonで記述するプログラムやツールの構成概要をまとめます。

エントリーポイント

Python はスクリプト言語なので、ファイルに書かれた命令を上から順に実行していきます。
モジュールとしてimportされたときもファイルに書かれた命令が実行されます。

スクリプトとして実行されたとき、標準入力から読み込まれたとき、__name__ 変数には main が設定されます。
スクリプトファイルに次の記述を入れておくと、そのファイルがスクリプトとして実行されたときに実行されます。

def main():
    # logic

if __name__ == '__main__':
    main()

外部設定ファイル

プログラムの動作をカスタマイズ可能にする方法の一つとして、プログラム実行時に設定ファイルを読み込み、その設定に応じた振る舞いをするsettingsライブラリがあります。これは Python 3標準ライブラリです。Pythonプログラムと同じディレクトリに、settings.py の名前で設定ファイルを保管します。settings.pyに記述された変数を実行時に読み込み変数の値を使用します。

settingsライブラリ

構造

クラス

空のクラス

class Alfa:
    pass

passは、classが空であることを指示します。

クラスからオブジェクトを作成するには、an_alfa = Alfa() とクラス名に丸括弧を付与して呼び出します。

クラス属性

class Alfa:
    cell = 'H8'

クラス属性へのアクセスは、クラス名.属性名(Alfa.cell) でも、インスタンス名.属性名(an_alfa.cell)でも可能です。
クラス属性を変更すると、変更後にクラスから生成したインスタンスには変更が反映されます。
変更前にクラスから生成したインスタンスには変更が反映されます。

インスタンス属性

インスタンス属性は、class定義には明記されず、最初にインスタンス名.属性名でアクセスしたときに生成されます。
通常、クラスの初期化メソッド__init__() で定義します。

class Bravo:
    def __init__(self):
        self.x = 0
        self.y = 0
  • Pythonの属性は公開
  • インスタンス生成後に属性の追加が可能だが、その場合同じクラスの他のインスタンスには属性が追加されない(そのインスタンス固有)

初期化メソッド

class Alfa:
    def __init__(self):
        pass

インスタンス初期化の特殊なメソッド __init__() を定義します。クラスからインスタンス生成時に初期化するメソッドです。
第1引数はselfとします。

メソッド

  • デコレータのないメソッドはインスタンスメソッド
  • @classmethod デコレータがついたメソッドはクラスメソッド
  • @staticmethod デコレータがついたメソッドは静的メソッド
クラスメソッド
class Alfa:
    @classmethod
    def order(cls):
        pass

第1引数はクラスであり、慣用的に cls を使います。

静的メソッド
class Alfa:
    @staticmethod
    def count():
        pass

プロパティ

class Alfa:
    def __init__(self, in_name):
        self.__name = in_name
    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self, in_name):
        self.__name = in_name
  • propertyデコレータ を付けたメソッドは、@a_alfa.name のように属性の参照であるかのように記述して呼び出す
  • name.setterデコレータを付けたメソッドは、@a_alfa.name = 'abc' のように属性への設定であるかのように記述して呼び出す
  • __ を接頭辞に付けた変数(属性)は外部からアクセスできない。

継承

class Bravo(Alfa):
    pass

クラスAlfaを継承したクラスBravoを定義します。

ミックスイン

データクラス

from datacalss import dataclass

@dataclass
class Charlie:
    name: str
    age: int = 0
  • charlie = Charlie('Angel', 16)
  • charlie = Charlie(name='Angel', age=16)

データクラス

from dataclass import dataclass

@dataclass
class Weather:
    temperature: float
    humidity: float
    id: str = 'NA'

モジュール

  • ファイルがモジュール(alfa.pyファイルならalfaがモジュール名)

インポート

  • import alfa は、alfa.pyファイルに定義される要素を、alfa.要素で呼び出せるようにする
  • from alfa import bravo は、alfaモジュールの中のbravo要素を、直接bravoで呼び出せるようにする
  • 別名でインポートすることができる
    • import alfa as a は、alfa.pyファイルに定義される要素を、a.要素で呼び出せるようにする
    • from alfa import bravo as phonetic_bravo は、alfa.pyファイルに定義されるbravo要素を、別名phonetic_bravoで呼び出せるようにする
  • モジュールを定義するファイルに書かれている実行文は、最初のインポート時に実行される

パッケージ

モジュール(ファイル)が増えたときに、ディレクトリを階層化してモジュールを配置

指針

クラス、モジュール

  • 同じ振る舞いで異なる内部状態のインスタンスが複数あるときは、クラス
  • 何かを1つだけ用意するときはモジュール(シングルトンとして使える)
  • 複数の値をまとめて捌く(関数の引数に渡すなど)にはクラス
    • タプル、名前付きタプルで賄えるならそれがいい
    • データクラス(Python 3.7以降)
  • 単純な方法を使う
  • 既存の構造を使う。数値、文字列、タプル、リスト、集合、辞書、コレクションライブラリ

データ

Python のデータ型

基本データ型

名称
bool 真偽値 True, False
int 整数 正負の整数値、大きさの制限はほぼない
float 浮動小数点数 64bit浮動小数点数
complex 複素数
str 文字列
list リスト
tuple タプル
bytes バイト
bytearray バイト配列
set 集合
frozenset 不変集合
dict 辞書

文字列

クォート

文字列の生成は、シングルクォートまたはダブルクォートで文字を囲みます。
'Alfa' "Bravo"
どちらのクォートを使用しても同じに扱われます。クォートが2種類あることで、クォート文字を含む文字列が生成できます。
'He said "I am a Hero."'

複数行文字列

複数行文字列はトリプルクォートを使います。

multiline = """Hello, Alfa.
How are you?
Bye
""" 

フォーマット済み文字列リテラル

f' で始まる文字列は、文字列内で波括弧で囲まれた文字列を式として評価し、結果文字列に置換えます。

name = "Alfa" 
age = 20
print(f'{name} is {age} years old.')

これは、Alfa is 20 years old. と出力されます。

波括弧内で、式文字列の後に=を置くと、式=値と置換されます。

print(f'{name=})

これは、name='Alfa'と出力されます。

辞書

キーと値の組み合わせを複数保持するデータ型です。

制御

繰り返し制御

for

分岐

if

命名規約

Pythonコードの標準ライブラリで採用されているスタイルガイド PEP8 があります。

参考文献

書籍

  1. Introduction Python SECOND EDITION, Bill Lubanovic, O'REILLY, 2021
    邦訳「入門 Python 3 第2版、鈴木駿 監訳、オライリージャパン、2021」

インターネット

  1. Python 3.10 ドキュメント
    https://docs.python.org/ja/3.10/
  2. Python コードのスタイルガイド(PEP8)
    https://pep8-ja.readthedocs.io/ja/latest/