PythonプログラミングTips集(蛇使いのための備忘録)

プログラミング言語 “Python“(パイソン)は、今やIT・AI産業において最も使用されていると言っても過言ではない世界で最も有名な言語の一つである。このページではPython(3系)によるコーディングの基本から、ちょっとした応用までの内容について備忘録程度にまとめてある。内容は適宜追加していく予定だが、他人に優しい解説が掲載されているとは限らないので予めご留意願いたい。

なお、当サイトでは個別の質問対応には応じられないので、適宜、他サイトの専用掲示板などをご活用下さい。

(管理人:blocks)

● Python3 Tips集:目次 ●

 Pythonことはじめ

§ Pythonことはじめ
・そもそも「Python」って?
・Pythonのコーディング規約「PEP 8」
・Pythonは計算が苦手?
・ライブラリのインストール
・開発環境の構築

§(Linux)ローカルにPythonを導入する
・sudo権限が無い場合
・手順①:ソースコードのダウンロード
・手順②:ソースコードからビルドする
・手順③:ローカル環境のPythonのパスを通す

§ pipで入れたのにimportできないときのトラブルシューティング

§ 実行中のPythonとインストール先の食い違いを診断する

§ 別のPCで環境を再現する:依存関係の記録と入れ直し

§ json.pyという名前でimportが壊れる?モジュール名の衝突を調べる

§ importしただけで処理が走るのを防ぐ:__main__の使い分け

§ 複数の.pyに分けたらimportエラー:小さなパッケージに整理する

§ 循環importをほどく:共通部分の切り出しで依存関係を整える

§ インストール後も同梱データを読めるようにする:importlib.resources

§ 自作ライブラリを別プロジェクトから使う:editable installの始め方

§ 追加ライブラリがあるときだけ機能を有効にする:任意依存の扱い

§ import名とインストール名が違う?パッケージ情報を正しく確認する

 そもそもsyntax分からん系のTopic

§ if文の書き方
・if 文の例①(if~elif~else)
・if 文の例②(条件が複数のとき/論理演算子)
・比較演算子(==, !=, <=, など…)
・比較するときは変数の型に注意せよ
§ while文の書き方
・while 文の例
・break処理でループを中断する
・break処理で多重ループを抜けるワザ
・比較演算子(==, !=, <=, など…)
・比較するときは変数の型に注意せよ
§ for文の書き方とrange関数の使い方
・for 文の例①(リスト)
・for 文の例②(range関数の使い方)

 出力系のTopic

