31
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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は対話的実行がとてもやりやすい言語です。

  • pythonipython を起動して、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()

Harmonic Oscillator (SciPy).png

この例だけで、学生に次のような話ができます。

  • 連続時間の微分方程式を、数値的にどう扱うか
  • 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 bridge.png

  • 解析的な計算(微分・積分・極限)を 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 を!

31
10
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?