Skip to content

Commit 61fd739

Browse files
committed
9章まで練習問題追加
1 parent 434209d commit 61fd739

File tree

3 files changed

+140
-3
lines changed

3 files changed

+140
-3
lines changed

app/terminal/terminal.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,9 @@ export function useTerminal(props: TerminalProps) {
130130
const observer = new ResizeObserver(() => {
131131
// fitAddon.fit();
132132
const dims = fitAddonRef.current?.proposeDimensions();
133-
if (dims) {
133+
if (dims && !isNaN(dims.cols)) {
134134
const rows = Math.max(5, getRowsRef.current?.(dims.cols) ?? 0);
135+
console.log(dims.cols, rows)
135136
terminalInstanceRef.current?.resize(dims.cols, rows);
136137
}
137138
});

public/docs/python-8.md

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,4 +144,76 @@ ValueError: 負の値は処理できません。
144144
* 成功ケースでは `try` -\> `else` -\> `finally` の順に実行されます。
145145
* 失敗ケースでは `try` -\> `except` -\> `finally` の順に実行されます。
146146

147-
`finally` 節は、`try` ブロック内で `return` が実行される場合でも、その `return` の直前に実行されることが保証されています。これにより、リソースの解放漏れなどを防ぐことができます。
147+
`finally` 節は、`try` ブロック内で `return` が実行される場合でも、その `return` の直前に実行されることが保証されています。これにより、リソースの解放漏れなどを防ぐことができます。
148+
149+
## この章のまとめ
150+
151+
この章では、Pythonにおけるエラー処理の基本を学びました。重要なポイントを振り返りましょう。
152+
153+
* **例外**: Pythonでは、エラーは「例外」オブジェクトとして扱われます。例外が発生すると、プログラムの実行は中断されます。
154+
* `try...except`: 例外が発生する可能性のあるコードを `try` ブロックで囲み、`except` ブロックで捕捉することで、プログラムのクラッシュを防ぎ、エラーに応じた処理を実行できます。
155+
* **複数の例外処理**: `except` ブロックを複数記述したり、タプルでまとめたりすることで、さまざまな種類のエラーに柔軟に対応できます。
156+
* `raise`: 特定の条件で意図的に例外を発生させ、プログラムに異常な状態を通知します。
157+
* `else``finally`: `try` ブロックが成功した場合の処理を `else` に、成功・失敗にかかわらず必ず実行したい後片付け処理を `finally` に記述することで、より堅牢なコードを書くことができます。
158+
159+
例外処理をマスターすることは、予期せぬ入力や状況に強い、安定したプログラムを作成するための重要なステップです。
160+
161+
### 練習問題1: 安全なリスト要素の取得
162+
163+
リストとインデックスを受け取り、そのインデックスに対応する要素を返す `safe_get(my_list, index)` という関数を作成してください。
164+
165+
**要件:**
166+
167+
1. インデックスがリストの範囲外の場合 (`IndexError`)、「指定されたインデックスは範囲外です。」と表示してください。
168+
2. インデックスが整数でない場合 (`TypeError`)、「インデックスは整数で指定してください。」と表示してください。
169+
3. 正常に要素を取得できた場合は、その要素を返してください。
170+
171+
```python:practice8_1.py
172+
def safe_get(my_list, index):
173+
174+
175+
data = ['apple', 'banana', 'cherry']
176+
print(safe_get(data, 1))
177+
print(safe_get(data, 3))
178+
print(safe_get(data, 'zero'))
179+
```
180+
181+
```python-exec:practice8_1.py
182+
(出力例)
183+
banana
184+
指定されたインデックスは範囲外です。
185+
インデックスは整数で指定してください。
186+
```
187+
188+
### 練習問題2: ユーザー年齢の検証
189+
190+
ユーザーの年齢を入力として受け取り、18歳以上であれば「あなたは成人です。」と表示する `check_age(age_str)` という関数を作成してください。
191+
192+
**要件:**
193+
194+
1. 関数内部で、受け取った文字列を整数に変換してください。変換できない場合 (`ValueError`) は、`ValueError``raise` して、「有効な数値を入力してください。」というメッセージを伝えてください。
195+
2. 変換した数値が負の値である場合、`ValueError``raise` して、「年齢に負の値は指定できません。」というメッセージを伝えてください。
196+
3. 年齢が0歳から17歳までの場合は、「あなたは未成年です。」と表示してください。
197+
4. 関数の呼び出し側で、`raise` された例外も捕捉できるようにしてください。
198+
199+
```python:practice8_2.py
200+
def check_age(age_str):
201+
202+
203+
# 正常ケース
204+
print(check_age("20"))
205+
print(check_age("15"))
206+
207+
# 例外ケース
208+
print(check_age("abc"))
209+
print(check_age("-5"))
210+
```
211+
212+
```python-exec:practice8_2.py
213+
(出力例)
214+
あなたは成人です。
215+
あなたは未成年です。
216+
Traceback (most recent call last):
217+
...
218+
ValueError: 有効な数値を入力してください。
219+
```

public/docs/python-9.md

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,4 +164,68 @@ StopIteration
164164

165165
`@my_decorator` は、`say_goodbye = my_decorator(say_goodbye)` と同じ意味になります。こちらのほうが直感的で、Pythonのコードで広く使われています。
166166

167-
ジェネレータとデコレータは、最初は少し複雑に感じるかもしれませんが、使いこなせばよりクリーンで効率的なPythonコードを書くための強力な武器となります。ぜひ積極的に活用してみてください。
167+
ジェネレータとデコレータは、最初は少し複雑に感じるかもしれませんが、使いこなせばよりクリーンで効率的なPythonコードを書くための強力な武器となります。ぜひ積極的に活用してみてください。
168+
169+
はい、承知いたしました。先に作成したチュートリアルの末尾に追加する「この章のまとめ」と「練習問題」を作成します。
170+
171+
## この章のまとめ
172+
173+
この章では、Pythonプログラミングをさらに高いレベルへ引き上げるための2つの強力な概念を学びました。
174+
175+
* **ジェネレータ**: `yield`キーワードを使うことで、メモリ効率に優れたイテレータを簡単に作成できることを学びました。ジェネレータ関数やジェネレータ式を使うことで、巨大なデータストリームや無限シーケンスを、必要な分だけ計算しながら扱うことができます。これは、パフォーマンスが重要なアプリケーションにおいて不可欠なテクニックです。
176+
177+
* **デコレータ**: `@`シンタックスを用いることで、既存の関数のソースコードを変更することなく、機能を追加・変更できることを学びました。デコレータは、ロギング、実行時間計測、アクセス制御といった横断的な関心事を分離し、コードの再利用性を高め、DRY (Don't Repeat Yourself) の原則を維持するのに役立ちます。
178+
179+
これらの機能を使いこなすことは、単に高度な文法を覚えるだけでなく、Pythonの設計思想を理解し、より「Pythonらしい(Pythonic)」コードを書くための重要なステップです。
180+
181+
### 練習問題1: カウントダウンジェネレータ
182+
183+
`countdown(start)` というジェネレータ関数を作成してください。この関数は、引数で与えられた `start` の数値から1まで、1ずつ減っていく数値を順番に `yield` します。例えば `countdown(3)` は、`3`, `2`, `1` の順に値を生成します。
184+
185+
```python:practice9_1.py
186+
def countdown(start):
187+
188+
189+
# 動作確認
190+
cd_gen = countdown(5)
191+
for i in cd_gen:
192+
print(i)
193+
```
194+
195+
```python-exec:practice9_1.py
196+
(出力例)
197+
5
198+
4
199+
3
200+
2
201+
1
202+
```
203+
204+
### 問題2: 実行時間計測デコレータ
205+
206+
関数の実行時間を計測し、"実行時間: X.XXXX秒" のように表示するデコレータ `@measure_time` を作成してください。このデコレータを、少し時間のかかる処理を行う関数に適用して、動作を確認してみましょう。
207+
208+
**ヒント**: 時間の計測には `time` モジュールが使えます。処理の開始前と終了後で `time.time()` を呼び出し、その差分を計算します。
209+
210+
```python:practice9_2.py
211+
import time
212+
213+
def measure_time(func):
214+
215+
216+
# 動作確認用の時間のかかる関数
217+
@measure_time
218+
def slow_function(n):
219+
print(f"{n}まで数えます...")
220+
time.sleep(n) # n秒間処理を停止
221+
print("完了!")
222+
223+
slow_function(2)
224+
```
225+
226+
```python-exec:practice9_2.py
227+
(出力例)
228+
2まで数えます...
229+
完了!
230+
実行時間: 2.0021
231+
```

0 commit comments

Comments
 (0)