|
| 1 | +# 第4章: 制御構文と関数:Pythonらしい書き方 |
| 2 | + |
| 3 | +この章では、Pythonの基本的な制御構文(条件分岐、ループ)と関数の定義方法について学びます。他の言語にも同様の機能はありますが、特に`for`ループの振る舞いや、柔軟な引数の渡し方はPythonの大きな特徴です。これらの「Pythonらしい」書き方をマスターすることで、より簡潔で読みやすいコードを書けるようになります。 |
| 4 | + |
| 5 | +## if/elif/elseによる条件分岐 |
| 6 | + |
| 7 | +Pythonの条件分岐は`if`、`elif`(else ifの略)、`else`を使って記述します。C言語やJavaのような波括弧`{}`は使わず、**コロン`:`とインデント(通常は半角スペース4つ)**でコードブロックを表現するのが最大の特徴です。 |
| 8 | + |
| 9 | +```python |
| 10 | +>>> score = 85 |
| 11 | +>>> if score >= 90: |
| 12 | +... print('優') |
| 13 | +... elif score >= 80: |
| 14 | +... print('良') |
| 15 | +... elif score >= 70: |
| 16 | +... print('可') |
| 17 | +... else: |
| 18 | +... print('不可') |
| 19 | +... |
| 20 | +良 |
| 21 | +``` |
| 22 | + |
| 23 | +条件式に`and`や`or`、`not`といった論理演算子も使用できます。 |
| 24 | + |
| 25 | +```python |
| 26 | +>>> temp = 25 |
| 27 | +>>> is_sunny = True |
| 28 | +>>> if temp > 20 and is_sunny: |
| 29 | +... print("お出かけ日和です") |
| 30 | +... |
| 31 | +お出かけ日和です |
| 32 | +``` |
| 33 | + |
| 34 | +## forループとrange()、enumerate() |
| 35 | + |
| 36 | +Pythonの`for`ループは、他の言語の`for (int i = 0; i < 5; i++)`といったカウンタ変数を使うスタイルとは少し異なります。リストやタプル、文字列などの**イテラブル(反復可能)オブジェクト**から要素を1つずつ取り出して処理を実行します。これは、Javaの拡張for文やC\#の`foreach`に似ています。 |
| 37 | + |
| 38 | +```python |
| 39 | +>>> fruits = ['apple', 'banana', 'cherry'] |
| 40 | +>>> for fruit in fruits: |
| 41 | +... print(f"I like {fruit}") |
| 42 | +... |
| 43 | +I like apple |
| 44 | +I like banana |
| 45 | +I like cherry |
| 46 | +``` |
| 47 | + |
| 48 | +### `range()` 関数 |
| 49 | + |
| 50 | +決まった回数のループを実行したい場合は、`range()`関数が便利です。`range(n)`は0からn-1までの連続した数値を生成します。 |
| 51 | + |
| 52 | +```python |
| 53 | +>>> for i in range(5): |
| 54 | +... print(i) |
| 55 | +... |
| 56 | +0 |
| 57 | +1 |
| 58 | +2 |
| 59 | +3 |
| 60 | +4 |
| 61 | +``` |
| 62 | + |
| 63 | +### `enumerate()` 関数 |
| 64 | + |
| 65 | +ループ処理の中で、要素のインデックス(番号)と値の両方を使いたい場合があります。そのような時は`enumerate()`関数を使うと、コードが非常にスッキリします。これは非常にPythonらしい書き方の一つです。 |
| 66 | + |
| 67 | +```python |
| 68 | +>>> fruits = ['apple', 'banana', 'cherry'] |
| 69 | +>>> for i, fruit in enumerate(fruits): |
| 70 | +... print(f"Index: {i}, Value: {fruit}") |
| 71 | +... |
| 72 | +Index: 0, Value: apple |
| 73 | +Index: 1, Value: banana |
| 74 | +Index: 2, Value: cherry |
| 75 | +``` |
| 76 | + |
| 77 | +## whileループ |
| 78 | + |
| 79 | +`while`ループは、指定された条件が`True`である間、処理を繰り返します。ループを途中で抜けたい場合は`break`を、現在の回の処理をスキップして次の回に進みたい場合は`continue`を使用します。 |
| 80 | + |
| 81 | +```python |
| 82 | +>>> n = 0 |
| 83 | +>>> while n < 5: |
| 84 | +... print(n) |
| 85 | +... n += 1 |
| 86 | +... |
| 87 | +0 |
| 88 | +1 |
| 89 | +2 |
| 90 | +3 |
| 91 | +4 |
| 92 | +``` |
| 93 | + |
| 94 | +## 関数の定義 (def) |
| 95 | + |
| 96 | +関数は`def`キーワードを使って定義します。ここでもコードブロックはコロン`:`とインデントで示します。値は`return`キーワードで返します。 |
| 97 | + |
| 98 | +```python |
| 99 | +>>> def greet(name): |
| 100 | +... """指定された名前で挨拶を返す関数""" # これはDocstringと呼ばれるドキュメント文字列です |
| 101 | +... return f"Hello, {name}!" |
| 102 | +... |
| 103 | +>>> message = greet("Alice") |
| 104 | +>>> print(message) |
| 105 | +Hello, Alice! |
| 106 | +``` |
| 107 | + |
| 108 | +## 引数の渡し方(位置引数、キーワード引数、デフォルト引数値) |
| 109 | + |
| 110 | +Pythonの関数は、非常に柔軟な引数の渡し方ができます。 |
| 111 | + |
| 112 | +* **位置引数 (Positional Arguments):** 最も基本的な渡し方で、定義された順序で値を渡します。 |
| 113 | +* **キーワード引数 (Keyword Arguments):** `引数名=値`の形式で渡します。順序を問わないため、可読性が向上します。 |
| 114 | +* **デフォルト引数値 (Default Argument Values):** 関数を定義する際に引数にデフォルト値を設定できます。呼び出し時にその引数が省略されると、デフォルト値が使われます。 |
| 115 | + |
| 116 | +```python |
| 117 | +>>> def describe_pet(animal_type, pet_name, owner_name="Taro"): |
| 118 | +... print(f"私には {animal_type} がいます。") |
| 119 | +... print(f"名前は {pet_name} で、飼い主は {owner_name} です。") |
| 120 | +... |
| 121 | + |
| 122 | +# 位置引数のみで呼び出し |
| 123 | +>>> describe_pet("ハムスター", "ジャンボ") |
| 124 | +私には ハムスター がいます。 |
| 125 | +名前は ジャンボ で、飼い主は Taro です。 |
| 126 | + |
| 127 | +# キーワード引数で呼び出し(順序を逆にしてもOK) |
| 128 | +>>> describe_pet(pet_name="ポチ", animal_type="犬") |
| 129 | +私には 犬 がいます。 |
| 130 | +名前は ポチ で、飼い主は Taro です。 |
| 131 | + |
| 132 | +# デフォルト引数を持つ引数を指定して呼び出し |
| 133 | +>>> describe_pet("猫", "ミケ", "Hanako") |
| 134 | +私には 猫 がいます。 |
| 135 | +名前は ミケ で、飼い主は Hanako です。 |
| 136 | +``` |
| 137 | + |
| 138 | +**注意点:** デフォルト引数を持つ引数は、持たない引数の後に定義する必要があります。 |
| 139 | + |
| 140 | +## 可変長引数 (\*args, \*\*kwargs) |
| 141 | + |
| 142 | +関数の引数の数が可変である場合に対応するための仕組みです。 |
| 143 | + |
| 144 | +### `*args` |
| 145 | + |
| 146 | +任意の数の**位置引数**をタプルとして受け取ります。慣習的に`args`という名前が使われます。 |
| 147 | + |
| 148 | +```python |
| 149 | +>>> def sum_all(*numbers): |
| 150 | +... print(f"受け取ったタプル: {numbers}") |
| 151 | +... total = 0 |
| 152 | +... for num in numbers: |
| 153 | +... total += num |
| 154 | +... return total |
| 155 | +... |
| 156 | +>>> print(sum_all(1, 2, 3)) |
| 157 | +受け取ったタプル: (1, 2, 3) |
| 158 | +6 |
| 159 | +>>> print(sum_all(10, 20, 30, 40, 50)) |
| 160 | +受け取ったタプル: (10, 20, 30, 40, 50) |
| 161 | +150 |
| 162 | +``` |
| 163 | + |
| 164 | +### `**kwargs` |
| 165 | + |
| 166 | +任意の数の**キーワード引数**を辞書として受け取ります。慣習的に`kwargs` (keyword arguments) という名前が使われます。 |
| 167 | + |
| 168 | +```python |
| 169 | +>>> def print_profile(**user_info): |
| 170 | +... print(f"受け取った辞書: {user_info}") |
| 171 | +... for key, value in user_info.items(): |
| 172 | +... print(f"{key}: {value}") |
| 173 | +... |
| 174 | +>>> print_profile(name="Sato", age=28, city="Tokyo") |
| 175 | +受け取った辞書: {'name': 'Sato', 'age': 28, 'city': 'Tokyo'} |
| 176 | +name: Sato |
| 177 | +age: 28 |
| 178 | +city: Tokyo |
| 179 | +``` |
| 180 | + |
| 181 | +## ラムダ式(Lambda expressions) |
| 182 | + |
| 183 | +`lambda`キーワードを使うと、名前のない小さな**無名関数**を定義できます。複雑な処理には向きませんが、`sorted`関数のキーを指定したり、GUIのコールバック関数を定義したりと、簡単な処理をその場で記述したい場合に非常に便利です。 |
| 184 | + |
| 185 | +構文: `lambda 引数: 式` |
| 186 | + |
| 187 | +```python |
| 188 | +# 通常の関数で2つの数を足す |
| 189 | +>>> def add(x, y): |
| 190 | +... return x + y |
| 191 | +... |
| 192 | + |
| 193 | +# ラムダ式で同じ処理を定義 |
| 194 | +>>> add_lambda = lambda x, y: x + y |
| 195 | +>>> print(add_lambda(3, 5)) |
| 196 | +8 |
| 197 | + |
| 198 | +# sorted関数のキーとして利用する例 |
| 199 | +>>> students = [('Taro', 80), ('Jiro', 95), ('Saburo', 75)] |
| 200 | +# 成績(タプルの2番目の要素)でソートする |
| 201 | +>>> sorted_students = sorted(students, key=lambda student: student[1], reverse=True) |
| 202 | +>>> print(sorted_students) |
| 203 | +[('Jiro', 95), ('Taro', 80), ('Saburo', 75)] |
| 204 | +``` |
0 commit comments