【Python入門】8章のまとめ

 ここでは「8章のまとめ」として、8章で解説した主なトピックを総覧します。内容を理解しておくと、次の演習プログラムにスムーズに取り組めるでしょう。

1.例外処理

1.1.例外処理とは

 Pythonなどのプログラミング言語で、予期しないエラー(例外)が発生したときに、プログラムを安全に終了させたり、エラーを回避したりするための仕組みです。
 例外処理を使うことで、エラーが起きてもプログラム全体がクラッシュするのを防ぎ、原因を特定しやすくしたり復旧処理を行ったりできます。

1.2.例外処理を使わないエラー処理

 例外処理を使わない方法として、関数の戻り値でエラーを表す・エラーコードを返すなどのやり方があります。
しかし、大規模なプログラムでは戻り値のチェック漏れやネストが深くなる問題があり、可読性・保守性が低下しがちです。

比較項目例外処理を使わない方法例外処理を使う方法
実装例関数がエラーコードを返却し、呼び出し元で判定try-except ブロックを用いて例外を捕捉
可読性エラーコードの判定が増え、複雑になる。エラー時の処理を明示的に切り出せるため読みやすい。
拡張性呼び出し元の判定処理を都度修正する必要がある。例外を追加・分類しやすく、大規模開発に向いている。

1.3.try文とexcept節の定義

Pythonの例外処理は次のような構文を使います。

try:
    # エラーが起こりそうな処理
except SomeError:
    # エラー発生時の処理
  • except の後に捕捉したい例外クラス名を指定するのが基本です。
  • 発生した例外タイプに合致したexceptブロックが実行されます。

1.4.様々なexcept節の定義

  • 複数のexcept節を並べて、異なる種類の例外ごとに処理を分けることができます。
  • 例外クラスをタプルでまとめて捕捉することも可能です。
  • except Exception as e: のようにして例外オブジェクトを変数に受け取ることで、より詳細なエラー情報を取得できます。

2.例外処理の構造と応用

2.1.try文とfinally節

  • finally:節は例外の有無にかかわらず、最後に必ず実行したい処理(リソースの解放など)を記述するのに使います。
  • たとえexceptで捕捉されない例外が起きても、finally: 節の処理は実行されます。

2.2.try文とelse節

  • else:節はtryブロック内で“例外が発生しなかった場合”にのみ実行されるコードを記述します。
  • 例:ファイルを正常に読み込めたらその内容を処理し、エラーが起こればexceptへ、どちらでも最後に後処理をする場合はfinallyへ、というように明確に区分けできます。

2.3.例外を発生させるraise文

  • raise 文を使うと、任意のタイミングで意図的に例外を発生させられます。
  • 例えば、渡された引数が想定外の値の場合に強制的に例外を投げる、といった使い方が一般的です。

3.内包表記

3.1.リストの内包表記

  • リストを生成する際にfor文とifを使った処理を1行で書ける便利な構文です。
  • 例:[x * 2 for x in range(5)][0, 2, 4, 6, 8]

3.2.内包表記で多重ループさせる

リスト内包表記にforを複数並べると、多重ループ相当の処理が可能です。

[(x, y) for x in range(2) for y in range(3)]
# 結果: [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]

3.3.内包表記とif

内包表記内で条件式を指定することで、フィルタリングを同時に行うことができます。

[x for x in range(5) if x % 2 == 0]  # [0, 2, 4]

3.4.内包表記と条件式

if-elseを内包表記に組み込むことで、条件によって異なる値を追加できます。

["偶数" if x % 2 == 0 else "奇数" for x in range(5)]
# ["偶数", "奇数", "偶数", "奇数", "偶数"]

4.ジェネレータ

4.1.ジェネレータ式

 大量の要素を一度にリスト化せず「必要なタイミングで値を生成」したいときに便利です。リスト内包表記の []() に変えるだけでジェネレータ式となります。

gen = (x * 2 for x in range(5))

4.2.ジェネレータ関数とyield文

  • 関数内で yield を使うと、イテレータ(ジェネレータ)を返す関数を定義できます。
  • 一度にすべてのデータをメモリに載せる必要がなく、大量データの取り扱いがしやすくなります。

5.その他の機能

5.1.ラムダ式(関数型プログラミング)

  • 無名関数(関数名を持たない)をその場で定義するための構文です。
  • 簡易的な関数として、フィルタリングやマップ処理などに頻繁に使われます。
add = lambda x, y: x + y
print(add(2, 3))  # 5
5.2.ソートのキーにラムダ式を指定する

 sorted()list.sort() の引数 key にラムダ式を渡すことで、ソート基準を柔軟に指定できます。

data = ["apple", "banana", "cherry"]
sorted_data = sorted(data, key=lambda x: len(x))
# ["apple", "banana", "cherry"] -> ["apple", "banana", "cherry"] (同じ長さの場合もあり)

5.3.代入式

 Python 3.8以降で導入された「ウォルラス演算子」(:=) を用いて、式の中で変数に値を代入できます。

if (n := len(data)) > 10:
    print(f"データが多いです: {n}件")

5.4.デバッグやテストに使うassert文

  • assert 条件式 で、条件式がFalseならAssertionErrorを発生させる仕組みです。
  • デバッグ時やテスト時に「ここは絶対にTrueであるべき」などのチェックに利用します。

まとめ

 ここまで、8章で取り上げた「例外処理」「内包表記」「ジェネレータ」「ラムダ式」「代入式」「assert文」のポイントをおさらいしました。次のコンテンツでは、これらを総合的に活用する演習プログラムを用意しています。今回の内容をしっかり理解しておくことで、演習にもスムーズに取り組むことができるでしょう。