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

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

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

(管理人:blocks)

● Python3 Tips集:目次 ●

記事タイトルを押すと目次が開きます。「記事を読む」で記事の冒頭へ、目次の項目でその見出しへ移動できます。

 Pythonことはじめ

Pythonことはじめ
§(Linux)ローカルにPythonを導入する
pipで入れたのにimportできないときのトラブルシューティング
実行中のPythonとインストール先の食い違いを診断する
別のPCで環境を再現する:依存関係の記録と入れ直し
json.pyという名前でimportが壊れる?モジュール名の衝突を調べる
importしただけで処理が走るのを防ぐ:__main__の使い分け
複数の.pyに分けたらimportエラー:小さなパッケージに整理する
循環importをほどく:共通部分の切り出しで依存関係を整える
インストール後も同梱データを読めるようにする:importlib.resources
自作ライブラリを別プロジェクトから使う:editable installの始め方
追加ライブラリがあるときだけ機能を有効にする:任意依存の扱い
import名とインストール名が違う?パッケージ情報を正しく確認する

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

 出力系のTopic

printで出力のformatを指定する
printで桁合わせ・ゼロ埋め・文字寄せする
特殊文字( # とか % とか ” とか)を出力する
改行しないでprintする方法
日本語を使う
matplotlibでグラフを作成する方法【総まとめ】
3Dの曲線を描画する(ローレンツアトラクタの例)
上下幅が違うエラーバーを描く
ゼロや負の値があるグラフの軸を選ぶ
複数のヒートマップで同じ色を同じ値にする
欠測区間を線でつながないグラフにする
画像の上下反転と半画素ずれを直す
重すぎる論文用PDF図を軽くする
大量の図を保存するときのメモリ増加を防ぐ

 演算系のTopic

四則計算と剰余(余り)の計算
べき乗と平方根・累乗根の計算
実数↔整数の変換
複素数型変数の扱い方
記数法の変換(10進数⇔n進数)
階乗・二重階乗の計算
時刻差分の計算
数値的に求めた方程式の根を検証する
不等間隔の測定値を台形則で積分する
微分方程式を条件到達で停止する
非線形フィットの失敗を残差から診断する
補間曲線の行き過ぎと範囲外推定を防ぐ
信号のピークを高さだけで拾わない
FFTの横軸と振幅のずれを直す
ゼロが多い行列を疎配列で組み立てる
連立方程式の解を残差と条件数で点検する
近くの測定点を距離の上限付きで探す

 文字列系のTopic

文字列同士を比較する方法
文字列の部分一致・検索
数値⇔文字列の型変換
文字列が数値かどうか判定する方法
文字列を連結・結合する方法
文字列の全角英数を半角にする方法
測定ログを列に分ける:名前付きグループで正規表現を読む
IDの形式を厳密にチェックする:fullmatchとASCII文字の指定
検索語に記号があっても壊れない:re.escapeで複数語を検索する
文章から測定値と単位を取り出す:符号・小数・指数表記に対応する
一致した内容で置換を変える:re.subに関数を渡す
設定ファイルの変更箇所を差分で出す:difflib.unified_diff
複数行のブロックを取り出す:MULTILINEとDOTALLの違い
文字列のリスト表記をデータに戻す:literal_evalの使いどころ
引用符の中の空白を残して分割する:shlexでトークン化
HTMLからリンク一覧を取り出す:HTMLParserの小さな使い方

 リスト(配列)系のTopic

リストの作成方法
リストへの要素の追加
リストの要素数を数える
リストの要素の入れ替え
リストを丸ごと入れ替える
listとarrayとNumPy配列の違い
NumPy配列の演算処理はなぜ速いのか
全要素が0の任意長のリストを作成する方法
NumPyのshapeが合わないときの直し方
切り出した配列を変えると元も変わる理由
NumPyの整数計算が桁あふれする原因
条件抽出で配列が1次元になるのを防ぐ
reshapeとtransposeでデータの並びを壊さない
NaNを除いた平均に有効データ数を添える
計算結果の一致を許容誤差で確かめる
同じ添字への足し込みが抜ける問題を直す
測定配列をつなぐか重ねるかを選ぶ
ゼロ除算する要素だけ計算から外す

 ファイル処理系のTopic

ファイルの読み書き
文字列や行の要素をsplit関数で取得する方法のまとめ
csvファイルの処理
実行する場所でファイルが見つからない:相対パスの基準をそろえる
フォルダー内の対象ファイルだけ集める:globと除外条件
file2よりfile10が先に来る?番号付きファイルを自然順に並べる
フォルダーのファイル台帳を作る:パス・サイズ・更新日時の収集
保存途中で元ファイルを壊さない:一時ファイルから置き換える
作業用ファイルを残さない:TemporaryDirectoryで一時領域を管理する
大量ファイルの名前を安全に変える:事前確認と衝突検出
巨大なテキストを丸ごと読まない:行単位で抽出・集計する
必要なファイルだけ複製する:shutilで作業フォルダーをコピー
保存先が指定フォルダーの外に出ないようにする:パスの検証

 ユーティリティ系のTopic

PDFを結合・分割・回転する方法
sympyで数式の計算を自動化する
Sympyで添え字付き文字を一気に定義する方法
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

 性能・メモリ・並行処理系の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