Python入門(後編)- プログラムの組み立て方を習得
Webブラウザで実行できるPython入門の「後編」です。
前編の各種データ型などのパーツを組み立ててプログラムを作成する方法を学べる教材です。おすすめの学習方法ではこの教材を利用したPythonの学び方を紹介しています。
後編の目次
本ページのPython実行環境について
- ブラウザでPythonを実行できるPyodide 0.25.0(Python 3.11.3)を利用しています。
- 本ページのコードを試行する用途のみにご利用ください(input()など本ページで使用していない機能には動作しないものがあります)。
Python実行環境 ロード中… しばらくお待ちください
条件分岐
Pythonでは、コードブロックは左側をインデントして書く。インデントには「半角スペース4つ」を使用するのが推奨されている。
単純な条件分岐は「三項演算子」を使用すると1行で書ける。
ループ
for文
文字列、リスト、辞書などのイテラブルなオブジェクトは、for ... in ...:で反復処理できる。0,1,2..のような整数の連なりを反復したい場合は、range()を使うと便利である。
辞書の反復処理は、キーだけ、値だけ、キーと値のペア、の3通りが可能である。
ループを終了するにはbreak、処理を途中で中断して継続するにはcontinueを使用する。
while文
関数
関数定義
関数名は、変数名と同様に小文字のスネークケース(snake_case)で書くのが推奨される。英字、数字、アンダースコア(_)を使用できるが、先頭に数字は使えない。
*および**のプレフィックスを付けて可変長のパラメータを受け取る関数を定義できる(オプションパラメータ)。*argsは追加のパラメータがargsにタプルでまとめられ、**kwargsはキーワード付きパラメータ(キーワード=値)がkwargsに辞書でまとめられる。
スコープ
関数の外で定義した「グローバル変数」は、関数の中でも読み取れる。
グローバル変数を関数の中で書き換えるには、関数の中でglobalキーワードで宣言する必要がある。
関数の中で定義された「ローカル変数」には、関数の外(グローバルスコープ)からはアクセスできない。
無名関数(lambda式)
lambdaキーワードを使うと単一式の無名関数を定義できる。定義できるのは単一の式だけであり、実行するとその結果が自動的に返される。関数をインラインで定義できるので、sorted()のkeyオプションの指定に使用すると便利である。
クラス
クラスの定義
「クラス変数」は、クラス自体の変数であり、インスタンス間で共有される。「インスタンス変数」は、インスタンスごとの変数であり、インスタンス間で共有されず、個別のデータを保持する。インスタンス変数は、インスタンス生成時に呼び出されるコンストラクタ(__init__()メソッド)の中で定義および初期化する。
メソッドに@classmethodデコレータを付けて「クラスメソッド」に変換すると、第1パラメータ(clsを用いる)がクラス自身になるので、クラス変数やコンストラクタを使用できる。「インスタンスメソッド」は、第1パラメータ(selfを用いる)がインスタンス自身になるので、インスタンス内のデータ属性や他のメソッドを使用できる。メソッドに@staticmethodデコレータを付けて「静的メソッド」に変換すると、インスタンスを作成しなくてもメソッドだけ外部から使用できるようになる。
「クラス変数」「クラスメソッド」「静的メソッド」は、クラスとインスタンスのどちらからもアクセスや呼び出しができる。「インスタンス変数」と「インスタンスメソッド」はインスタンスごとに割り当てられているので、クラスからアクセスや呼び出すことはできない。
プロパティ
Pythonのインスタンス変数は、インスタンスから直接読み書きできる。読み書きに伴う操作を管理するには「プロパティ」を使用する。例えば、インスタンス変数に代入する値の範囲を限定したい場合などに有用である。
プロパティ名で「ゲッターメソッド」と「セッターメソッド」を定義し、それぞれに@propertyと@プロパティ名.setterのデコレータを付ければプロパティとして機能する。ゲッターメソッドだけ定義すれば、読み取り専用のプロパティになる。
継承
他のクラスを「継承」することで、データ属性とメソッドを再利用できる。継承元の「基底クラス」は、class クラス名(基底クラス):のようにかっこを付けて指定する。「派生クラス」の中で基底クラスのメソッドを呼び出すには、基底クラスを参照するのにsuper()を使用する。基底クラスのメソッドを上書きしたい場合は、同じメソッド名で再定義すれば「オーバーライド」できる。
isinstance(obj, cls)関数を使用するとobjがcls(基底クラスも含む)のインスタンスであるかをチェックできる。issubclass(childCls, parentCls)関数ではchildClsがparentClsの派生クラスであるかをチェックできる。
モジュール
標準ライブラリ
Pythonには様々なモジュールを集めた「標準ライブラリ」が備わっている。標準ライブラリは、はじめからPythonに付属しているので、コードの最初にimport yを書いておくとyモジュールをインポートしその中の変数、関数、クラスを利用できる。
from y import xと書くと使用できるのはyモジュールの中のxに限定できる。
モジュールの作成
Pythonのコードを保存したファイル(*.py)は、モジュールとして使用できる。Pythonファイルがモジュールとして読み込まれるとグローバル変数__name__にモジュール名がセットされる。メインプログラムとして実行した場合は__name__には、__main__がセットされるので、モジュールとして読み込まれたときに実行したくないコードはif __name__ == "__main__":ブロックに書いておく。
上記のコードを保存したuser_manager.pyが同じフォルダにある場合、import user_managerを書いておけばモジュールとして参照できる。
さらに「外部(サードパーティ)のモジュール」をインストールすることもできる。インストール方法は以下の記事が参考になる。
ファイル入出力
ファイルはopen(ファイル名, モード)で開く。ファイルを閉じるにはopen()関数が返すファイルオブジェクトでclose()を呼び出す。with文で書くとclose()を省略できる(ブロックから抜け出るときに自動で呼び出される)。モードは、何も指定しないとテキストファイルの読み込みモードで開く。テキストファイルを書き込む場合は、w(存在する場合は上書き)、a(末尾に追記)を指定する。
バイナリファイルをそのまま開く場合は、読み込みにはrb、書き込みにはwb、追記にはabをモードに指定する。
例外処理
try ... except文を使用すると、try節(tryとexceptの間のブロック)のコードで例外が発生した場合の処理をexcept節(exceptの下のブロック)に書くことできる。except節は例外のタイプごとに複数配置できる。try ... except文にはオプションでelse節(例外が全く発生しなかった場合の処理を書く)、finally節(例外の有無に関係なく最後に実行する処理を書く)を加えることができる。
raiseを使用して意図的に例外を発生させることができる。
正規表現
正規表現によるパターンを用いて文字列を検索するには、標準ライブラリの「reモジュール」を使用する。