Python入門|初心者が最初に作るべきアプリ5選【コード付き】

Python初心者が最初に作るべきアプリを5つ厳選!コード付きで解説するから、コピペして動かすだけで学べるよ。

Python初心者アプリ開発プログラミング入門

「Pythonの基本文法は一通りやった。でも次に何を作ればいいかわからない…」

これ、Python初心者あるあるの悩みだよね。

教材でprint()やfor文は書けるようになったけど、「じゃあ実際に何か作ってみよう」ってなると、急に手が止まる。何を作ればいいのか、どのくらいの規模感が適切なのか、全然わからない。

僕も完全に同じ状態だった。Progateを3周くらいした後、「で、何作ろう…」って1週間くらいフリーズしてた。

でも安心してほしい。最初に作るべきアプリには「正解」がある。

この記事では、Python初心者が基本文法を学んだ直後に作るべきアプリを5つ、完全なコード付きで紹介する。どれも100行以内で作れて、「おお、動いた!」という達成感を味わえるものばかり。

順番にやっていけば、Pythonの実践力がグングン伸びるよ。

プログラミングを始める

なぜ「作ること」が大事なのか

最初に少しだけ、なぜ実際にアプリを作ることが重要なのかを話させてほしい。

プログラミング学習には**インプット(教材で学ぶ)アウトプット(実際に作る)**の2種類がある。多くの初心者はインプットに偏りがち。教材を何周もしたり、新しい本を買ったり、別の動画講座を始めたり…

でも、プログラミングスキルが伸びるのは、圧倒的にアウトプットの時間。

料理と同じだよね。レシピ本を100冊読んでも、実際に包丁を握って料理しなければ上達しない。

「作る → エラーが出る → 調べる → 直す → 動く」

このサイクルを回すことで、知識が「使えるスキル」に変わる。

だから、基本文法を一通り学んだら、すぐに何かを作り始めよう。完璧じゃなくていい。動けばいい。

作るべきアプリ5選のポイント

今回紹介する5つのアプリは、以下の基準で選んだ。

  • 基本文法(変数、条件分岐、ループ、関数)だけで作れる
  • 100行以内のコードで完成する
  • 「動いた!」という達成感がある
  • 段階的に難易度が上がる
  • 実用性があって、「作ってよかった」と思える

では早速いってみよう。

Pythonの基本をまだ学んでいない人へ

この記事は基本文法を一通り学んだ人向け。まだの人は、まずProgateやUdemyで基礎を固めよう。

プログラミング学習を始める →

アプリ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エクスポート機能

Python学習を効率的に進めたいなら

独学でつまずきやすいポイントを、プロの講師がサポートしてくれるスクールがおすすめ。無料体験もあるよ。

プログラミングスクールを見てみる →

アプリ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モジュールを使ってるから、日付操作の練習にもなる。

Pythonの次のステップに進みたいなら

基本アプリが作れたら、次はWebアプリやデータ分析に挑戦!体系的に学べるスクールで効率よくステップアップしよう。

スクールの無料体験を試す →

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を開いて、じゃんけんゲームから始めよう。

Pythonで副業・転職を目指すなら

基本アプリが作れるようになったら、次は実務レベルのスキルを身につけよう。プロのサポートで最短ルートを進める。

無料カウンセリングに申し込む →
広告

Colosoでプロから学ぶ

業界トップの講師によるオンライン講座。買い切り型で何度でも復習可能。

Colosoを見る →