Python入門|初心者が最初に作るべきアプリ5選【コード付き】
Python初心者が最初に作るべきアプリを5つ厳選!コード付きで解説するから、コピペして動かすだけで学べるよ。
「Pythonの基本文法は一通りやった。でも次に何を作ればいいかわからない…」
これ、Python初心者あるあるの悩みだよね。
教材でprint()やfor文は書けるようになったけど、「じゃあ実際に何か作ってみよう」ってなると、急に手が止まる。何を作ればいいのか、どのくらいの規模感が適切なのか、全然わからない。
僕も完全に同じ状態だった。Progateを3周くらいした後、「で、何作ろう…」って1週間くらいフリーズしてた。
でも安心してほしい。最初に作るべきアプリには「正解」がある。
この記事では、Python初心者が基本文法を学んだ直後に作るべきアプリを5つ、完全なコード付きで紹介する。どれも100行以内で作れて、「おお、動いた!」という達成感を味わえるものばかり。
順番にやっていけば、Pythonの実践力がグングン伸びるよ。
なぜ「作ること」が大事なのか
最初に少しだけ、なぜ実際にアプリを作ることが重要なのかを話させてほしい。
プログラミング学習には**インプット(教材で学ぶ)とアウトプット(実際に作る)**の2種類がある。多くの初心者はインプットに偏りがち。教材を何周もしたり、新しい本を買ったり、別の動画講座を始めたり…
でも、プログラミングスキルが伸びるのは、圧倒的にアウトプットの時間。
料理と同じだよね。レシピ本を100冊読んでも、実際に包丁を握って料理しなければ上達しない。
「作る → エラーが出る → 調べる → 直す → 動く」
このサイクルを回すことで、知識が「使えるスキル」に変わる。
だから、基本文法を一通り学んだら、すぐに何かを作り始めよう。完璧じゃなくていい。動けばいい。
作るべきアプリ5選のポイント
今回紹介する5つのアプリは、以下の基準で選んだ。
- 基本文法(変数、条件分岐、ループ、関数)だけで作れる
- 100行以内のコードで完成する
- 「動いた!」という達成感がある
- 段階的に難易度が上がる
- 実用性があって、「作ってよかった」と思える
では早速いってみよう。
アプリ1:じゃんけんゲーム
学べること
- 条件分岐(if/elif/else) の実践的な使い方
- randomモジュール の基本
- ユーザー入力 の受け取り方
- ループ処理 で繰り返しプレイ
完成コード
import random
def janken():
hands = {"グー": 0, "チョキ": 1, "パー": 2}
win_count = 0
lose_count = 0
draw_count = 0
print("=" * 30)
print(" じゃんけんゲーム!")
print(" (「やめる」で終了)")
print("=" * 30)
while True:
user_input = input("\nグー・チョキ・パーを入力: ")
if user_input == "やめる":
break
if user_input not in hands:
print("グー、チョキ、パーのどれかを入力してね!")
continue
cpu_hand = random.choice(list(hands.keys()))
print(f"CPUの手: {cpu_hand}")
user_num = hands[user_input]
cpu_num = hands[cpu_hand]
if user_num == cpu_num:
print("→ あいこ!")
draw_count += 1
elif (user_num - cpu_num) % 3 == 2:
print("→ あなたの勝ち!")
win_count += 1
else:
print("→ あなたの負け...")
lose_count += 1
print(f"\n【結果】{win_count}勝 {lose_count}敗 {draw_count}引き分け")
total = win_count + lose_count + draw_count
if total > 0:
print(f"勝率: {win_count / total * 100:.1f}%")
janken()
解説
ポイントは勝敗判定のロジック。「グー=0、チョキ=1、パー=2」と数値に変換して、差の余りで判定している。
(user_num - cpu_num) % 3 == 2 これで勝ちを判定できる仕組み。数学的でスマートでしょ?
最初は「if グー and チョキ then 勝ち…」みたいに全パターン書きがちだけど、こういうスマートな書き方を知ると、プログラミングの面白さがわかってくる。
カスタマイズのアイデア
- 連勝記録を表示する機能を追加
- 5回勝負で先に3勝した方が勝ちルール
- CPU側に「前の手を覚えて対策する」AIを実装
アプリ2:パスワード生成ツール
学べること
- 文字列操作 の実践
- randomモジュール の応用(random.choices)
- stringモジュール の活用
- 関数の設計 — 引数でカスタマイズ可能にする
完成コード
import random
import string
def generate_password(length=12, use_upper=True, use_digits=True, use_symbols=True):
chars = string.ascii_lowercase # a-z
if use_upper:
chars += string.ascii_uppercase # A-Z
if use_digits:
chars += string.digits # 0-9
if use_symbols:
chars += "!@#$%&*+-="
# 最低1文字ずつ含める
password = []
password.append(random.choice(string.ascii_lowercase))
if use_upper:
password.append(random.choice(string.ascii_uppercase))
if use_digits:
password.append(random.choice(string.digits))
if use_symbols:
password.append(random.choice("!@#$%&*+-="))
# 残りをランダムに埋める
remaining = length - len(password)
password.extend(random.choices(chars, k=remaining))
# シャッフルして返す
random.shuffle(password)
return ''.join(password)
def main():
print("=" * 30)
print(" パスワード生成ツール")
print("=" * 30)
try:
length = int(input("文字数(8以上推奨): "))
except ValueError:
length = 12
print("無効な入力。12文字で生成します。")
count = int(input("生成する個数: ") or "5")
print(f"\n生成されたパスワード({length}文字 × {count}個):")
print("-" * 30)
for i in range(count):
pw = generate_password(length)
print(f" {i+1}. {pw}")
main()
解説
実はこれ、実用性がかなり高いアプリ。自分で使えるパスワードを即座に生成できる。
ポイントはgenerate_password関数の設計。引数にデフォルト値を設定しているから、呼び出すときに何も指定しなくてもいい感じに動く。これが関数設計の基本。
また、「最低1文字ずつ各種文字を含める」処理を入れているのもポイント。完全ランダムだと、たまに数字が1つも入らないパスワードが生成されちゃうからね。
アプリ3:家計簿アプリ(ファイル保存対応)
学べること
- ファイル操作(open, read, write)
- データ構造(辞書、リスト)
- JSON形式 でのデータ保存
- メニュー方式のUI 設計
完成コード
import json
import os
from datetime import datetime
FILE_PATH = "kakeibo.json"
def load_data():
if os.path.exists(FILE_PATH):
with open(FILE_PATH, "r", encoding="utf-8") as f:
return json.load(f)
return []
def save_data(data):
with open(FILE_PATH, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
def add_entry(data):
print("\n【支出を追加】")
date = input("日付(例: 2026-04-03): ") or datetime.now().strftime("%Y-%m-%d")
category = input("カテゴリ(食費/交通費/娯楽/その他): ")
try:
amount = int(input("金額: "))
except ValueError:
print("金額は数字で入力してください。")
return
memo = input("メモ: ")
entry = {
"date": date,
"category": category,
"amount": amount,
"memo": memo
}
data.append(entry)
save_data(data)
print(f"✓ {date} {category} {amount}円 を追加しました!")
def show_summary(data):
if not data:
print("データがありません。")
return
print("\n【支出サマリー】")
total = sum(item["amount"] for item in data)
categories = {}
for item in data:
cat = item["category"]
categories[cat] = categories.get(cat, 0) + item["amount"]
print(f"合計: {total:,}円")
print("-" * 25)
for cat, amount in sorted(categories.items(), key=lambda x: x[1], reverse=True):
ratio = amount / total * 100
bar = "█" * int(ratio / 5)
print(f" {cat:<6} {amount:>8,}円 ({ratio:4.1f}%) {bar}")
def show_history(data):
if not data:
print("データがありません。")
return
print("\n【支出履歴(直近10件)】")
for item in data[-10:]:
print(f" {item['date']} | {item['category']:<6} | {item['amount']:>8,}円 | {item['memo']}")
def main():
data = load_data()
while True:
print("\n" + "=" * 30)
print(" 家計簿アプリ")
print("=" * 30)
print(" 1. 支出を追加")
print(" 2. サマリーを表示")
print(" 3. 履歴を表示")
print(" 4. 終了")
choice = input("\n選択(1-4): ")
if choice == "1":
add_entry(data)
elif choice == "2":
show_summary(data)
elif choice == "3":
show_history(data)
elif choice == "4":
print("お疲れさまでした!")
break
main()
解説
これはファイル操作の練習に最適なアプリ。JSON形式でデータを保存するから、アプリを閉じてもデータが消えない。
show_summary関数では、カテゴリ別の集計と簡易棒グラフを表示している。データを可視化する楽しさが味わえるよ。
カスタマイズのアイデア
- 月別の集計機能
- 予算設定と残額表示
- CSVエクスポート機能
アプリ4:クイズゲーム
学べること
- 辞書のリスト を使ったデータ管理
- ランダム出題 の仕組み
- スコア管理 のロジック
- 文字列フォーマット の実践
完成コード
import random
<div class="cta-box">
<h3>プロから学べるオンライン講座 Coloso</h3>
<p>業界トップクラスの講師陣による実践的なオンライン講座。買い切り型で何度でも復習可能。EPC633円の高収益プログラム。</p>
<a href="https://px.a8.net/svt/ejp?a8mat=4B1ATN+E5N8S2+5Q4A+5YJRM" class="cta-btn" rel="nofollow">Colosoの講座を見る →</a>
<img border="0" width="1" height="1" src="https://www16.a8.net/0.gif?a8mat=4B1ATN+E5N8S2+5Q4A+5YJRM" alt="">
</div>
quizzes = [
{
"question": "Pythonの作者は誰?",
"choices": ["A. ジェームズ・ゴスリン", "B. グイド・ヴァンロッサム", "C. ブレンダン・アイク", "D. デニス・リッチー"],
"answer": "B"
},
{
"question": "Pythonでリストに要素を追加するメソッドは?",
"choices": ["A. add()", "B. push()", "C. append()", "D. insert()"],
"answer": "C"
},
{
"question": "Pythonのインデントに使うのは?",
"choices": ["A. 中括弧{}", "B. セミコロン;", "C. スペースまたはタブ", "D. 括弧()"],
"answer": "C"
},
{
"question": "PythonでNoneは何を表す?",
"choices": ["A. 0", "B. 空文字列", "C. False", "D. 値がないこと"],
"answer": "D"
},
{
"question": "リスト内包表記の正しい構文は?",
"choices": ["A. [x for x in range(10)]", "B. {x for x in range(10)}", "C. (x for x in range(10))", "D. <x for x in range(10)>"],
"answer": "A"
},
{
"question": "Pythonで型を確認する関数は?",
"choices": ["A. typeof()", "B. type()", "C. check()", "D. class()"],
"answer": "B"
},
{
"question": "Pythonの正式名称の由来は?",
"choices": ["A. ニシキヘビ", "B. モンティ・パイソン", "C. パイソン島", "D. ギリシャ神話のPython"],
"answer": "B"
},
]
def run_quiz():
print("=" * 35)
print(" Pythonクイズ!(全5問)")
print("=" * 35)
selected = random.sample(quizzes, min(5, len(quizzes)))
score = 0
for i, quiz in enumerate(selected, 1):
print(f"\n【第{i}問】{quiz['question']}")
for choice in quiz["choices"]:
print(f" {choice}")
user_answer = input("答え(A/B/C/D): ").upper()
if user_answer == quiz["answer"]:
print("正解!")
score += 1
else:
print(f"不正解... 正解は {quiz['answer']} でした。")
print("\n" + "=" * 35)
print(f" 結果: {score} / {len(selected)} 問正解!")
if score == len(selected):
print(" パーフェクト!すごい!")
elif score >= len(selected) * 0.6:
print(" なかなかやるね!")
else:
print(" もう一回チャレンジしてみよう!")
run_quiz()
解説
このアプリはデータ構造の練習に最適。辞書をリストに格納して、それをランダムに取り出すという処理は、実務でもよく使うパターン。
random.sample()で重複なしのランダム抽出をしているのもポイント。random.choice()との違いを理解しておくと便利だよ。
カスタマイズのアイデア
- 問題をファイルから読み込む機能
- 難易度別の出題
- 正答率の記録・表示
- 制限時間の追加
アプリ5:ToDoリスト(ファイル保存 + 期限管理)
学べること
- CRUD操作(作成・読取・更新・削除)の基本
- 日付操作 (datetimeモジュール)
- ステータス管理 のロジック
- データの永続化
完成コード
import json
import os
from datetime import datetime, timedelta
FILE_PATH = "todos.json"
def load_todos():
if os.path.exists(FILE_PATH):
with open(FILE_PATH, "r", encoding="utf-8") as f:
return json.load(f)
return []
def save_todos(todos):
with open(FILE_PATH, "w", encoding="utf-8") as f:
json.dump(todos, f, ensure_ascii=False, indent=2)
def add_todo(todos):
title = input("タスク名: ")
days = input("期限(何日後?空欄で期限なし): ")
todo = {
"title": title,
"done": False,
"created": datetime.now().strftime("%Y-%m-%d"),
"deadline": None
}
if days.isdigit():
deadline = datetime.now() + timedelta(days=int(days))
todo["deadline"] = deadline.strftime("%Y-%m-%d")
todos.append(todo)
save_todos(todos)
print(f"「{title}」を追加しました!")
def show_todos(todos):
if not todos:
print("タスクはありません。")
return
print("\n【ToDoリスト】")
today = datetime.now().strftime("%Y-%m-%d")
for i, todo in enumerate(todos):
status = "[完了]" if todo["done"] else "[未完了]"
deadline_str = ""
warning = ""
if todo["deadline"]:
deadline_str = f" (期限: {todo['deadline']})"
if not todo["done"] and todo["deadline"] <= today:
warning = " ← 期限切れ!"
print(f" {i+1}. {status} {todo['title']}{deadline_str}{warning}")
def complete_todo(todos):
show_todos(todos)
if not todos:
return
try:
num = int(input("完了にする番号: ")) - 1
if 0 <= num < len(todos):
todos[num]["done"] = True
save_todos(todos)
print(f"「{todos[num]['title']}」を完了にしました!")
else:
print("無効な番号です。")
except ValueError:
print("数字で入力してください。")
def delete_todo(todos):
show_todos(todos)
if not todos:
return
try:
num = int(input("削除する番号: ")) - 1
if 0 <= num < len(todos):
removed = todos.pop(num)
save_todos(todos)
print(f"「{removed['title']}」を削除しました。")
else:
print("無効な番号です。")
except ValueError:
print("数字で入力してください。")
def main():
todos = load_todos()
while True:
print("\n" + "=" * 30)
print(" ToDoリスト")
print("=" * 30)
print(" 1. タスク追加")
print(" 2. タスク一覧")
print(" 3. タスク完了")
print(" 4. タスク削除")
print(" 5. 終了")
choice = input("\n選択(1-5): ")
if choice == "1":
add_todo(todos)
elif choice == "2":
show_todos(todos)
elif choice == "3":
complete_todo(todos)
elif choice == "4":
delete_todo(todos)
elif choice == "5":
print("お疲れさまでした!")
break
main()
解説
このアプリはCRUD操作の集大成。Create(追加)、Read(表示)、Update(完了)、Delete(削除)という4つの基本操作を全部カバーしている。
この4つは、Webアプリでもスマホアプリでも、あらゆるアプリの基本。ToDoリストで練習しておけば、どんなアプリを作るときにも応用が効くよ。
期限管理の部分ではdatetimeモジュールを使ってるから、日付操作の練習にもなる。
5つのアプリを作った後のロードマップ
5つのアプリを全部作り終えたら、かなりの力がついているはず。次のステップとして、以下の方向に進むのがおすすめ。
方向1:Webアプリに挑戦(Flask / Django)
ここまで作ったのはコマンドラインアプリ。次はブラウザで動くWebアプリに挑戦しよう。
PythonのWebフレームワーク「Flask」を使えば、ToDoリストをWebアプリ化できる。やることは大きく変わらないけど、HTMLとCSSの知識が必要になるよ。
方向2:データ分析(pandas / matplotlib)
家計簿アプリで集計処理を書いたよね。あの延長線上にあるのがデータ分析。pandasとmatplotlibを覚えれば、CSVデータの分析とグラフ化が自在にできるようになる。
方向3:自動化スクリプト(openpyxl / selenium)
業務効率化に興味があるなら、Excel操作の自動化やWebブラウザの自動操作に進もう。副業の案件にも直結するスキルだよ。
方向4:API連携
天気情報API、ニュースAPI、ChatGPT APIなど、外部サービスのAPIを叩くプログラムを作ってみよう。requestsライブラリの使い方を覚えれば、データの取得と加工ができるようになる。
学習効率を最大化する3つのコツ
コツ1:コピペで動かしてから改造する
この記事のコードは、まずそのままコピペして動かしてほしい。「動いた」を確認してから、少しずつ改造していく。
「ここを変えたらどうなるんだろう?」という好奇心が、最高の学習エンジンになる。
コツ2:エラーを怖がらない
プログラミングはエラーとの戦い。エラーが出ることは「悪いこと」じゃなくて、「学びのチャンス」。
エラーメッセージをよく読んで、何が原因なのかを考えるクセをつけよう。最初は意味がわからなくても、繰り返すうちに読めるようになるから。
コツ3:GitHubにアップする
作ったアプリはGitHubにアップしよう。ポートフォリオになるし、コードのバージョン管理も覚えられる。転職活動のときにも「こんなの作りました」ってアピールできるよ。
よくある質問
Q. どのくらいの期間で5つ全部作れる?
1日1つペースなら5日、週末にまとめてやるなら1〜2週間。自分のペースでOK。大事なのは全部作り切ること。
Q. エラーが出て動かないんだけど…
エラーメッセージをそのままGoogleに貼り付けてみて。Pythonは利用者が多いから、ほぼ確実に解決策が見つかるよ。それでもダメなら、ChatGPTにエラーメッセージを貼って聞くのも有効。
Q. もっと難しいアプリを作りたい
この5つが全部スムーズに作れたなら、次は外部ライブラリを使ったアプリに挑戦しよう。requestsでAPI連携、FlaskでWebアプリ、pandasでデータ分析など、選択肢は無限にある。
まとめ:まずは手を動かそう
Python初心者が最初に作るべきアプリ5選をまとめるとこうなる。
| アプリ | 学べるスキル | 難易度 |
|---|---|---|
| じゃんけんゲーム | 条件分岐、random | ★☆☆☆☆ |
| パスワード生成ツール | 文字列操作、関数設計 | ★★☆☆☆ |
| 家計簿アプリ | ファイル操作、JSON | ★★★☆☆ |
| クイズゲーム | データ構造、ランダム抽出 | ★★★☆☆ |
| ToDoリスト | CRUD操作、日付管理 | ★★★★☆ |
プログラミングは「読む」より「書く」、「書く」より「作る」で伸びる。
この記事のコードをコピペして、まずは動かしてみて。そして少しずつ改造してみて。「あ、自分でアプリが作れた」っていう体験は、プログラミング学習で一番テンションが上がる瞬間だから。
さあ、今すぐVS Codeを開いて、じゃんけんゲームから始めよう。