Python Advent Calendar 2025 1日目
こんにちは、@Seine_A_Shintani です。
この記事は Python Advent Calendar 2025 の 1 日目として、Pythonを
- 「プログラミング言語そのもの」としてどう魅力的か
- 特に 科学計算・教育・研究 の現場でどう活きるか
という観点から紹介します。
「Pythonはなんとなく便利そうだけど、どこがそんなに良いの?」という学生等に見せられるような内容を目指しました。
Pythonという言語のざっくりした特徴
Pythonはよく「読みやすい汎用言語」「バッテリー同梱」などと形容されます。具体的には、次のような特徴があります。
- インデントで構造を表す、シンプルで読みやすい構文
- 動的型付けだが、型ヒント(type hints)による静的チェックも活用可能
- 手続き型・オブジェクト指向・関数型風など、複数のパラダイムをサポート
- 豊富な標準ライブラリ + 巨大なパッケージエコシステム(PyPI)
- 対話的実行(REPL)や Jupyter Notebook との相性が良く、教育・研究用途に最適
まずはごく簡単な Python コードを眺めてみます。
def mean(xs: list[float]) -> float:
"""リストの平均値を求める簡単な関数"""
return sum(xs) / len(xs)
data = [1.0, 2.5, 3.5, 4.0]
print(f"data = {data}")
print(f"mean = {mean(data):.3f}")
- 関数定義は
def、ブロックは{}ではなく インデント で表現 - 型ヒント
xs: list[float] -> floatにより、可読性と静的解析のしやすさを両立 - f文字列(f-string)でフォーマットを直感的に記述
コード量に対して表現力が高く、初学者にも説明しやすい構文です。
読みやすさを支える構文とスタイル
インデントで構造を表す
Pythonでは
- if / for / while / 関数・クラス定義 などの「ブロック」は インデントのレベル によって表現
- セミコロンや
{}をほとんど見かけません
def fizzbuzz(n: int) -> None:
for i in range(1, n + 1):
if i % 15 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
fizzbuzz(20)
C系言語に比べて記号が少なく、「処理の流れ」が目に入りやすいのが特徴です。
PEP 8(公式のスタイルガイド)に従った書き方をすれば、他人のコードも驚くほど読みやすくなります。
データ構造や内包表記で「数式に近い」書き方
リスト内包表記は、数学の集合記法にかなり近い感覚で書けます。
# 1〜10 までの偶数の2乗をリストにする
squares_of_even = [x**2 for x in range(1, 11) if x % 2 == 0]
print(squares_of_even) # [4, 16, 36, 64, 100]
数理的な処理やデータ変換を「コードとして」ではなく「変形の定義」として読めるのは、理工系の学生にも直感的です。
型ヒントとデータクラスで「構造」を明示する
Pythonは動的型付け言語ですが、近年は型ヒントが充実し、静的解析ツール(mypy, pyright など)と組み合わせることで、大規模開発にも十分耐えられるようになっています。
例えば、物理の粒子を表すクラスを考えてみます。
from dataclasses import dataclass
@dataclass
class Particle:
mass: float # 質量
position: float # 1次元位置
velocity: float = 0 # 初期速度(デフォルト0)
def kinetic_energy(self) -> float:
return 0.5 * self.mass * self.velocity**2
p = Particle(mass=1.0, position=0.0, velocity=3.0)
print(p) # Particle(mass=1.0, position=0.0, velocity=3.0)
print(f"K = {p.kinetic_energy():.2f}")
-
@dataclassで、コンストラクタや__repr__などを自動生成 - 型ヒントにより、属性の意味が一目でわかる
- 教育の現場では「物理モデルをそのままクラスとして書く」と説明しやすいです
対話的実行と Jupyter の強み
Pythonは対話的実行がとてもやりやすい言語です。
-
pythonやipythonを起動して、1行ずつ実行して試行錯誤 - Jupyter Notebook / JupyterLab を使えば
- 数式・コード・図・説明文を1つのノートにまとめられる
- 授業資料・実験ノート・研究メモとしてそのまま利用可能
例えば、数値積分の課題や簡単な微分方程式の演習を Notebook 上で行えば、
学生の「手で動かして理解する」感覚を引き出しやすくなります。
科学計算の入口:NumPy
本題の sympy / SciPy の前に、科学計算に必須の NumPy を簡単に触れておきます。
import numpy as np
# 0〜1の区間を100分割
x = np.linspace(0, 1, 100)
# y = sin(2πx) の値
y = np.sin(2 * np.pi * x)
print(x.shape, y.shape) # (100,) (100,)
- 多次元配列(
ndarray)を中心に、高速なベクトル演算を提供 - C / Fortran 由来のライブラリを内部で利用しているため、純粋な Python よりずっと高速
研究・教育現場では「Fortran で書いていた数値計算コードを、試作版としてまず Python + NumPy で書いて検証」という使い方もよく見かけます。
記号計算ライブラリ sympy:数式を「そのまま」扱う
微分・積分・極限・方程式の解
sympy は 記号計算(symbolic computation) のライブラリで、数式そのものをオブジェクトとして扱えます。
import sympy as sp
x = sp.symbols('x')
f = sp.exp(-x**2)
df = sp.diff(f, x) # 微分
F = sp.integrate(f, (x, -sp.oo, sp.oo)) # 積分
limit_val = sp.limit((sp.sin(x) / x), x, 0) # 極限
print("f(x) =", f)
print("f'(x) =", df)
print("∫ f dx =", F)
print("lim sinx/x =", limit_val)
- ガウス積分
∫ exp(-x^2) dxの結果としてsqrt(pi)が返ってくるのを見せるだけでも、学生のテンションが上がります - 微分・積分・極限・級数展開など、解析学の定番処理を簡単にデモできます
微分方程式を解く:物理の単振動の例
物理で頻出する「質点の単振動」を例に、2階常微分方程式を解かせてみます。
import sympy as sp
t = sp.symbols('t')
m, k = sp.symbols('m k', positive=True) # 質量とばね定数
x = sp.Function('x')
# 運動方程式: m x''(t) + k x(t) = 0
ode = sp.Eq(m * sp.diff(x(t), t, t) + k * x(t), 0)
solution = sp.dsolve(ode)
print("解: ", solution)
dsolve は解析解を返してくれるので、
- 「運動方程式 → 一般解 → 初期条件を入れて具体解」という一連の流れ
- 解の形(正弦波)と、パラメータ
m,kの役割
を、紙の数式とコードを並べて説明できます。
数学の授業・演習での使いどころ
- 微積分学:導関数・積分・級数展開の確認
- 線形代数:固有値・固有ベクトル、行列指数関数
- 常微分方程式:解析解 + 数値解の比較
- 物理数学:ラプラス変換・フーリエ変換の具体例
数式処理システム(CAS)を導入するほどではないが、
「学生に 手元のノートPCで 実験させたい」ケースに sympy はちょうどよい選択肢です。
SciPyで数値解を求める:ODE・積分・最適化
sympy が解析的な解を返してくれるのに対して、SciPy は数値解析のためのライブラリです。
代表的な機能:
-
scipy.integrate:常微分方程式・数値積分 -
scipy.optimize:方程式の数値解・最適化 -
scipy.linalg:線形代数ルーチン - その他、信号処理・統計・補間など
ここでは、簡単な ODE の数値解を例にします。
単振動の数値解
先ほどの単振動の運動方程式を、今度は数値的に解きます。
import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
def harmonic_oscillator(t, y, m=1.0, k=1.0):
x, v = y # 位置 x, 速度 v
dxdt = v
dvdt = -(k / m) * x
return [dxdt, dvdt]
t_span = (0.0, 20.0)
y0 = [1.0, 0.0] # 初期条件: x(0)=1, v(0)=0
t_eval = np.linspace(*t_span, 1000)
sol = solve_ivp(
fun=harmonic_oscillator,
t_span=t_span,
y0=y0,
t_eval=t_eval,
)
x = sol.y[0] # 位置
plt.plot(sol.t, x)
plt.xlabel("t")
plt.ylabel("x(t)")
plt.title("Harmonic Oscillator (SciPy)")
plt.grid(True)
plt.show()
この例だけで、学生に次のような話ができます。
- 連続時間の微分方程式を、数値的にどう扱うか
-
solve_ivpのステップ幅や精度パラメータと解の安定性 - 解析解(cos波)と数値解を重ねて比較する演習
数値積分で sympy と 比較する
sympy で解析解がわかっている積分を、SciPy で数値的に評価して比較するのも良い教材になります。
import numpy as np
from scipy import integrate
import sympy as sp
x = sp.symbols('x')
f_sym = sp.exp(-x**2)
# sympy による解析解
F_exact = sp.integrate(f_sym, (x, -sp.oo, sp.oo))
print("sympy: ∫ exp(-x^2) dx =", F_exact)
# SciPy による数値積分
def f_numeric(x):
return np.exp(-x**2)
val, err = integrate.quad(f_numeric, -np.inf, np.inf)
print("SciPy: ", val, "+/-", err)
- symbolic vs numeric の違い
- 数値積分の誤差評価
- double precision の限界
などの話題に自然につなげられます。
sympy と SciPy / NumPy をつなぐ:lambdify
sympy の式をそのまま SciPy / NumPy で使える「橋渡し」として、lambdify が非常に便利です。
import sympy as sp
import numpy as np
import matplotlib.pyplot as plt
# 記号式で関数を定義
x = sp.symbols('x')
f_sym = sp.sin(x) * sp.exp(-x / 5)
# NumPy 用の関数に変換
f = sp.lambdify(x, f_sym, modules="numpy")
xs = np.linspace(0, 20, 400)
ys = f(xs)
plt.plot(xs, ys)
plt.xlabel("x")
plt.ylabel("f(x)")
plt.title("sympy → NumPy への橋渡し")
plt.grid(True)
plt.show()
- 解析的な計算(微分・積分・極限)を sympy で行い、
- 数値評価・プロット・シミュレーションは NumPy / SciPy / Matplotlib に渡す
という ワークフロー全体を Python だけで完結 させられるのが強みです。
教育・研究立場から見た Python の魅力
理系大学教員という立場から見ると、Python は次のような点で非常に扱いやすい言語です。
- 1年生の「はじめてのプログラミング」から、卒論・修論レベルの研究まで連続的に使える
- OS / マシンに依存しにくく、学生の手元の PC(Windows / macOS / Linux)でほぼ同じコードが動く
- Jupyter Notebook により、
- 課題・実験手順・コード・考察を1ファイルにまとめられる
- GitHub Classroom などと組み合わせて、提出・フィードバックのワークフローを構築しやすい
- sympy / SciPy / pandas / matplotlib などを組み合わせることで、
- 「紙と鉛筆でやるべき部分」と
- 「計算機に任せるべき部分」
を自然に分担させる授業設計がしやすい
さらに、Python は
- Webアプリ(Flask / FastAPI / Django)
- 機械学習・深層学習(scikit-learn / PyTorch / TensorFlow)
- 自動化スクリプト・データ前処理
などにもそのままつながります。
学生にとっては
「授業で使った言語が、そのまま将来の研究・開発でも使える」
というのは、大きなモチベーションにつながります。
おわりに
1日目の記事では、
- Python の言語としての特徴(読みやすさ、型ヒント、対話性)
- 科学計算の文脈での sympy / SciPy の役割
- 教育・研究現場での活用イメージ
をざっくりと紹介しました。
今後の Advent Calendar では、
- pandas や matplotlib を使ったデータ解析
- もう少し実践的な数値シミュレーション
- 研究室での運用例や授業設計の具体例
などが続いていくと、Python で広がる世界をより立体的に感じられると思います。
質問や「うちの研究室ではこう使っている」といった話も、コメント等で共有していただけると嬉しいです。
それでは、良い Python Advent を!

