第7章 Pythonでバックエンドを始める
第6章までで、私たちはフロントエンドの世界を旅してきました。HTMLで文書の構造を、CSSで見た目を、JavaScriptで動きを加えることを学び、ブラウザ上で動作するインタラクティブなページを作り上げました。あの自己紹介ページに、ボタンを押すと色が変わる仕掛けや、フォームに入力した内容をその場で表示する機能を追加したことを覚えていますか? それらはすべて、ブラウザというクライアントの内部だけで完結する処理でした。
しかし、本書の最終目標であるブログアプリを考えてみましょう。記事を書き、保存し、別の日にまた読み返す。そんな機能を実現するには、データを永続的に保存する場所と、クライアントからの要求に応じてデータを処理する仕組みが必要です。これがバックエンドの役割です。バックエンドとは、ユーザーの目に触れないサーバー側で動作し、データベースとのやり取りやビジネスロジックの実行を担う部分を指します。
第1章で、私たちは`python -m http.server`というコマンドを実行し、あの「Hello, World!」と表示される静的なHTMLファイルを、サーバーを介してブラウザに届ける体験をしました。あのときPythonは、単にファイルを読み込んで送り出すだけの、ごく単純な役割を果たしていました。しかしPythonの真価は、もっと複雑で動的な処理を書けることにあります。まるで、料理を提供するだけの配膳ロボットが、やがてレシピを記憶し、食材の在庫を管理し、注文に応じて異なる料理を調理するシェフへと進化するように。
本章では、そのシェフを育成するための第一歩を踏み出します。具体的には、プログラミング言語Pythonの基礎を徹底的に学びます。変数、データ型、条件分岐、ループ、リストや辞書といったデータ構造。これらはまるで、料理人の道具箱にある包丁や計量カップのようなものです。一つひとつの使い方をマスターし、やがて複雑なレシピ(プログラム)を組み立てられるようになりましょう。
ここで学んだ知識は、第8章以降で登場するFlaskというWebフレームワークを使いこなすための、絶対に欠かせない土台となります。また、バックエンド開発の具体的なイメージとして言えば、本章の後半で学ぶファイル入出力や例外処理は、実際にWebサーバーがHTTPリクエストを処理し、データを保存・取得する仕組みの基礎になります。焦らず、一歩ずつ進んでいきましょう。
7.1 Pythonの世界への招待
Pythonは、読みやすさと書きやすさを重視して設計されたプログラミング言語です。その文法は非常にシンプルで、英語の文章を読むような感覚でコードを記述できます。例えば、画面に文字を表示する命令は`print`、ユーザーからの入力を受け取る命令は`input`です。この直感的なわかりやすさが、Pythonが世界中の初心者からプロフェッショナルまで広く愛される理由の一つです。
さあ、まずはPythonと対話するための準備をしましょう。第1章でPythonのインストールと動作確認は済ませているはずです。念のため、コマンドプロンプト(Windows)またはターミナル(Mac)で`python --version`と入力して、Python 3系が正しくインストールされていることを確認してください。もし「python: command not found」などと表示される場合は、第1章の手順に戻ってPythonのインストールとパス設定を再度行ってください。
#### 7.1.1 Pythonインタプリタと初めての対話
Pythonには、コードを一行ずつ実行しながら結果を確認できるインタプリタという対話モードが用意されています。ターミナルで`python`と入力してEnterキーを押すと、プロンプトが`>>>`に変わり、Pythonがあなたの入力を待っている状態になります。
```python
>>> print("こんにちは、Pythonの世界へようこそ!")
こんにちは、Pythonの世界へようこそ!
```
素晴らしい! あなたは今、Pythonに直接話しかけ、その返事を受け取りました。この`print()`関数は、括弧の中に記述した内容を画面に出力するための命令です。文字列はダブルクォーテーション`"`またはシングルクォーテーション`'`で囲みます。これがPythonの基本的なルールです。
```python
>>> 'これはシングルクォートで囲んだ文字列です'
'これはシングルクォートで囲んだ文字列です'
```
このように、文字列を入力すると、そのまま結果として表示されます。しかし、通常は`print()`関数を使うほうが明示的で、後述するファイルに書くプログラムでも正しく動作します。これからは、特に指示がない限り`print()`を使うようにしましょう。
#### 7.1.2 電卓としてのPython
Pythonは、何より優れた電卓としても機能します。四則演算(足し算、引き算、掛け算、割り算)はもちろん、べき乗や余りの計算も一瞬です。
```python
>>> 10 + 5
15
>>> 10 - 5
5
>>> 10 * 5
50
>>> 10 / 3
3.3333333333333335
>>> 10 // 3 # 整数除算(商の整数部分)
3
>>> 10 % 3 # 余り
1
>>> 10 ** 3 # 10の3乗(べき乗)
1000
```
注意すべき点は、普通の割り算`/`の結果が小数点を含む小数(浮動小数点数)になることと、`//`を使うと結果が整数に丸められることです。また、``が掛け算で、`*`がべき乗であることも覚えておきましょう。
この電卓機能は、後述する変数や関数と組み合わせることで、複雑なビジネスロジックを計算するための強力な武器になります。
7.2 データの入れ物:変数とデータ型
プログラムは、データを処理するためにあります。そのデータを一時的に保管しておくための「入れ物」が変数です。変数には好きな名前をつけて、値を代入することができます。
```python
>>> message = "今日の天気は晴れです"
>>> print(message)
今日の天気は晴れです
```
ここでは、`message`という名前の変数を作り、そこに文字列`"今日の天気は晴れです"`を入れました。そして、`print(message)`とすることで、変数の中身を取り出して表示しています。変数名はわかりやすく、意味のある名前をつけるのが良い習慣です。例えば、ユーザーの名前を格納する変数なら`user_name`、商品の価格なら`price`といった具合です。
#### 7.2.1 データの種類:データ型
変数に入れるデータには、いくつかの種類(型)があります。これをデータ型と呼びます。代表的なものを以下に挙げます。
| 型の名前 | 説明 | 例 |
| :--- | :--- | :--- |
| `int` (整数) | 整数値 | `100`, `-5`, `0` |
| `float` (浮動小数点数) | 小数点を含む数値 | `3.14`, `-0.5`, `2.0` |
| `str` (文字列) | 文字の並び | `"Hello"`, `'Python'` |
| `bool` (ブーリアン) | 真偽値 | `True`, `False` |
Pythonでは、変数に値を代入するときに、自動的に型が決まります。この仕組みを動的型付けと呼びます。例えば、`age = 25`と書けば、変数`age`は自動的に整数型`int`になります。`name = "田中"`と書けば、自動的に文字列型`str`になります。
```python
>>> age = 25
>>> type(age)
>>> name = "田中"
>>> type(name)
>>> price = 99.99
>>> type(price)
>>> is_student = True
>>> type(is_student)
```
`type()`関数を使うと、その変数がどの型なのかを調べることができます。異なる型どうしで演算を行うと、エラーになることがあります。例えば、文字列と数値を足そうとするとエラーになります。
```python
>>> "年齢は" + age
Traceback (most recent call last):
File "", line 1, in
TypeError: can only concatenate str (not "int") to str
```
このような場合は、数値を文字列に変換する`str()`関数を使って、文字列どうしにしてから結合する必要があります。
```python
>>> "年齢は" + str(age) + "歳です"
'年齢は25歳です'
```
あるいは、f文字列(フォーマット済み文字列)と呼ばれる便利な記法を使うこともできます。文字列の前に`f`を付け、変数を波括弧`{}`で囲むだけです。
```python
>>> f"年齢は{age}歳です"
'年齢は25歳です'
```
f文字列は非常に直感的で、複数の変数を埋め込む際にも活躍します。本書でも積極的に使っていきます。
7.3 プログラムに判断をさせる:条件分岐
プログラムが単純な処理を上から順に実行するだけでは、複雑な状況に対応できません。「もし雨が降っていたら傘を持っていく、そうでなければ持っていかない」――このような判断は、日常生活で当たり前のように行っています。プログラミングでも、この「もし〜ならば」という条件に応じて処理を分岐させる仕組みが必要です。それが条件分岐であり、Pythonでは`if`文を使って表現します。
#### 7.3.1 if文の基本
`if`文の基本構造は以下の通りです。
```python
if 条件式:
条件が真(True)のときに実行する処理
```
重要なのは、条件式の後にコロン`:`を記述し、その次の行からインデント(字下げ)をして処理を書くことです。Pythonはインデントによってコードのブロック(まとまり)を表現します。このインデントは、半角スペース4つで1段とするのが標準的なルールです。VS Codeなどのエディタでは、Tabキーを押すと自動的に適切なインデントが挿入されます。
```python
>>> age = 20
>>> if age >= 18:
... print("あなたは成人です。")
...
あなたは成人です。
```
`>>>`の後に`...`というプロンプトが表示されました。これは、if文のブロックがまだ続いていることを示しています。`print()`の行を入力した後、Enterキーをもう一度押すことでブロックが終了し、実行結果が表示されます。
#### 7.3.2 複数の条件を処理する:elif と else
条件が偽(False)だった場合の処理を追加したいときは、`else`を使います。さらに、別の条件を追加したいときは`elif`(else ifの略)を使います。
例えば、テストの点数に応じて成績を判定するプログラムを考えてみましょう。点数が90以上なら「A」、80以上なら「B」、70以上なら「C」、それ未満なら「不合格」と表示します。
```python
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "不合格"
print(f"あなたの成績は{grade}です。")
```
このプログラムは、変数`score`の値に応じて、`grade`に異なる文字列を代入します。`score`が85の場合、最初の`if score >= 90`は偽なのでスキップされ、次の`elif score >= 80`が評価されます。これが真なので、`grade`に`"B"`が代入され、その後の`elif`や`else`は実行されません。このように、`if`文は上から順に評価され、最初に真になった条件のブロックだけが実行される仕組みです。
条件式には、数値の比較以外にも、文字列の一致や真偽値そのものを利用することもできます。
```python
name = "山田"
if name == "山田":
print("山田さん、こんにちは!")
is_logged_in = True
if is_logged_in:
print("ログイン済みです。")
else:
print("ログインしてください。")
```
`==`は「等しい」を表す比較演算子です。単一の`=`は代入なので注意しましょう。また、`if is_logged_in:`のように、真偽値の変数そのものを条件に使うこともできます。これは非常に簡潔で、Pythonic(Pythonらしい)な書き方です。
7.4 同じ処理を繰り返す:ループ
人間が同じ作業を何百回も繰り返すのは苦痛ですが、コンピュータはそれを得意とします。プログラミングで「繰り返し」を記述するための構文がループです。Pythonには、主に`for`文と`while`文の2種類があります。
#### 7.4.1 for文:決まった回数だけ繰り返す
`for`文は、リストや文字列などの「イテラブル(繰り返し可能なオブジェクト)」の要素をひとつずつ取り出しながら、ブロック内の処理を繰り返します。
```python
fruits = ["りんご", "バナナ", "オレンジ"]
for fruit in fruits:
print(fruit)
```
このコードは、リスト`fruits`の中にある3つの文字列を、順番に`fruit`という変数に代入しながら、`print()`で表示します。実行結果は以下の通りです。
```
りんご
バナナ
オレンジ
```
繰り返しの回数を数値で指定したい場合は、`range()`関数を使います。
```python
for i in range(5):
print(f"{i}回目のループ")
```
`range(5)`は、`0`から始まって`4`までの整数を順に生成します。つまり、`0, 1, 2, 3, 4`の5回分繰り返されます。出力結果はこちらです。
```
0回目のループ
1回目のループ
2回目のループ
3回目のループ
4回目のループ
```
ループカウンタの変数名は、よく`i`、`j`、`k`といった短い名前が使われます。これは伝統的な慣習ですが、特別な意味があるわけではありません。
#### 7.4.2 while文:条件が真の間、繰り返す
`while`文は、指定した条件が真(`True`)である限り、ブロック内の処理を繰り返します。条件が永遠に真のままにならないように注意が必要です。
```python
count = 0
while count >> colors = ["赤", "青", "緑", "黄"]
>>> print(colors[0]) # 最初の要素
赤
>>> print(colors[2]) # 3番目の要素
緑
>>> print(colors[-1]) # 最後の要素
黄
```
インデックスに負の数を指定すると、リストの末尾から数えた位置の要素を取得できます。`-1`が最後の要素、`-2`が最後から2番目です。
リストに要素を追加するには`append()`メソッド、特定の位置に挿入するには`insert()`メソッド、削除するには`remove()`メソッドや`pop()`メソッドを使います。また、リストの長さを取得するには`len()`関数を使います。
```python
>>> colors.append("紫") # 末尾に追加
>>> len(colors) # リストの長さを取得
5
>>> colors.insert(1, "橙") # インデックス1の位置に挿入
>>> colors.remove("黄") # 指定した値を削除
>>> popped = colors.pop() # 末尾の要素を取り出して削除
>>> print(colors)
['赤', '橙', '青', '緑']
```
リストは、for文と組み合わせることで真価を発揮します。例えば、買い物リストの各項目を順に表示したり、ゲームのスコア一覧から平均値を計算したりと、アイデア次第で無限の可能性が広がります。`append()`で動的に要素を追加し、`len()`で要素数を把握する――この組み合わせは、後々のWebアプリ開発でも頻繁に使う基本パターンです。
#### 7.5.2 辞書:キーと値のペア
辞書は、キー(Key)と値(Value)のペアを波括弧`{}`で囲んで表現します。リストがインデックス番号で要素を特定するのに対し、辞書はキーを使って値を取り出します。
```python
>>> student = {
... "name": "佐藤",
... "age": 20,
... "grade": "B"
... }
>>> print(student["name"])
佐藤
>>> print(student.get("age"))
20
```
辞書に新しいキーと値を追加したり、既存の値を更新したりするのは、代入と同じ要領です。
```python
>>> student["city"] = "東京" # 新しいキーを追加
>>> student["grade"] = "A" # 既存の値を更新
>>> print(student)
{'name': '佐藤', 'age': 20, 'grade': 'A', 'city': '東京'}
```
辞書からすべてのキーを取得するには`keys()`メソッド、すべての値を取得するには`values()`メソッドを使います。
```python
>>> list(student.keys())
['name', 'age', 'grade', 'city']
>>> list(student.values())
['佐藤', 20, 'A', '東京']
```
辞書は、データに意味のあるラベル(キー)をつけて管理できるため、複雑なデータを扱う際に非常に便利です。例えば、ブログアプリの「記事」を表すデータも、タイトル、本文、作成日時、著者などをキーに持つ辞書として表現できるでしょう。このように、辞書とリストを組み合わせることで、現実世界の複雑なデータ構造を柔軟に表現できます。
7.6 処理を部品化する:関数
プログラムが長くなり、同じような処理が何度も登場するようになると、コードは重複だらけで見通しが悪くなります。そんなときに役立つのが関数です。関数は、特定の処理をひとまとまりにした部品のようなもので、名前を付けて呼び出すことができます。料理で例えるなら、「卵を割って混ぜる」という一連の動作に「卵を溶く」という名前をつけるようなものです。
#### 7.6.1 関数の定義と基本形
関数を定義するには、`def`キーワードを使います。
```python
def greet():
print("こんにちは!")
print("今日もいい天気ですね。")
```
これで`greet`という名前の関数ができました。この関数を呼び出すには、単に関数名の後に括弧`()`を付けます。
```python
>>> greet()
こんにちは!
今日もいい天気ですね。
```
関数は、呼び出されるたびに、定義されたブロック内のコードを上から順に実行します。
#### 7.6.2 引数と戻り値
関数は、外部から値を受け取って処理を行うことができます。この受け取る値を引数(ひきすう)と呼びます。また、処理結果を呼び出し元に返すことができ、これを戻り値(もどりち)と呼びます。戻り値を返すには`return`文を使います。
```python
def add(x, y):
result = x + y
return result
sum = add(5, 3)
print(f"5 + 3 の結果は {sum} です。")
```
この例では、`add`関数が2つの引数`x`と`y`を受け取り、それらを足した結果を`return`で返しています。呼び出し元では、戻り値を変数`sum`に代入しています。
#### 7.6.3 デフォルト引数と可変長引数
関数の引数には、デフォルト値を設定することができます。これをデフォルト引数と呼びます。もし呼び出し時に引数が指定されなかった場合、デフォルト値が使われます。
```python
def introduce(name, age=30):
print(f"私は{name}です。年齢は{age}歳です。")
introduce("田中") # ageはデフォルトの30が使われる
introduce("鈴木", 25) # ageに25が渡される
```
また、何個の引数が渡されるかわからない場合に使えるのが可変長引数です。引数の前にアスタリスク`*`を1つ付けると、複数の引数をタプルとして受け取ることができます。
```python
def sum_all(*numbers):
total = 0
for n in numbers:
total += n
return total
print(sum_all(1, 2, 3)) # 6
print(sum_all(10, 20, 30, 40)) # 100
```
関数を使いこなせるようになると、コードの再利用性が格段に向上し、複雑な処理をシンプルに記述できるようになります。本書の後半でも頻繁に登場するので、しっかりと体得しましょう。
7.7 外部の力を借りる:モジュールのインポート
Pythonの強力な魅力の一つは、豊富な標準ライブラリとサードパーティ製のパッケージが揃っていることです。これらは「モジュール」や「パッケージ」と呼ばれる形式で提供され、`import`文を使って簡単に自分のプログラムに取り込むことができます。まるで、有名シェフが開発した特製ソースのレシピを、自分の料理に取り入れるようなものです。
#### 7.7.1 import文の基本
モジュールをインポートするには、`import モジュール名`と書きます。例えば、数学に関する関数が詰まった`math`モジュールをインポートしてみましょう。
```python
import math
print(math.pi) # 円周率
print(math.sqrt(16)) # 平方根(結果は4.0)
```
モジュール名の後にドット`.`を付け、その後に使いたい関数や定数を指定します。`math.pi`は円周率、`math.sqrt()`は平方根を計算する関数です。
特定の関数だけをインポートしたい場合は、`from モジュール名 import 関数名`という構文を使います。
```python
from math import pi, sqrt
print(pi)
print(sqrt(25))
```
この方法を使うと、モジュール名を省略して直接関数を呼び出せます。便利ですが、異なるモジュールで同名の関数が存在する場合に競合する可能性があるため、注意が必要です。
#### 7.7.2 自分でモジュールを作る
実は、自分で書いたPythonファイル(拡張子`.py`)も、そのままモジュールとしてインポートできます。例えば、`mytools.py`というファイルを作り、その中に関数`say_hello`を定義したとします。
```python
mytools.py
def say_hello(name):
return f"こんにちは、{name}さん!"
```
別のファイル(またはインタプリタ)で、このモジュールをインポートして使うことができます。
```python
import mytools
message = mytools.say_hello("小林")
print(message)
```
この仕組みを使えば、自分で作った便利な関数を、様々なプログラムで使い回すことができるようになります。第8章以降でFlaskアプリを構築する際も、このように機能を分割してモジュール化することが、コードの整理整頓に役立ちます。
7.8 データの永続化:ファイル入出力
プログラムが動いている間だけ存在するデータは、電源を切れば消えてしまうコンピュータのメモリ上の情報に過ぎません。ブログアプリの記事のように、後日再びアクセスできるようにするためには、データをファイルとしてハードディスクなどに保存する必要があります。これがファイル入出力です。料理で言えば、作り終えた料理のレシピをノートに書き留めておくようなものです。
#### 7.8.1 ファイルに書き込む
ファイルにデータを書き込むには、まず`open()`関数でファイルを開き、書き込みモード(`'w'`)を指定します。その後、`write()`メソッドでデータを書き込み、最後に`close()`メソッドでファイルを閉じます。
```python
file = open("diary.txt", "w", encoding="utf-8")
file.write("今日はPythonの勉強をしました。
")
file.write("関数の概念が少しわかってきました。
")
file.close()
```
`encoding="utf-8"`は、日本語を含むテキストファイルを扱う際に、文字化けを防ぐために重要な指定です。書き込みモード`'w'`で開くと、既存のファイルがある場合はその内容がすべて上書きされてしまうので注意しましょう。追記したい場合は、追記モード`'a'`を使います。
より安全で簡潔な方法として、`with`文を使うことをお勧めします。`with`文を使うと、ブロックを抜けるときに自動的にファイルが閉じられるため、`close()`を忘れる心配がありません。
```python
with open("diary.txt", "a", encoding="utf-8") as file:
file.write("明日はリストについて学ぶ予定です。
")
```
#### 7.8.2 ファイルから読み込む
ファイルを読み込むには、読み込みモード(`'r'`)で開きます。内容をすべて一度に読み込むには`read()`メソッド、一行ずつ読み込むには`readline()`メソッド、すべての行をリストとして読み込むには`readlines()`メソッドを使います。
```python
with open("diary.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
```
このコードは、先ほど書き込んだ`diary.txt`の内容をすべて読み込み、画面に表示します。ファイルが見つからない場合など、エラーが発生する可能性があることに注意が必要です。そのための仕組みが、次の節で学ぶ例外処理です。
7.9 想定外の事態に備える:例外処理
プログラムが完璧に動作するとは限りません。ユーザーが存在しないファイルを開こうとしたり、ゼロで割り算をしようとしたり、ネットワークが切断されたり――。こうしたエラー(例外)が発生した場合、プログラムはそのまま異常終了してしまうことがあります。しかし、適切に例外処理を行えば、エラーが発生してもプログラムがクラッシュするのを防ぎ、ユーザーにわかりやすいメッセージを表示するなどの対処ができます。
#### 7.9.1 try-except文
例外処理の基本は、`try`ブロック内にエラーが発生しそうな処理を書き、`except`ブロックでエラー発生時の処理を記述する方法です。
```python
try:
number = int(input("数字を入力してください: "))
result = 10 / number
print(f"10 ÷ {number} の結果は {result} です。")
except ValueError:
print("エラー:数字以外が入力されました。")
except ZeroDivisionError:
print("エラー:0で割ることはできません。")
except Exception as e:
print(f"予期せぬエラーが発生しました:{e}")
```
このコードでは、`int()`による変換に失敗すると`ValueError`が、`10 / number`で`number`が0だと`ZeroDivisionError`が発生します。それぞれの例外に対して、適切なエラーメッセージを表示するようにしています。最後の`except Exception as e:`は、上記の例外以外のすべてのエラーをキャッチするための「虫取り網」のようなものです。`e`にはエラーの詳細情報が格納されます。
#### 7.9.2 finally節とelse節
`try-except`文には、オプションで`else`節と`finally`節を追加できます。
- else節: 例外が発生しなかった場合にのみ実行される処理を記述します。
- finally節: 例外の発生有無にかかわらず、必ず最後に実行される処理を記述します。ファイルの後片付けなど、必ず行いたい処理に使います。
```python
try:
file = open("config.txt", "r", encoding="utf-8")
data = file.read()
except FileNotFoundError:
print("設定ファイルが見つかりません。デフォルト設定を使用します。")
else:
print("設定ファイルの読み込みに成功しました。")
finally:
try:
file.close()
except NameError:
pass # ファイルが開かれていない場合は何もしない
```
`finally`節は、ファイルのクローズやデータベース接続の切断など、リソースの解放処理を確実に行うために重宝します。ちなみに、`with`文を使えば、こうした`finally`節を自分で書く必要はほとんどなくなります。
7.10 バックエンドの世界への第一歩:仮想環境とpipの紹介
本章の最後に、第8章以降でFlaskを使うために必要な、二つの重要な概念を紹介します。それが仮想環境とpipです。
pipは、Pythonのパッケージ管理ツールです。Pythonで追加のライブラリ(Flaskなど)をインストールするときに使います。例えば、ターミナルで次のように入力すると、Flaskをインストールできます。
```bash
pip install flask
```
仮想環境は、プロジェクトごとにPythonの実行環境を分離する仕組みです。例えば、あるプロジェクトではFlaskのバージョン2.0を使い、別のプロジェクトではバージョン3.0を使うといった場合に、互いの影響を受けずに開発できます。仮想環境の作成と有効化は、以下の手順で行います。
```bash
仮想環境の作成(プロジェクトのフォルダ内で実行)
python -m venv venv
仮想環境の有効化(Windows)
venv\Scripts\activate
仮想環境の有効化(Mac/Linux)
source venv/bin/activate
```
仮想環境を有効化した状態で`pip install flask`を実行すると、その仮想環境の中だけにFlaskがインストールされます。これらの概念は、本書の範囲では詳細までは扱いませんが、「後で必要になる道具」として頭の片隅に入れておいてください。
7.11 実践:簡単なメモ帳プログラムを作ろう
ここまで学んだ知識を総動員して、実際に動作する簡単なプログラムを作ってみましょう。テーマは「コマンドラインで動作する簡易メモ帳」です。ユーザーが新しいメモを追加したり、保存されているメモの一覧を表示したりできる、シンプルなユーティリティプログラムです。
まずは、プログラムの設計を考えます。
1. メモは一つのテキストファイル(`memo.txt`)に保存する。
2. プログラムを起動すると、メニューを表示し、ユーザーの選択を待つ。
3. メニューには「1: メモを追加」「2: メモを表示」「3: 終了」を用意する。
4. ユーザーが「1」を選んだら、新しいメモの内容を入力させ、ファイルに追記する。
5. ユーザーが「2」を選んだら、ファイルの内容をすべて読み込んで表示する。
6. ユーザーが「3」を選ぶまで、メニューを繰り返し表示する。
7. ファイルが存在しない場合のエラーにも対応する。
それでは、この設計に基づいてコードを書いてみましょう。ファイル名を`memo_app.py`とします。
```python
import os
FILENAME = "memo.txt"
def show_menu():
"""メニューを表示する関数"""
print("
===== 簡易メモ帳 =====")
print("1: メモを追加")
print("2: メモを表示")
print("3: 終了")
print("====================")
def add_memo():
"""メモをファイルに追加する関数"""
content = input("メモの内容を入力してください: ")
with open(FILENAME, "a", encoding="utf-8") as file:
file.write(content + "
")
print("メモを保存しました。")
def show