|
1 | 1 | # 第2章: Pythonの基本構文とデータ型 |
2 | 2 |
|
3 | | -他の言語での経験を活かし、Pythonの基本的な文法と組み込み型を素早くキャッチアップしましょう。特に、多くの静的型付け言語と異なる**インデントによるブロック表現**と**動的型付け**は、Pythonを理解する上で最初の重要なポイントです。 |
| 3 | +他の言語でのプログラミング経験がある方を対象に、Pythonの基本的な文法と組み込みデータ型を解説します。多くの静的型付け言語(Java, C++, C\#など)との違いを意識しながら、Pythonの特徴を素早く掴んでいきましょう。特に、**動的型付け**は重要なコンセプトです。 |
4 | 4 |
|
5 | | -この章のコード例は、Pythonの対話モード(REPL)で `>>>` に続くコードを直接入力し、その直後に表示される結果を確認することを想定しています。 |
6 | | - |
7 | | -<!-- ## インデントが持つ意味: 波括弧 `{}` からの解放 |
8 | | -
|
9 | | -多くのプログラミング言語では、`if`文や`for`ループなどのコードブロックを波括弧 `{}` で囲みます。しかし、**Pythonではインデント(字下げ)そのものがコードブロックを定義します**。これはPythonの構文における最大の特徴の一つです。 |
10 | | -
|
11 | | -一般的に、インデントには**スペース4つ**を使用することが強く推奨されています(PEP 8スタイルガイド)。 |
| 5 | +## 変数宣言と動的型付け |
12 | 6 |
|
13 | | -**Java/C++でのブロック表現:** |
| 7 | +Pythonの最も大きな特徴の一つは、変数の型を宣言する必要がないことです。変数への代入が、変数の作成と型の決定を同時に行います。 |
14 | 8 |
|
15 | | -```java |
16 | | -if (score > 80) { |
17 | | - System.out.println("合格です。"); |
18 | | - System.out.println("おめでとうございます!"); |
19 | | -} |
| 9 | +```python-repl |
| 10 | +>>> # 変数 message を作成し、文字列を代入 |
| 11 | +>>> message = "Hello, Python!" |
| 12 | +>>> print(message) |
| 13 | +Hello, Python! |
| 14 | +>>> # 変数 number を作成し、整数を代入 |
| 15 | +>>> number = 100 |
| 16 | +>>> print(number) |
| 17 | +100 |
20 | 18 | ``` |
21 | 19 |
|
22 | | -**Pythonでの対話モード実行例:** |
23 | | -対話モードで複数行のブロックを入力すると、継続行プロンプト `...` が表示されます。 |
| 20 | +さらに、Pythonは**動的型付け**言語です。これは、一度作成した変数に、異なる型のデータを再代入できることを意味します。`type()`関数を使うと、変数が現在どの型を参照しているかを確認できます。 |
24 | 21 |
|
25 | 22 | ```python-repl |
26 | | ->>> score = 85 |
27 | | ->>> if score > 80: |
28 | | -... # このブロックはインデントによって定義される |
29 | | -... print("合格です。") |
30 | | -... print("おめでとうございます!") |
31 | | -... |
32 | | -合格です。 |
33 | | -おめでとうございます! |
| 23 | +>>> x = 10 |
| 24 | +>>> type(x) |
| 25 | +<class 'int'> |
| 26 | +>>> # 同じ変数 x に文字列を再代入 |
| 27 | +>>> x = "Hello" |
| 28 | +>>> type(x) |
| 29 | +<class 'str'> |
34 | 30 | ``` |
35 | 31 |
|
36 | | -インデントを間違えると `IndentationError` という文法エラーが発生します。これにより、誰が書いてもコードの見た目が統一され、可読性が高まるというメリットがあります。 |
37 | | - --> |
| 32 | +この柔軟性は、静的型付け言語に慣れていると少し奇妙に感じるかもしれませんが、Pythonの簡潔さと書きやすさの源泉となっています。 |
38 | 33 |
|
39 | | -## 変数宣言と動的型付け |
| 34 | +## 基本的なデータ型 |
40 | 35 |
|
41 | | -静的型付け言語(Java, C++, C\#など)に慣れている方にとって、Pythonの変数宣言は非常にシンプルに感じられるでしょう。 |
| 36 | +Pythonには多くの組み込みデータ型がありますが、ここでは最も基本的なものを紹介します。 |
42 | 37 |
|
43 | | -**Pythonでは、変数の型を事前に宣言する必要はありません**。変数への代入が初めて行われたときに、変数が作成され、代入された値の型が自動的にその変数の型となります。これを**動的型付け**と呼びます。 |
| 38 | +### 数値(int, float) |
44 | 39 |
|
45 | | -変数名だけを入力してEnterキーを押すと、その時点での変数の値を確認できます。 |
| 40 | +Pythonは整数 (`int`) と浮動小数点数 (`float`) を区別します。 |
46 | 41 |
|
47 | 42 | ```python-repl |
48 | | ->>> # 変数 `count` は整数(int)型として自動的に解釈される |
49 | | ->>> count = 100 |
50 | | ->>> count |
51 | | -100 |
52 | | ->>> type(count) # type()関数で現在の型を確認 |
| 43 | +>>> # 整数 (int) |
| 44 | +>>> a = 10 |
| 45 | +>>> type(a) |
53 | 46 | <class 'int'> |
54 | | -
|
55 | | ->>> # 同じ変数に別の型(文字列)を再代入できる |
56 | | ->>> count = "百" |
57 | | ->>> count |
58 | | -'百' |
59 | | ->>> type(count) |
60 | | -<class 'str'> |
| 47 | +>>> # 浮動小数点数 (float) |
| 48 | +>>> b = 3.14 |
| 49 | +>>> type(b) |
| 50 | +<class 'float'> |
61 | 51 | ``` |
62 | 52 |
|
63 | | -## 基本的なデータ型 |
64 | | - |
65 | | -ここでは、プログラミングで頻繁に使用される基本的なデータ型を紹介します。対話モードでは、式を評価した結果が直接表示されます。 |
66 | | - |
67 | | -### 数値 (`int`, `float`) |
68 | | - |
69 | | -Pythonには整数 (`int`) と浮動小数点数 (`float`) があります。型の区別は自動的に行われます。 |
| 53 | +四則演算は直感的に行えます。注意点として、除算 (`/`) は常に `float` を返します。整数除算を行いたい場合は (`//`) を使います。 |
70 | 54 |
|
71 | 55 | ```python-repl |
72 | | ->>> x = 10 |
73 | | ->>> y = 3.14 |
74 | | -
|
75 | | ->>> # 演算結果がそのまま表示される |
76 | | ->>> x + y |
77 | | -13.14 |
78 | | ->>> x * 2 |
79 | | -20 |
80 | | ->>> x / 3 # 通常の除算 |
| 56 | +>>> 10 / 3 |
81 | 57 | 3.3333333333333335 |
82 | | ->>> x // 3 # 整数の除算(切り捨て) |
| 58 | +>>> 10 // 3 |
83 | 59 | 3 |
84 | | ->>> x % 3 # 剰余 |
| 60 | +>>> # べき乗 |
| 61 | +>>> 2 ** 4 |
| 62 | +16 |
| 63 | +>>> # 剰余 |
| 64 | +>>> 10 % 3 |
85 | 65 | 1 |
86 | | ->>> x ** 3 # べき乗 |
87 | | -1000 |
88 | 66 | ``` |
89 | 67 |
|
90 | | -### 文字列 (`str`) |
| 68 | +### 文字列(str) |
91 | 69 |
|
92 | | -文字列はシングルクォート `'` またはダブルクォート `"` で囲みます。どちらを使っても機能的な違いはありません。 |
| 70 | +文字列はシングルクォート (`'`) またはダブルクォート (`"`) で囲んで作成します。 |
93 | 71 |
|
94 | 72 | ```python-repl |
95 | | ->>> message1 = "こんにちは、世界" |
96 | | ->>> message2 = 'Hello, World!' |
97 | | -
|
98 | | ->>> # 文字列の連結 |
99 | | ->>> greeting = message1 + " & " + message2 |
100 | | ->>> greeting |
101 | | -'こんにちは、世界 & Hello, World!' |
102 | | -
|
103 | | ->>> # 文字列の繰り返し |
104 | | ->>> "-" * 10 |
105 | | -'----------' |
| 73 | +>>> name = "Guido" |
| 74 | +>>> greeting = 'Hello' |
106 | 75 | ``` |
107 | 76 |
|
108 | | -#### f-stringによるフォーマット |
109 | | -他の言語での文字列フォーマット(`printf` や `String.format`)に相当するものとして、Python 3.6以降では**f-string**が推奨されます。非常に直感的で強力です。 |
110 | | - |
111 | | -文字列の前に `f` を置き、波括弧 `{}` の中に変数名や式を直接記述できます。 |
| 77 | +文字列の連結は `+` 演算子、繰り返しは `*` 演算子を使います。 |
112 | 78 |
|
113 | 79 | ```python-repl |
114 | | ->>> name = "佐藤" |
115 | | ->>> age = 28 |
116 | | -
|
117 | | ->>> # 従来の方法(少し面倒) |
118 | | ->>> "名前: " + name + ", 年齢: " + str(age) |
119 | | -'名前: 佐藤, 年齢: 28' |
| 80 | +>>> full_greeting = greeting + ", " + name + "!" |
| 81 | +>>> print(full_greeting) |
| 82 | +Hello, Guido! |
| 83 | +>>> print("-" * 10) |
| 84 | +---------- |
| 85 | +``` |
120 | 86 |
|
121 | | ->>> # f-stringを使って文字列を生成する |
122 | | ->>> profile = f"名前: {name}, 年齢: {age}" |
123 | | ->>> profile |
124 | | -'名前: 佐藤, 年齢: 28' |
| 87 | +変数の値を文字列に埋め込む際には、**f-string (フォーマット済み文字列リテラル)** が非常に便利で推奨されています。文字列の前に `f` を付け、埋め込みたい変数を `{}` で囲みます。 |
125 | 88 |
|
126 | | ->>> # f-string内では計算も可能 |
127 | | ->>> f"{name}さんは10年後、{age + 10}歳です。" |
128 | | -'佐藤さんは10年後、38歳です。' |
| 89 | +```python-repl |
| 90 | +>>> name = "Ada" |
| 91 | +>>> age = 36 |
| 92 | +>>> message = f"My name is {name} and I am {age} years old." |
| 93 | +>>> print(message) |
| 94 | +My name is Ada and I am 36 years old. |
129 | 95 | ``` |
130 | 96 |
|
131 | | -### 真偽値 (`bool`) |
| 97 | +### 真偽値(bool) |
132 | 98 |
|
133 | | -真偽値は `True` または `False` の2つの値を持ちます。**先頭が大文字であることに注意してください**。 |
| 99 | +真偽値は `True` と `False` の2つの値を持ちます(先頭が大文字であることに注意してください)。論理演算子には `and`, `or`, `not` を使います。 |
134 | 100 |
|
135 | 101 | ```python-repl |
136 | 102 | >>> is_active = True |
137 | | ->>> is_admin = False |
138 | | -
|
139 | | ->>> # 論理演算子 (and, or, not) |
140 | | ->>> is_active and is_admin |
| 103 | +>>> has_permission = False |
| 104 | +>>> type(is_active) |
| 105 | +<class 'bool'> |
| 106 | +>>> # 論理積 (AND) |
| 107 | +>>> is_active and has_permission |
141 | 108 | False |
142 | | ->>> is_active or is_admin |
| 109 | +>>> # 論理和 (OR) |
| 110 | +>>> is_active or has_permission |
143 | 111 | True |
| 112 | +>>> # 否定 (NOT) |
144 | 113 | >>> not is_active |
145 | 114 | False |
146 | 115 | ``` |
147 | 116 |
|
148 | | -## 型ヒント (Type Hints) の紹介 |
| 117 | +## 型ヒント(Type Hints)の紹介 |
149 | 118 |
|
150 | | -動的型付けはコードを素早く書ける一方で、大規模なプロジェクトでは、関数がどのような型の引数を期待し、何を返すのかが分かりにくくなることがあります。 |
| 119 | +動的型付けは柔軟ですが、コードが大規模になると変数がどの型を期待しているのかが分かりにくくなることがあります。そこで導入されたのが**型ヒント**です。これは、変数や関数の引数、返り値に「期待される型」を注釈として付与する機能です。 |
151 | 120 |
|
152 | | -そこでPython 3.5から導入されたのが**型ヒント**です。これは、変数や関数の引数、戻り値に「期待される型」を注釈として付与する機能です。 |
| 121 | +`変数名: 型` のように記述します。 |
153 | 122 |
|
154 | | -**重要**: 型ヒントはあくまで「ヒント」であり、Pythonのインタプリタはこれを**実行時に強制しません**。しかし、エディタや静的解析ツールがこのヒントを解釈し、型の不一致を開発段階で警告してくれるため、コードの可読性と堅牢性が大幅に向上します。 |
| 123 | +```python-repl |
| 124 | +>>> # 型ヒントを付けた変数宣言 |
| 125 | +>>> user_name: str = "Alice" |
| 126 | +>>> user_id: int = 123 |
| 127 | +``` |
| 128 | + |
| 129 | +**重要な注意点:** 型ヒントはあくまで「ヒント」であり、**Pythonの実行エンジンはこれを強制しません**。つまり、型ヒントと異なる型の値を代入してもエラーにはなりません。 |
155 | 130 |
|
156 | 131 | ```python-repl |
157 | | ->>> # nameはstr型、ageはint型を期待し、戻り値はstr型であることを示す |
158 | | ->>> def create_user_profile(name: str, age: int) -> str: |
159 | | -... return f"ユーザー名: {name}, 年齢: {age}" |
160 | | -... |
161 | | ->>> # 正しい使い方 |
162 | | ->>> user1 = create_user_profile("田中", 35) |
163 | | ->>> user1 |
164 | | -'ユーザー名: 田中, 年齢: 35' |
165 | | -
|
166 | | ->>> # 変数にも型ヒントを付けられる |
167 | | ->>> user_id: int = 101 |
168 | | -
|
169 | | ->>> # --- 型ヒントに反する使い方 --- |
170 | | ->>> # 静的解析ツールは警告を出す可能性があるが、実行はできてしまう |
171 | | ->>> user2 = create_user_profile("鈴木", "25歳") # ageに文字列を渡している |
172 | | ->>> user2 |
173 | | -'ユーザー名: 鈴木, 年齢: 25歳' |
| 132 | +>>> user_id: int = 123 |
| 133 | +>>> type(user_id) |
| 134 | +<class 'int'> |
| 135 | +>>> # int型とヒントを付けたが、文字列を代入できてしまう |
| 136 | +>>> user_id = "abc-789" |
| 137 | +>>> type(user_id) |
| 138 | +<class 'str'> |
174 | 139 | ``` |
175 | 140 |
|
176 | | -静的型付け言語の経験者にとって、型ヒントは馴染みやすく、動的言語の柔軟性と静的解析の安全性を両立させるための強力なツールとなるでしょう。 |
| 141 | +型ヒントは、コードの可読性を高めたり、MyPyのような静的解析ツールや統合開発環境(IDE)がコードのバグを事前に発見したりするために利用されます。 |
| 142 | + |
| 143 | +## この章のまとめ |
177 | 144 |
|
178 | | ------ |
| 145 | + * Pythonでは変数の型宣言は不要で、値の代入によって型が自動的に決まる(**動的型付け**)。 |
| 146 | + * 基本的なデータ型として**数値** (`int`, `float`)、**文字列** (`str`)、**真偽値** (`bool`) がある。 |
| 147 | + * 文字列に変数を埋め込むには、簡潔で強力な **f-string** を使うのが一般的。 |
| 148 | + * **型ヒント** (`変数名: 型`) は、コードの可読性を向上させるための注釈であり、実行時に型の強制力はない。 |
179 | 149 |
|
180 | | -この章では、Pythonの構文の基礎となるインデントルール、柔軟な動的型付け、そして基本的なデータ型について対話モードで確認しながら学びました。特にf-stringと型ヒントは、モダンなPython開発における必須知識です。 |
| 150 | +### 練習問題1 |
181 | 151 |
|
182 | | -次の章では、複数の要素をまとめて扱うための強力なデータ構造である**リスト**と**タプル**について詳しく見ていきます。 |
| 152 | +`item_name` という変数に商品名(文字列)、`price` という変数に価格(整数)、`stock` という変数に在庫数(整数)をそれぞれ代入してください。その後、f-stringを使って「商品: [商品名], 価格: [価格]円, 在庫: [在庫数]個」という形式の文字列にし、 `print()` で出力するコードを書いてみましょう。 |
| 153 | + |
| 154 | +```python:practice2-1.py |
| 155 | +``` |
| 156 | + |
| 157 | +```python-exec:practice2-1.py |
| 158 | +(出力例) 商品: 高性能マウス, 価格: 4500円, 在庫: 2個 |
| 159 | +``` |
| 160 | + |
| 161 | +### 練習問題2 |
| 162 | + |
| 163 | +`is_adult` という変数に `bool` 型の型ヒントを付けて `True` を代入し、`type()` で型を確認してください。その後、同じ変数に数値の `20` を代入し、再度 `type()` で型を確認してください。この結果から、型ヒントが実行時の動作にどのような影響を与える(あるいは与えない)か考察してみましょう。 |
| 164 | + |
| 165 | +```python:practice2-2.py |
| 166 | +``` |
| 167 | + |
| 168 | +```python-exec:practice2-2.py |
| 169 | +``` |
0 commit comments