第4章: 制御構文と関数:Pythonらしい書き方

この章では、Pythonの基本的な制御構文(条件分岐、ループ)と関数の定義方法について学びます。他の言語にも同様の機能はありますが、特にforループの振る舞いや、柔軟な引数の渡し方はPythonの大きな特徴です。これらの「Pythonらしい」書き方をマスターすることで、より簡潔で読みやすいコードを書けるようになります。

if/elif/elseによる条件分岐

Pythonの条件分岐はifelif(else ifの略)、elseを使って記述します。C言語やJavaのような波括弧{}は使わず、**コロン:とインデント(通常は半角スペース4つ)**でコードブロックを表現するのが最大の特徴です。

条件式にandornotといった論理演算子も使用できます。

forループとrange()、enumerate()

Pythonのforループは、他の言語のfor (int i = 0; i < 5; i++)といったカウンタ変数を使うスタイルとは少し異なります。リストやタプル、文字列などのイテラブル(反復可能)オブジェクトから要素を1つずつ取り出して処理を実行します。これは、Javaの拡張for文やC#のforeachに似ています。

`range()` 関数

決まった回数のループを実行したい場合は、range()関数が便利です。range(n)は0からn-1までの連続した数値を生成します。

`enumerate()` 関数

ループ処理の中で、要素のインデックス(番号)と値の両方を使いたい場合があります。そのような時はenumerate()関数を使うと、コードが非常にスッキリします。これは非常にPythonらしい書き方の一つです。

whileループ

whileループは、指定された条件がTrueである間、処理を繰り返します。ループを途中で抜けたい場合はbreakを、現在の回の処理をスキップして次の回に進みたい場合はcontinueを使用します。

関数の定義 (def)

関数はdefキーワードを使って定義します。ここでもコードブロックはコロン:とインデントで示します。値はreturnキーワードで返します。

引数と返り値に**型アノテーション(型ヒント)**を付けることもできます。これはコードの可読性を高め、静的解析ツールによるバグの発見を助けますが、実行時の動作に直接影響を与えるものではありません。 型アノテーションは 引数名: 型 のように記述し、返り値の型は -> 型: のように記述します。

引数の渡し方(位置引数、キーワード引数、デフォルト引数値)

Pythonの関数は、非常に柔軟な引数の渡し方ができます。型アノテーションと組み合わせることで、どのような型の引数を期待しているかがより明確になります。

  • 位置引数 (Positional Arguments): 最も基本的な渡し方で、定義された順序で値を渡します。
  • キーワード引数 (Keyword Arguments): 引数名=値の形式で渡します。順序を問わないため、可読性が向上します。
  • デフォルト引数値 (Default Argument Values): 関数を定義する際に引数にデフォルト値を設定できます。呼び出し時にその引数が省略されると、デフォルト値が使われます。

注意点: デフォルト引数を持つ引数は、持たない引数の後に定義する必要があります。

可変長引数 (*args, **kwargs)

関数の引数の数が可変である場合に対応するための仕組みです。型アノテーションを使う場合は、typingモジュールからAnyなどをインポートすると便利です。

`*args`

任意の数の位置引数をタプルとして受け取ります。型アノテーションでは *args: 型 のように表現します。

`**kwargs`

任意の数のキーワード引数を辞書として受け取ります。型アノテーションでは **kwargs: 型 のように表現します。どのような型の値も受け付ける場合は Any を使います。

ラムダ式(Lambda expressions)

lambdaキーワードを使うと、名前のない小さな無名関数を定義できます。

構文: lambda 引数: 式

この章のまとめ

この章では、Pythonの制御構文と関数の基本を学びました。他の言語の経験がある方にとって、特に以下の点はPythonの特徴として重要です。

  • インデントが構文の一部: 波括弧{}の代わりにインデントでコードブロックを定義するため、自然と誰が書いても読みやすいコードスタイルになります。
  • forループはイテラブルを巡る: for item in collection: の形が基本です。インデックスが必要な場合は、for i, item in enumerate(collection): のようにenumerate()を使うのがPythonらしい書き方です。
  • 柔軟な関数引数: キーワード引数デフォルト引数値、そして可変長引数 (*args, **kwargs) を使いこなすことで、非常に柔軟で再利用性の高い関数を作成できます。
  • 型アノテーション: 引数や返り値に型ヒントを付けることで、関数の意図が明確になり、コードの信頼性が向上します。
  • ラムダ式: ちょっとした処理をその場で関数として渡したい場合に、lambdaはコードを簡潔に保つのに役立ちます。

これらの機能を理解し使いこなすことが、より効率的で「Pythonic(パイソニック)」なコードを書くための第一歩となります。

練習問題1: 偶数とそのインデックスの発見

数値のリストが与えられたとき、そのリストに含まれる偶数とその**インデックス(位置番号)**だけを出力するプログラムを書いてください。

ヒント:

  • forループとenumerate()を組み合わせます。
  • 数値が偶数かどうかは、%(剰余)演算子を使って、2で割った余りが0になるかで判定できます (number % 2 == 0)。
practice4_1.py
python practice4_1.py

練習問題2: ユーザープロフィール作成関数

ユーザーのプロフィール情報を出力する関数 create_profile を作成してください。引数と返り値には型アノテーションを付けてください。

要件:

  1. name(名前)はstr型で、必須の引数とします。
  2. age(年齢)と city(都市)はstr型で、キーワード引数として任意に受け取れるようにします。もし指定されなかった場合は、年齢は「秘密」、都市は「不明」と表示されるようにしてください。
  3. この関数は値を返さないものとします。
  4. 関数を呼び出し、異なるパターンでプロフィールが出力されることを確認してください。

ヒント:

  • agecityにはデフォルト引数値を設定します。
  • 値を返さない関数の返り値の型アノテーションは -> None です。
practice4_2.py
python practice4_2.py