これは、筆者の「2025振り返り用ひとりアドカレ」記事の一つです。
はじめに
これは誰しもそうでしょうが、日々の中で差し込みの仕事や緊急対応を要するタスクなどが発生してスケジュール通りに進む状況は稀です。
筆者は普段 React, Next.js といったフロントエンドを主軸にしていますが、日々の業務においてずっとイレギュラー対応を加味したバッファ駆動なスケジュール進行がしたいと思っていました。
余剰時間・余裕(バッファ)を作ることを目的にした働き方をすれば少しは改善されるかもと期待したのです。
そこで、2025年は重い腰を上げて業務効率化を絶対目標にPythonを学ぶことにしました。
本記事は「フロントエンド側の人間が 1からPythonを学んでみて」というテーマのもと、以下の内容についてシリーズものとして書いていきたいと思います。
取り上げていく内容
- 筆者なりの学習ロードマップ
- 筆者がPython学習を通じて得た知識・情報
- 仮想環境・パッケージインストール
- データ構造(リスト・タプル・集合・辞書)
- オブジェクト(class)
- ループ処理・条件分岐
- 内包表記 / ラムダ関数など Python 独自の機能
- 関数定義・引数指定
- 例外処理
- 便利なメソッド・関数の紹介
- 便利なライブラリの紹介
- フロントエンド系の言語やライブラリ・フレームワークとの違いや共通性
対象読者
- 業務効率化を願うビジネスパーソン
- バックエンド側に興味があるフロントエンド側の方々
- バックエンド側とフロントエンド側の言語における違いや共通性が知りたい方々
- Pythonを学び始めた方々
- Pythonを学ぼうとしているフロントエンドエンジニアの方々
わざわざ学ばなくても、AI(LLM)に任せれば良くね?
筆者がPython学習のモチベーションとしたのは「業務効率化を絶対目標」とすることです。
正直これはAIで簡単に行える世界になりつつありますが、筆者はAIの成果物を正しく活用するにはチェックできるだけの基礎力が大事だと思っています。
そのため遠回りに見えつつもPythonを体系的にじっくり学んでいくルートを選びました。
まずは筆者なりの学習ロードマップについて書いていきますが飛ばしたい方は「こちらへ」どうぞ。
筆者なりの学習ロードマップ
筆者はHTML, CSS, JavaScript / TypeScriptをはじめ、React, Next.js などフロントエンド側の知識や情報をある程度備えた状態でPython学習を始めました。
ですから、いまから説明する内容は全くの未経験という方には参考にならないかもしれませんが、考え方やところどころは参考になるのではと思っています。
まずは公式情報
何はともあれ何でも一番初めは公式情報です。
しかし、惜しむらくは公式情報が中々分かりづらい場合も往々にしてあることです。
そんな時は書籍か動画学習に頼りましょう。
書籍 or 動画学習どっちを選ぶ?
これは個人の合う合わないで選ぶのが良いと思います。
筆者は「すぐにパッと開いて確認したいタイプ」で、知りたい内容を探す時に「大体このあたりのページにあったはず」といったような使い方をするので書籍派です。
大事なのは書籍であれ、動画学習であれ、体系的に学べるかどうかだと思っています。
インターネットには数多の情報がありますが「点ばかり集まっても線になって繋がらない」と理解には及びません。
学び始めの頃は「何が分からないのか分からない」という状況だと思うので、体系的に学んでいくのはとても大事だと思います。
ちなみに、筆者が学習に用いた書籍は以下です。
発刊から数年経っていてページ数も多いのですが、筆者のじっくり学ぶという学習スタンスに合っていると感じたので購入しました。
結論から言うと、発刊から時が経っていることもあって現在のPython開発とは少し乖離があったり、自分で調べたりしなければならない部分もいくつかありました。
とはいえ、全くの未経験者を対象に書かれているので、すごく丁寧で分かりやすかったです。
未経験者にもおススメしたい書籍です。
Pythonに触れる
Pythonをダウンロード
node.js をはじめ、React, Next.js と同様にPythonもインストールして初めて利用できる(※)ようになります。
※筆者は windows なのでインストールする必要がありましたが、Mac / Linux だと最初から入っています
開発環境を整える(環境構築)
VSCodeを使っている前提で、必須及び便利な VSCode 拡張機能を紹介します。
※Path AutocompleteはPythonに直接的な関係はありません
Python(必須)
-
Pythonをインストールしたら付随される拡張機能たち
Pylance,Python Debugger
Ruff
Linter+Formatter機能を提供してくれます。一つの拡張機能でこれを実現してくれるのは強力ですね!
設定方法含めて詳細は以下の記事が分かりやすいです。
-
Linter(リンター)
プロジェクトにおけるコード規約や命名規則、構文チェックなど安全・堅実な開発実現をサポートしてくれるツール -
Formatter(※フロントエンドでいうPrettier)
インデント位置調整や末尾のセミコロン付与などコード整形を行い、可読性を高めてくれるツール
Mypy Type Checker(mypy)
動的型付け言語のPythonに型を付与してくれます。
「動的型付け」とはランタイム(実行)時に初めて型が付くことです。
JavaやTypeScriptは「静的型付け」で事前に型を付けておいて型エラーを検知できますが、動的型付けの場合はランタイム(実行)時にエラーとなってしまいます。
事前に型エラーで問題を把握できると本番環境で予期せぬエラーに遭遇する要因を減らせるので「静的型付け」の方が安全な開発を行えます。
筆者は使用していないが主流になりつつあるツール
uv
これはPythonの仮想環境構築からパッケージマネージャーの役割まで担う上に高速だというツールです。
筆者は学び始めということもあってPython標準を意識したので採用することはありませんでした。
仮想環境については後述しますが、調べると筆者のような小~中規模程度だとPython標準のvenv(とrequirements.txt)で十分ということだったので、そういった点でも採用を見送りました。
Python基礎編
Pythonには独特なルールがいくつかあります。
最たる例が「オフサイドルール」です。
(※Pythonに限らず Haskell といった言語でも採用されている)
オフサイドルールとは、インデントやスペースが単なるコード整形ではなく「コードの意図や構造を表現」する仕組みを指します。
つまり以下コードの初めのコード例のような記述はPythonではエラーとなります。
# エラーになるコード(※内部処理がインデントされていない)
for elm in iterable:
print(f"これは、{len(iterable)}ある内の一つ「{elm}」です。")
# 正しいコード
for elm in iterable:
print(f"これは、{len(iterable)}ある内の一つ「{elm}」です。")
コード例にあるf"文章"は f文字列 といいます。
これは JavaScript でいうテンプレートリテラル(バックティック)の記法と似たものです。
{}の中に変数や式、処理をそのまま記述して(その結果を反映した)文字列を表現できます。
あと、Pythonでは文の末尾にセミコロンは原則不要です。
// TypeScriptの場合
const helloWorld: string = "hello world";
// Pythonの場合
hello_world: str = "hello world"
このようにPythonでは記述に関してある種の制約があります。
しかし、そのお陰で自分たちのコーディングガイドラインを別途作成する必要がないので楽は楽ですよね。
インデントの字下げ数(例:2文字でも、4文字でも)や変数の命名方法などは開発者が自由にしてもPythonの構文に準拠してさえいれば機能します。
とはいえ、自由気ままにして良いわけではなく、Pythonでは「PEP8」というコーディングガイドラインが用意されています。
例えば「字下げ数は4文字にする」とか「関数宣言箇所の改行は2行入る」とか色々です。
※PEP8: Python コミュニティが定めたコードスタイルの推奨ガイドライン
他にも、Pythonは Java など一部の言語にあるガベージコレクションを備えています。
- ガベージコレクション
使用していない(変数や)データの参照を削除してメモリを解放することでメモリリークを防止する機能
フロントエンド側から見たPythonの独自性
オフサイドルールの他にもフロントエンド側では見たことのない世界がPythonには広がっていました。
インタプリタ
コンパイラ方式(プログラムのソースコードを一度にすべて機械語に変換して実行する)とは異なり、Pythonは実行時に逐次処理していくインタプリタ型の言語です。
-
Python対話モード(REPL)の終了方法
- Windows:
Ctrl + Z→Enter - Mac/Linux:
Ctrl + D - 共通:
exit()またはquit()を入力
※
Ctrl + Cは実行中の処理を中断する際に使用 - Windows:
コマンドラインからインタプリタを起動して実行する
フロントエンドのindex.htmlなどはブラウザのアドレスバーにペーストしたり、JavaScriptはブラウザの開発者ツールを開いてConsoleパネルで実行できたりなどブラウザ側で簡単に確認・実行できます。
他方、Python はスクリプト言語であり、python ファイル名.pyのようにコマンドラインからインタプリタを起動して実行するのが基本的な使い方です。
ただし、Pythonの Webフレームワーク(Flask / Django / FastAPI など)を使うと、Python で作った処理をHTTPサーバーとして起動し、ブラウザから確認することは可能です。
Pythonファイルの実行
以下のPythonプロジェクトがあるとします。
my-python
|-utils
|-sample.py
|-libs
上記構成にあるsample.pyを実行したいと思います。
Pythonプロジェクト(my-python)をターミナル(コマンドプロンプト)で実行するか、VSCodeで開きます。
# 1. ターミナル(コマンドプロンプト)で実行する場合
# デスクトップにPythonプロジェクト(my-python)があると想定
cd desktop
cd my-python
# 2. VSCode でPythonプロジェクト(my-python)を開いた場合
# および先ほど(1.)の手順の続き
# 実行したいファイルのあるディレクトリへ移動
cd utils
# Pythonファイルを実行
python sample.py
または以下のように記述
python utils/sample.py
上記のようにPythonでは、コマンドラインで明示的に指定することで処理を実行(挙動確認)できます。
nullはNone
JavaScriptでいうnullは、PythonではNoneになります。
また、JavaScript には「存在しない変数を参照するとundefinedになる」という挙動がありますが、Python では存在しない名前(変数)を参照するとNameError(未定義名エラー)が発生します。
つまり「undefinedに相当する値は Python にはない」と思っておいて問題ありません。
Pythonでの型定義について
# TypeScript `const theStr: string`
theStr: str = 'hoge'
# TypeScript `const theNum: number`
theNum: int = 0
# TypeScript `const theStrOrNum: string | number`
theStrOrNum: str | int = 100
# TypeScript `const theBool: boolean`
theBool: bool = True # または False
# TypeScript `const theAry_str: string[]`
theAry_str: list[str] = ['hoge', 'foo', 'bar']
# TypeScript `const theAry_int: number[]`
theAry_int: list[int] = [10, 100]
# TypeScript `const theAry_StrOrInt: (string | number)[]`
theAry_StrOrInt: list[str | int] = [10, "hoge", 100, "foo", True]
# True は 1 として扱われる(bool は int としても扱えるため)が、
# 明示的に 1 に置き換えた方がわかりやすい
Python には TypeScript にないfloatという型があります。
floatはPHPのそれと同じく浮動小数点数を指します。
例えば、3.14などはfloat型(浮動小数点数)です。
変数について
Pythonでは、JavaScriptでいう変数宣言(letやconst)を用いずに変数を作成するためvarのように再宣言も再代入(再定義)も可能な仕様になっています。
例えば、定数を作成する方法はなく、普通の変数を使用するため、変更(再代入)しようと思えばできてしまうのです。
命名規則については以下のようになっています。
- 変数や関数、モジュール名・パッケージ名
単語の区切りは基本的にスネークケース(_:アンダースコア)
hoge_foo_bar
- クラスの命名
パスカルケース(アッパーキャメルケース)
HogeFooBar
- 定数
大文字+スネークケース
HOGE_FOO_BAR
Pythonでは、変数は明示的に管理・把握しやすくするためにあるもので、実際は値ごとに付与される参照値(メモリアドレス)に紐づくオブジェクトで管理される言語仕様になっています。
つまり、変数は値を格納する箱ではなく、オブジェクトに付けられた『名札』のようなものです。
※参照値(メモリアドレス / オブジェクトID)の確認はid(変数)で行える。
変数が全てグローバルになるなんて管理が大変じゃない?
global / nonlocalを活用する
Pythonでは、スコープ内に同名の変数がある場合はスコープ内のものが優先(適用)されます。
しかし、global宣言子を用いることでグローバル変数に代入できるようになるのです。
def good_morning():
global txt
txt = "good morning"
print(f"good_morning: {txt}")
txt = "good afternoon"
good_morning()
print(txt)
# global 無効時の出力結果
# good_morning: good morning
# good afternoon # 関数実行時前の代入が有効になっている
# global 有効時の出力結果
# good_morning: good morning
# good morning
関数内の関数で同名の変数を扱うかつ上記globalのような振る舞いを行いたい場合はnonlocalを用います。
def good_morning_afternoon():
def good_afternoon():
nonlocal good_afternoon_txt
good_afternoon_txt = "good afternoon"
print(f"good_afternoon: {good_afternoon_txt}")
good_afternoon_txt = "hello world."
good_afternoon()
print(f"good_morning_afternoon: {good_afternoon_txt}")
good_morning_afternoon()
# nonlocal 無効時の出力結果
# good_afternoon: good afternoon
# good_morning_afternoon: hello world. # 関数実行時前の代入が有効になっている
# nonlocal 有効時の出力結果
# good_afternoon: good afternoon
# good_morning_afternoon: good afternoon
仮想環境
フロントエンド開発でもそうですが、何でもかんでもnpmなどをグローバルインストールしていたらverの競合が起きたり、PCのパフォーマンスに影響が出たりします。
これはPythonに限らずweb開発では、特定のプロジェクトでは専用または特化した環境を用意するのが一般的です。
筆者の失敗
筆者は「Pythonでは仮想環境を使わない場合、pip install パッケージ / モジュール名はグローバル環境にインストールするという仕様」を知らなかったので、初めての開発では使用していたpipライブラリが全てグローバルインストールされていました。
フロントエンド開発における npm installはプロジェクトスコープ なので明示的なコマンドを使用しない限りグローバルインストールされる心配はありません。
しかし、Pythonでは前述通り仮想環境を用意していない場合、pip install パッケージ / モジュール名はグローバル環境にインストールするという仕様なので、全てがグローバルインストールされていました。
ちなみに、アンインストールはnpm同様以下のように行えます。
pip uninstall パッケージ / モジュール名
仮想環境に関しては、Python標準のvenvというものがあります。
仮想環境構築は情報量が多くなるのでまた別記事にしたいと思います。
このように(Pythonだけではないものの)環境構築が面倒な場合もあります。
そこでPythonを手軽に実行できる環境がいくつか用意されています。
例えば、AnacondaやJupyter Notebook, Google Colabなどがあります。
※Anacondaは一定以上の規模の企業で利用する場合に、ライセンス料がかかってしまうので注意
さいごに
本記事では初回として主にPythonの概要や基礎理解、環境構築などに触れてきました。
次の記事では、仮想環境・パッケージインストールについて書いていきたいと思います。
ここまで読んでいただき、ありがとうございました。