§ printで出力のformatを指定する
・format関数の基本的な使い方
・%で書式を指定する方法
・「f文字列」の使い方 (Python3.6以降)
§ printで桁合わせ・ゼロ埋め・文字寄せする
・桁合わせ
・ゼロ埋め
・左寄せ・中央寄せ・右寄せ
§ 特殊文字( # とか % とか ” とか)を出力する
・エスケープする
・波括弧(中括弧)を表示する
§ 改行しないでprintする方法
・endを指定する
・sys.stdout.writeを使う
§ 日本語を使う
・文字コードとencode/decode
・図中で日本語フォントを利用する
・Atomエディタ上で日本語を出力する
§ matplotlibでグラフを作成する方法【総まとめ】
・matplotlibの基本と2つの流儀
・色・線種・マーカーの指定
・折れ線&曲線のグラフ
・棒グラフ
・円グラフ
・ヒストグラム
・散布図とカラーバー
・ヒートマップ
・複数の線を表示する
・等高線&濃淡のある等高線
・3Dのグラフを表示する
・複数のグラフを並べる
§ 3Dの曲線を描画する(ローレンツアトラクタの例)
・ローレンツ方程式とは
・ローレンツアトラクタの3D描画
・ラベルに日本語を使う
・連続的にカラーリングする
・平面を透明化&背景色を変える

§ 上下幅が違うエラーバーを描く

§ ゼロや負の値があるグラフの軸を選ぶ

§ 複数のヒートマップで同じ色を同じ値にする

§ 欠測区間を線でつながないグラフにする

§ 画像の上下反転と半画素ずれを直す

§ 重すぎる論文用PDF図を軽くする

§ 大量の図を保存するときのメモリ増加を防ぐ

 演算系のTopic

§ 四則計算と剰余(余り)の計算
・整数値の四則計算
・小数値の四則計算
§ べき乗と平方根・累乗根の計算
・べき乗と平方根・累乗根の計算
・複素数のべき乗計算
§ 実数↔整数の変換
§ 複素数型変数の扱い方
・複素数型変数の四則計算
・実部と虚部、共役複素数を取得する
・複素数型変数の大きさ(abs関数)
・複素数のべき乗計算
§ 記数法の変換(10進数⇔n進数)
・$n$進数から$10$進数へ変換
・$10$進数から$n$進数へ変換
・$n>36$ の場合
§ 階乗・二重階乗の計算
・階乗の計算
・二重階乗の計算
§ 時刻差分の計算
・一般的な時刻の計算
・タイムゾーンを跨ぐ時刻の計算
・UNIX時間の計算

§ 数値的に求めた方程式の根を検証する

§ 不等間隔の測定値を台形則で積分する

§ 微分方程式を条件到達で停止する

§ 非線形フィットの失敗を残差から診断する

§ 補間曲線の行き過ぎと範囲外推定を防ぐ

§ 信号のピークを高さだけで拾わない

§ FFTの横軸と振幅のずれを直す

§ ゼロが多い行列を疎配列で組み立てる

§ 連立方程式の解を残差と条件数で点検する

§ 近くの測定点を距離の上限付きで探す

 文字列系のTopic

§ 文字列同士を比較する方法
・文字列を比較する
・配列やリストの比較
・特殊文字を含む文字列
・変数の型にはご注意
§ 文字列の部分一致・検索
・部分一致する文字列の存在を調べる
・部分一致する文字列の個数を調べる
・部分一致する文字列の位置を調べる
§ 数値⇔文字列の型変換
・数値 ⇒ 文字列
・文字列 ⇒ 数値
§ 文字列が数値かどうか判定する方法
・文字列の値の種類を調べる関数
・文字列がどんな数値か判定する方法
§ 文字列を連結・結合する方法
・「+」演算子を使う
・f文字列を使う
・formatメソッドを使う
・printの区切り文字を変更する
§ 文字列の全角英数を半角にする方法
・translate関数を使う

§ 測定ログを列に分ける:名前付きグループで正規表現を読む

§ IDの形式を厳密にチェックする:fullmatchとASCII文字の指定

§ 検索語に記号があっても壊れない:re.escapeで複数語を検索する

§ 文章から測定値と単位を取り出す:符号・小数・指数表記に対応する

§ 一致した内容で置換を変える:re.subに関数を渡す

§ 設定ファイルの変更箇所を差分で出す:difflib.unified_diff

§ 複数行のブロックを取り出す:MULTILINEとDOTALLの違い

§ 文字列のリスト表記をデータに戻す:literal_evalの使いどころ

§ 引用符の中の空白を残して分割する:shlexでトークン化

§ HTMLからリンク一覧を取り出す:HTMLParserの小さな使い方

 リスト(配列)系のTopic

§ リストの作成方法
・リストを定義する
・2次元配列(リストのリスト)を定義する
・要素の個数を倍にする(リストの初期化)
・range関数を利用する
§ リストへの要素の追加
・リストに要素を追加する(末尾に追加する)
・リストに要素を挿入する(末尾以外に追加する)
・リスト同士の結合
§ リストの要素数を数える
・len関数でリストの要素数を取得する
・要素のindex(何番目の位置にあるのか)を取得する
§ リストの要素の入れ替え
・1行で入れ替える
・別の変数を経由する
§ リストを丸ごと入れ替える
・n番目以降の要素を全て入れ替える
・スライス(:)を使った別法
§ listとarrayとNumPy配列の違い
・listの要素の型は何でも良い
・arrayはインポートが必要
・arrayは基本的に数値型を要素とする
・listとNumPy配列
§ NumPy配列の演算処理はなぜ速いのか
・listを演算処理に使うデメリット
・NumPy配列(ndarray)は数値計算に特化している
§ 全要素が0の任意長のリストを作成する方法
・全要素が0の任意長のリスト

§ NumPyのshapeが合わないときの直し方

§ 切り出した配列を変えると元も変わる理由

§ NumPyの整数計算が桁あふれする原因

§ 条件抽出で配列が1次元になるのを防ぐ

§ reshapeとtransposeでデータの並びを壊さない

§ NaNを除いた平均に有効データ数を添える

§ 計算結果の一致を許容誤差で確かめる

§ 同じ添字への足し込みが抜ける問題を直す

§ 測定配列をつなぐか重ねるかを選ぶ

§ ゼロ除算する要素だけ計算から外す

 ファイル処理系のTopic

§ ファイルの読み書き
・モードを指定してファイルを開く
・ファイルに書き込む
・ファイルの中身を読み込む
§ 文字列や行の要素をsplit関数で取得する方法のまとめ
・split関数で要素を抽出する
・split関数の区切り文字を指定する
・複数の区切り文字を指定するには
・csvファイルを読み込むには
§ csvファイルの処理
・ファイルを開く
・pandasでcsvを読み込む
・数字の3桁区切りの対処法
・csvへの書き込み
・区切り文字の指定
・要素を引用符で囲む

§ 実行する場所でファイルが見つからない:相対パスの基準をそろえる

§ フォルダー内の対象ファイルだけ集める:globと除外条件

§ file2よりfile10が先に来る?番号付きファイルを自然順に並べる

§ フォルダーのファイル台帳を作る:パス・サイズ・更新日時の収集

§ 保存途中で元ファイルを壊さない:一時ファイルから置き換える

§ 作業用ファイルを残さない:TemporaryDirectoryで一時領域を管理する

§ 大量ファイルの名前を安全に変える:事前確認と衝突検出

§ 巨大なテキストを丸ごと読まない:行単位で抽出・集計する

§ 必要なファイルだけ複製する:shutilで作業フォルダーをコピー

§ 保存先が指定フォルダーの外に出ないようにする:パスの検証

 ユーティリティ系のTopic

§ PDFを結合・分割・回転する方法
・PyPDF2の導入
・PDFを結合する
・PDFを分割する
・PDFを回転する
§ sympyで数式の計算を自動化する
・sympyとは
・シンボルの宣言
 ・複数文字をまとめて宣言する
 ・添え字付き文字を一括で宣言する
 (Sympyで添え字付き文字を一気に定義する方法)
 ・ギリシャ文字はLaTeX形式で
 ・数が属する集合を指定する
・数式のLaTeXコマンド出力例
 ・式の簡約化&展開&因数分解
 ・極限計算&微分積分
 ・行列計算
・その他の演算
 ・代入計算
 ・方程式を解く
 ・総和&総乗計算
 ・近似値の表示

§ printからloggingへ:重要度と例外の記録を使い分ける

§ argparseでヘルプ付きの使いやすいコマンドを作る

§ TOML設定ファイルをtomllibで読み込み、入力ミスを早めに見つける

§ dataclassで実験条件をまとめる:default_factoryとfrozenの注意点

§ subprocess.runで外部コマンドの失敗・出力・時間切れを扱う

§ 解析をやり直せる実行記録を残す:条件・入力ハッシュ・環境情報

 関数・スコープ系のTopic

§ コピーしたデータまで変わる?浅いコピーと深いコピーを使い分ける

§ 関数を呼ぶたびにリストが増える?可変デフォルト引数を直す

§ 引数の省略とNoneを区別する:センチネルで更新処理を作る

§ 引数の渡し間違いを防ぐ:キーワード専用引数で関数を設計する

§ *argsと**kwargsで処理を包む:引数の転送と重複指定の落とし穴

§ 値があるのにUnboundLocalError?変数のスコープを直す

§ ループで作ったlambdaが全部同じ値を返す原因と直し方

§ 自作デコレーターで関数名が消える?wrapsで使いやすく整える

§ 同じ計算を繰り返さない:lru_cacheとキャッシュの消しどき

§ 似た関数を量産しない:partialで処理の条件を固定する

 辞書・集合・コレクション系のTopic

§ 辞書の結合で値が消える?衝突を検出してマージする

§ 辞書をループ中に削除してエラーになるときの直し方

§ レコードをIDで素早く探す:辞書の索引と重複IDの検出

§ データを項目別にまとめる:defaultdictでグループ分け

§ 個数も含めて2つの一覧を比較する:Counterで過不足を調べる

§ 2つの名簿の共通・追加・削除を調べる:集合による差分チェック

§ 順序を残して重複を取り除く:文字列一覧からレコードまで

§ 複数条件でレコードを並べる:昇順・降順・欠損値のソート

§ 既定値と個別指定を重ねる:ChainMapで優先順位を扱う

§ 直近N件だけを保存する:dequeで履歴と待ち行列を作る

 例外処理・デバッグ・テスト系のTopic

§ 例外を握りつぶさないtry・except・else・finallyの使い分け

§ 独自例外とraise fromで「何に失敗したか」を伝える

§ breakpointとpdbでエラー直前の変数を調べる

§ DeprecationWarningを見逃さず、警告を必要な範囲だけ制御する

§ pytestで正常系と異常系の自動テストを始める

§ pytestのparametrizeで境界値と入力パターンをまとめて検証する

§ fixtureとtmp_pathで実データを壊さずファイル処理をテストする

§ monkeypatchで環境変数や外部依存を切り替えてテストする

§ mockが効かない原因はどこ?patchする場所とautospecを理解する

§ doctestで説明文のコード例が古くなるのを防ぐ

 pandas・表データ処理系のTopic

§ pandasで試料IDと欠測整数を壊さず読む

§ 数値に変換できないセルだけを一覧にする

§ 重複行と重複インデックスを見分ける

§ mergeで行数が増える原因を調べる

§ 群ごとの集計値を元の行に戻す方法

§ 横持ち測定表を縦持ちへ安全に変換する

§ 日付列の誤変換と時差の混在を検出する

§ 列を代入したのに値がずれる理由

§ pandasの連鎖代入をlocで書き直す

§ 大きなCSVを分割して正しく集計する

 研究データ管理系のTopic

§ 乱数実験の再現と系列分割を両立する

§ 測定配列を形と型を保って保存する

§ 巨大なNumPy配列を必要な範囲だけ読む

 性能・メモリ・並行処理系のTopic

§ cProfileで遅い処理を探す:tottimeとcumtimeの読み方

§ tracemallocでメモリが増えた場所を調べる

§ スレッドとプロセスはどう選ぶ?待ち時間と計算負荷で考える

§ ThreadPoolExecutorで結果と失敗を取りこぼさず回収する

§ ProcessPoolExecutorが動かないとき:mainガード・pickle・起動方式

§ asyncioで同時実行数を制限する:Semaphoreと待ち合わせ

§ asyncioの時間切れとキャンセルで後始末を漏らさない

§ queue.Queueで作業待ちをためすぎない生産者・消費者処理

§ 共有変数の更新がずれる原因は?Lockで競合を防ぐ

 Web・データベース・データ交換系のTopic

§ Requestsで通信の失敗を扱う:timeout・HTTPエラー・JSON解析

§ APIをむやみに再試行しない:回数制限・待ち時間・冪等性

§ SQLiteにデータを保存・検索する:SQLはプレースホルダーで渡す

§ SQLiteの途中失敗で半端な更新を残さない:commitとrollback

§ JSONで保存できない値をどう扱う?日時・数値・日本語の受け渡し

 その他のTopic

§ バージョンを確認する方法
・sysモジュールを利用する方法
・コマンドラインで確認する方法
§ プログラムの実行時間を計測する方法
・timeモジュールを利用する方法
§ プログラムを途中で終了させる方法
・sysモジュールを利用する方法
・実行中のプログラムを強制終了する方法
§ 日本語を使う
・文字コードとencode/decode
・図中で日本語フォントを利用する
・Atomエディタ上で日本語を出力する
§ 文字コードの変換まとめ
・文字コードとencode/decode
・文字列⇔アスキーコードの変換
・シーザー暗号を作成する
§ イテラブルオブジェクトとは
・イテラブルオブジェクト
・使用例