Skip to content

Commit f8b9a58

Browse files
committed
練習問題追加 5章まで
1 parent 243807e commit f8b9a58

File tree

7 files changed

+398
-235
lines changed

7 files changed

+398
-235
lines changed

app/[docs_id]/markdown.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ const components: Components = {
5757
<ExecFile
5858
language={match[1]}
5959
filename={match[3]}
60-
content={String(props.children).replace(/\n$/, "")}
60+
content={String(props.children || "").replace(/\n$/, "")}
6161
/>
6262
</div>
6363
);
@@ -72,7 +72,7 @@ const components: Components = {
7272
language={match[1]}
7373
tabSize={4}
7474
filename={match[3]}
75-
initContent={String(props.children).replace(/\n$/, "")}
75+
initContent={String(props.children || "").replace(/\n$/, "")}
7676
/>
7777
</div>
7878
);
@@ -88,7 +88,7 @@ const components: Components = {
8888
return (
8989
<div className="bg-base-300 border border-primary m-2 p-4 pr-1 rounded-lg">
9090
<PythonEmbeddedTerminal
91-
content={String(props.children).replace(/\n$/, "")}
91+
content={String(props.children || "").replace(/\n$/, "")}
9292
/>
9393
</div>
9494
);
@@ -105,7 +105,7 @@ const components: Components = {
105105
// style={todo dark theme?}
106106
{...props}
107107
>
108-
{String(props.children).replace(/\n$/, "")}
108+
{String(props.children || "").replace(/\n$/, "")}
109109
</SyntaxHighlighter>
110110
);
111111
} else if (String(props.children).includes("\n")) {
@@ -117,7 +117,7 @@ const components: Components = {
117117
// style={todo dark theme?}
118118
{...props}
119119
>
120-
{String(props.children).replace(/\n$/, "")}
120+
{String(props.children || "").replace(/\n$/, "")}
121121
</SyntaxHighlighter>
122122
);
123123
} else {

app/terminal/exec.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ interface ExecProps {
1212
}
1313
export function ExecFile(props: ExecProps) {
1414
const { terminalRef, terminalInstanceRef, termReady } = useTerminal({
15-
getRows: (cols: number) => getRows(props.content, cols),
15+
getRows: (cols: number) => getRows(props.content, cols) + 1,
1616
onReady: () => {
1717
// カーソル非表示
1818
terminalInstanceRef.current!.write("\x1b[?25l");

public/docs/python-1.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ print("Hello from a Python script!")
9999
Hello from a Python script!
100100
```
101101

102+
REPLでは式を入力するだけでも結果が表示されていましたが、スクリプトで結果を表示するには `print()` 関数を使う必要があります。
103+
102104
### __main__ について
103105

104106
前述の hello.py のようにファイルの1行目から処理を書いても問題なく動作しますが、一般的には以下のようなお決まりの書き方が用いられます。
@@ -126,15 +128,15 @@ Pythonでは、ファイルは他のファイルから `import` 文で読み込
126128

127129
```python:my_utils.py
128130
def say_hello(name):
129-
"""挨拶を返す関数"""
130-
return f"Hello, {name}!"
131+
"""挨拶を返す関数"""
132+
return f"Hello, {name}!"
131133

132134
# このファイルが直接実行された時だけ、以下のテストコードを実行する
133135
if __name__ == "__main__":
134-
print("--- Running Test ---")
135-
message = say_hello("Alice")
136-
print(message)
137-
print("--- Test Finished ---")
136+
print("--- Running Test ---")
137+
message = say_hello("Alice")
138+
print(message)
139+
print("--- Test Finished ---")
138140
```
139141

140142
このファイルを2通りの方法で使ってみます。

public/docs/python-2.md

Lines changed: 111 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -1,182 +1,169 @@
11
# 第2章: Pythonの基本構文とデータ型
22

3-
他の言語での経験を活かし、Pythonの基本的な文法と組み込み型を素早くキャッチアップしましょう。特に、多くの静的型付け言語と異なる**インデントによるブロック表現****動的型付け**は、Pythonを理解する上で最初の重要なポイントです
3+
他の言語でのプログラミング経験がある方を対象に、Pythonの基本的な文法と組み込みデータ型を解説します。多くの静的型付け言語(Java, C++, C\#など)との違いを意識しながら、Pythonの特徴を素早く掴んでいきましょう。特に、**動的型付け**は重要なコンセプトです
44

5-
この章のコード例は、Pythonの対話モード(REPL)で `>>>` に続くコードを直接入力し、その直後に表示される結果を確認することを想定しています。
6-
7-
<!-- ## インデントが持つ意味: 波括弧 `{}` からの解放
8-
9-
多くのプログラミング言語では、`if`文や`for`ループなどのコードブロックを波括弧 `{}` で囲みます。しかし、**Pythonではインデント(字下げ)そのものがコードブロックを定義します**。これはPythonの構文における最大の特徴の一つです。
10-
11-
一般的に、インデントには**スペース4つ**を使用することが強く推奨されています(PEP 8スタイルガイド)。
5+
## 変数宣言と動的型付け
126

13-
**Java/C++でのブロック表現:**
7+
Pythonの最も大きな特徴の一つは、変数の型を宣言する必要がないことです。変数への代入が、変数の作成と型の決定を同時に行います。
148

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
2018
```
2119

22-
**Pythonでの対話モード実行例:**
23-
対話モードで複数行のブロックを入力すると、継続行プロンプト `...` が表示されます。
20+
さらに、Pythonは**動的型付け**言語です。これは、一度作成した変数に、異なる型のデータを再代入できることを意味します。`type()`関数を使うと、変数が現在どの型を参照しているかを確認できます。
2421

2522
```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'>
3430
```
3531

36-
インデントを間違えると `IndentationError` という文法エラーが発生します。これにより、誰が書いてもコードの見た目が統一され、可読性が高まるというメリットがあります。
37-
-->
32+
この柔軟性は、静的型付け言語に慣れていると少し奇妙に感じるかもしれませんが、Pythonの簡潔さと書きやすさの源泉となっています。
3833

39-
## 変数宣言と動的型付け
34+
## 基本的なデータ型
4035

41-
静的型付け言語(Java, C++, C\#など)に慣れている方にとって、Pythonの変数宣言は非常にシンプルに感じられるでしょう
36+
Pythonには多くの組み込みデータ型がありますが、ここでは最も基本的なものを紹介します
4237

43-
**Pythonでは、変数の型を事前に宣言する必要はありません**。変数への代入が初めて行われたときに、変数が作成され、代入された値の型が自動的にその変数の型となります。これを**動的型付け**と呼びます。
38+
### 数値(int, float)
4439

45-
変数名だけを入力してEnterキーを押すと、その時点での変数の値を確認できます
40+
Pythonは整数 (`int`) と浮動小数点数 (`float`) を区別します
4641

4742
```python-repl
48-
>>> # 変数 `count` は整数(int)型として自動的に解釈される
49-
>>> count = 100
50-
>>> count
51-
100
52-
>>> type(count) # type()関数で現在の型を確認
43+
>>> # 整数 (int)
44+
>>> a = 10
45+
>>> type(a)
5346
<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'>
6151
```
6252

63-
## 基本的なデータ型
64-
65-
ここでは、プログラミングで頻繁に使用される基本的なデータ型を紹介します。対話モードでは、式を評価した結果が直接表示されます。
66-
67-
### 数値 (`int`, `float`)
68-
69-
Pythonには整数 (`int`) と浮動小数点数 (`float`) があります。型の区別は自動的に行われます。
53+
四則演算は直感的に行えます。注意点として、除算 (`/`) は常に `float` を返します。整数除算を行いたい場合は (`//`) を使います。
7054

7155
```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
8157
3.3333333333333335
82-
>>> x // 3 # 整数の除算(切り捨て)
58+
>>> 10 // 3
8359
3
84-
>>> x % 3 # 剰余
60+
>>> # べき乗
61+
>>> 2 ** 4
62+
16
63+
>>> # 剰余
64+
>>> 10 % 3
8565
1
86-
>>> x ** 3 # べき乗
87-
1000
8866
```
8967

90-
### 文字列 (`str`)
68+
### 文字列str
9169

92-
文字列はシングルクォート `'` またはダブルクォート `"` で囲みます。どちらを使っても機能的な違いはありません
70+
文字列はシングルクォート (`'`) またはダブルクォート (`"`) で囲んで作成します
9371

9472
```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'
10675
```
10776

108-
#### f-stringによるフォーマット
109-
他の言語での文字列フォーマット(`printf``String.format`)に相当するものとして、Python 3.6以降では**f-string**が推奨されます。非常に直感的で強力です。
110-
111-
文字列の前に `f` を置き、波括弧 `{}` の中に変数名や式を直接記述できます。
77+
文字列の連結は `+` 演算子、繰り返しは `*` 演算子を使います。
11278

11379
```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+
```
12086

121-
>>> # f-stringを使って文字列を生成する
122-
>>> profile = f"名前: {name}, 年齢: {age}"
123-
>>> profile
124-
'名前: 佐藤, 年齢: 28'
87+
変数の値を文字列に埋め込む際には、**f-string (フォーマット済み文字列リテラル)** が非常に便利で推奨されています。文字列の前に `f` を付け、埋め込みたい変数を `{}` で囲みます。
12588

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.
12995
```
13096

131-
### 真偽値 (`bool`)
97+
### 真偽値bool
13298

133-
真偽値は `True` または `False` の2つの値を持ちます**先頭が大文字であることに注意してください**
99+
真偽値は `True` `False` の2つの値を持ちます先頭が大文字であることに注意してください)。論理演算子には `and`, `or`, `not` を使います
134100

135101
```python-repl
136102
>>> 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
141108
False
142-
>>> is_active or is_admin
109+
>>> # 論理和 (OR)
110+
>>> is_active or has_permission
143111
True
112+
>>> # 否定 (NOT)
144113
>>> not is_active
145114
False
146115
```
147116

148-
## 型ヒント (Type Hints) の紹介
117+
## 型ヒントType Hintsの紹介
149118

150-
動的型付けはコードを素早く書ける一方で、大規模なプロジェクトでは、関数がどのような型の引数を期待し、何を返すのかが分かりにくくなることがあります
119+
動的型付けは柔軟ですが、コードが大規模になると変数がどの型を期待しているのかが分かりにくくなることがあります。そこで導入されたのが**型ヒント**です。これは、変数や関数の引数、返り値に「期待される型」を注釈として付与する機能です
151120

152-
そこでPython 3.5から導入されたのが**型ヒント**です。これは、変数や関数の引数、戻り値に「期待される型」を注釈として付与する機能です
121+
`変数名: 型` のように記述します
153122

154-
**重要**: 型ヒントはあくまで「ヒント」であり、Pythonのインタプリタはこれを**実行時に強制しません**。しかし、エディタや静的解析ツールがこのヒントを解釈し、型の不一致を開発段階で警告してくれるため、コードの可読性と堅牢性が大幅に向上します。
123+
```python-repl
124+
>>> # 型ヒントを付けた変数宣言
125+
>>> user_name: str = "Alice"
126+
>>> user_id: int = 123
127+
```
128+
129+
**重要な注意点:** 型ヒントはあくまで「ヒント」であり、**Pythonの実行エンジンはこれを強制しません**。つまり、型ヒントと異なる型の値を代入してもエラーにはなりません。
155130

156131
```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'>
174139
```
175140

176-
静的型付け言語の経験者にとって、型ヒントは馴染みやすく、動的言語の柔軟性と静的解析の安全性を両立させるための強力なツールとなるでしょう。
141+
型ヒントは、コードの可読性を高めたり、MyPyのような静的解析ツールや統合開発環境(IDE)がコードのバグを事前に発見したりするために利用されます。
142+
143+
## この章のまとめ
177144

178-
-----
145+
* Pythonでは変数の型宣言は不要で、値の代入によって型が自動的に決まる(**動的型付け**)。
146+
* 基本的なデータ型として**数値** (`int`, `float`)、**文字列** (`str`)、**真偽値** (`bool`) がある。
147+
* 文字列に変数を埋め込むには、簡潔で強力な **f-string** を使うのが一般的。
148+
* **型ヒント** (`変数名: 型`) は、コードの可読性を向上させるための注釈であり、実行時に型の強制力はない。
179149

180-
この章では、Pythonの構文の基礎となるインデントルール、柔軟な動的型付け、そして基本的なデータ型について対話モードで確認しながら学びました。特にf-stringと型ヒントは、モダンなPython開発における必須知識です。
150+
### 練習問題1
181151

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

Comments
 (0)