Pythonのアプリ開発の練習方法①外部APIの連携
外部APIとの連携は、Pythonアプリケーション開発のスキルを向上させるために役立つ練習方法です。requestsライブラリを使用すると、天気予報APIやニュースAPI、画像認識APIなどさまざまな外部サービスのデータを取得して処理できます。
APIからのデータ取得は通常JSON形式のため、Pythonの辞書形式に変換して操作する技術が身につきます。レスポンスのステータスコードやエラーハンドリングを適切に処理することで、運用環境で起こりうる問題への対応スキルも養われるでしょう。
定期的にAPIにアクセスしてデータを収集し、分析や可視化を行うアプリケーションを開発すると、応用力が高まります。cronジョブやPythonのスケジューリングライブラリと組み合わせることで、自動化されたデータ収集システムを構築する経験も積むことが可能です。
【サンプルコード】
import requests
import json
from datetime import datetime
def get_weather_data(city):
# OpenWeatherMap APIの例
api_key = "あなたのAPIキー"
base_url = "https://api.openweathermap.org/data/2.5/weather"
params = {
"q": city,
"appid": api_key,
"units": "metric",
"lang": "ja"
}
response = requests.get(base_url, params=params)
if response.status_code == 200:
data = response.json()
return {
"都市": city,
"気温": data["main"]["temp"],
"湿度": data["main"]["humidity"],
"天気": data["weather"][0]["description"],
"取得時刻": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
else:
return {"エラー": f"APIリクエスト失敗: {response.status_code}"}
weather_info = get_weather_data("Tokyo")
print(json.dumps(weather_info, indent=4, ensure_ascii=False))
【実行結果】
{
"都市": "Tokyo",
"気温": 22.5,
"湿度": 65,
"天気": "晴れ",
"取得時刻": "2025-03-18 14:30:45"
}
行番号 | 詳細説明 |
---|---|
1行目 | requestsとjson、datetimeをインポート |
2行目 | get_weather_data関数を定義 |
3行目 | OpenWeatherMapのAPIキーと基本URLを設定 |
4行目 | パラメータとして都市名やAPIキーなどを用意 |
5行目 | requests.getでAPIを呼び出しレスポンスを取得 |
6行目 | status_codeが200の場合はJSONデータをパースして返却 |
7行目 | それ以外の場合はエラーメッセージを返却 |
8行目 | get_weather_dataを呼び出して返却結果をprint関数で表示 |
「Python」を学べるコードキャンプのサービス
Pythonのアプリ開発の練習方法②フレームワークの使用
Webアプリケーション開発のスキルを高めるには、FlaskやDjangoなどのフレームワークを活用した練習が役立ちます。これらのフレームワークを使用することによって、ルーティングやテンプレートエンジン、データベース操作などを統合的に学べます。
Flaskは軽量で学習曲線が緩やかなため、初心者がWebアプリケーション開発の基本概念を理解するのに適しています。小規模なプロジェクトから始めて徐々に機能を追加することで、MVCアーキテクチャやRESTful APIの設計原則を学べます。
また、ユーザー認証やデータの永続化、フォーム処理などを実装することでアプリケーション開発の経験を積めます。異なるエンドポイントやHTTPメソッド(GET、POST、PUT、DELETEなど)の使い分けを練習すると、WebアプリケーションのRESTful設計への理解が深まるでしょう。
【サンプルコード】
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///tasks.db'
db = SQLAlchemy(app)
class Task(db.Model):
id = db.Column(db.Integer, primary_key=True)
content = db.Column(db.String(200), nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
completed = db.Column(db.Boolean, default=False)
def __repr__(self):
return f''
with app.app_context():
db.create_all()
@app.route('/')
def index():
tasks = Task.query.order_by(Task.created_at.desc()).all()
return render_template('index.html', tasks=tasks)
@app.route('/add_task', methods=['POST'])
def add_task():
task_content = request.form['content']
new_task = Task(content=task_content)
db.session.add(new_task)
db.session.commit()
return redirect(url_for('index'))
@app.route('/toggle/')
def toggle_task(task_id):
task = Task.query.get_or_404(task_id)
task.completed = not task.completed
db.session.commit()
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug=True)
【実行結果】
* Serving Flask app
* Debug mode: on
* Running on http://127.0.0.1:5000
* Restarting with stat
* Debugger is active!
* Debugger PIN: 123-456-789
127.0.0.1 - - [18/Mar/2025 14:45:12] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [18/Mar/2025 14:45:20] "POST /add_task HTTP/1.1" 302 -
127.0.0.1 - - [18/Mar/2025 14:45:20] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [18/Mar/2025 14:45:25] "GET /toggle/1 HTTP/1.1" 302 -
127.0.0.1 - - [18/Mar/2025 14:45:25] "GET / HTTP/1.1" 200 -
行番号 | 詳細説明 |
---|---|
1行目 | FlaskとSQLAlchemy、datetimeをインポート |
2行目 | Flaskアプリを作成しデータベースを設定 |
3行目 | Taskクラスを定義しSQLAlchemyのモデルとして使用 |
4行目 | アプリ起動時にdb.create_allでテーブルを作成 |
5行目 | '/'ルートでタスク一覧を表示するindex関数を定義 |
6行目 | /add_taskで新規タスクを追加してリダイレクト |
7行目 | /toggle/ |
8行目 | メインモジュールとしてdebug=Trueでアプリを起動 |
Pythonのアプリ開発の練習方法③GUIアプリの作成
PythonでGUIアプリケーションを作成することは、デスクトップアプリケーション開発のスキルを高めるために良い練習方法の内の一つです。TkinterやPyQt、wxPythonなどのライブラリを使い、ボタンやテキストフィールドなどのウィジェットを組み合わせたインターフェースを構築する技術を身につけられます。
イベント駆動型プログラミングの概念を理解することは、GUIアプリケーション開発において重要です。ユーザーの操作(ボタンクリックやキー入力など)に応じて関数を実行するイベントハンドラを設計することで、インタラクティブなアプリケーションの仕組みも学べます。
レイアウト管理やスタイリング、データバインディングなどを学ぶと、アプリケーション開発のスキルがより身につきます。単純な電卓アプリから始めて、徐々にファイル管理ツールやデータ可視化アプリのように複雑な機能へ発展させることで、GUIプログラミングの理解を深められるでしょう。
【サンプルコード】
import tkinter as tk
from tkinter import messagebox
class SimpleCalculator:
def __init__(self, master):
self.master = master
master.title("シンプル電卓")
master.geometry("300x400")
master.configure(bg="#f0f0f0")
self.result_var = tk.StringVar()
self.result = tk.Entry(master, textvariable=self.result_var, font=('Arial', 20),
bd=10, insertwidth=4, width=14, justify='right')
self.result.grid(row=0, column=0, columnspan=4, padx=10, pady=10)
button_texts = [
('7', 1, 0), ('8', 1, 1), ('9', 1, 2), ('/', 1, 3),
('4', 2, 0), ('5', 2, 1), ('6', 2, 2), ('*', 2, 3),
('1', 3, 0), ('2', 3, 1), ('3', 3, 2), ('-', 3, 3),
('0', 4, 0), ('C', 4, 1), ('=', 4, 2), ('+', 4, 3)
]
for (text, row, col) in button_texts:
button = tk.Button(master, text=text, font=('Arial', 15),
width=4, height=2, command=lambda t=text: self.button_click(t))
button.grid(row=row, column=col, padx=5, pady=5)
def button_click(self, value):
current = self.result_var.get()
if value == 'C':
self.result_var.set("")
elif value == '=':
try:
result = eval(current)
self.result_var.set(result)
except Exception as e:
messagebox.showerror("エラー", "計算式が無効です")
self.result_var.set("")
else:
self.result_var.set(current + value)
if __name__ == "__main__":
root = tk.Tk()
calculator = SimpleCalculator(root)
root.mainloop()
【実行結果】
# Tkinterウィンドウが開き、シンプルな電卓インターフェースが表示されます
# ボタンをクリックして数式を入力し、「=」を押すと計算結果が表示されます
# 「C」ボタンで入力をクリアできます
# 例えば「2+3*4=」と入力すると「14」が表示されます
行番号 | 詳細説明 |
---|---|
1行目 | tkinterとmessageboxをインポート |
2行目 | SimpleCalculatorクラスを定義して初期設定を実施 |
3行目 | 電卓画面のタイトルやサイズ、背景色を設定 |
4行目 | 計算結果表示用のEntryウィジェットを配置 |
5行目 | 電卓のボタンを二次元配置で作成 |
6行目 | button_click関数で入力値を処理し結果を表示 |
7行目 | mainloopを呼び出してGUIアプリを起動 |
Pythonのアプリ開発の練習方法③既存アプリに機能追加
既存のアプリケーションに新機能を追加する練習を行うことによって、開発現場で必要とされるスキルを身につけることが出来ます。オープンソースのプロジェクトやチュートリアルで作成したアプリケーションを拡張すると、他人のコードを理解し、新しい機能を実装する能力を養えます。
機能追加では、既存のコードベースに合わせたコーディングスタイルやアーキテクチャを意識することが大切です。リファクタリングをしながら新機能を追加することで、コードの保守性や拡張性への理解が深まり、プログラミングの知識を広げられます。
ユニットテストやドキュメント作成なども含めて練習すると、本格的な開発プロセスを経験できます。バージョン管理システム(Gitなど)で変更履歴を管理しながら機能追加を行うことで、チーム開発における協働作業の流れも体験できるでしょう。
既存のToDo管理アプリに優先度と期限日を追加する方法
具体例の一つとして、既存のToDo管理アプリに「優先度と期限日を追加する前のコード(実装前) 」と「優先度と期限日を追加した後のコード(実装後)」を比較できるようにまとめます。初心者が既存アプリに機能を追加してアプリを作る練習として、どの部分を拡張したかを学びながらアプリ開発やアプリ作成を進める方法の参考にしてください。
# 実装前コード
import json
import os
from datetime import datetime
class TodoApp:
def __init__(self, filename="todos.json"):
self.filename = filename
self.todos = self._load_todos()
def _load_todos(self):
if os.path.exists(self.filename):
with open(self.filename, 'r', encoding='utf-8') as f:
return json.load(f)
return []
def _save_todos(self):
with open(self.filename, 'w', encoding='utf-8') as f:
json.dump(self.todos, f, ensure_ascii=False, indent=2)
def add_task(self, title, description=""):
task = {
"id": len(self.todos) + 1,
"title": title,
"description": description,
"completed": False,
"created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
self.todos.append(task)
self._save_todos()
return task["id"]
def complete_task(self, task_id):
for task in self.todos:
if task["id"] == task_id:
task["completed"] = True
self._save_todos()
return True
return False
# 実装前アプリの使用例
if __name__ == "__main__":
app = TodoApp()
task_id = app.add_task("レポート作成", "期末レポートを仕上げる")
app.complete_task(task_id)
print("タスク一覧:", app.todos)
行番号 | 詳細説明 |
---|---|
1行目 | jsonやos、datetimeをインポート |
2行目 | TodoAppクラスを定義し、既存のタスクを読み込み |
3行目 | _load_todosメソッドでJSONファイルからタスクを読み込み |
4行目 | _save_todosメソッドでタスクをファイルに保存 |
5行目 | add_taskで新しいタスクを追加 |
6行目 | complete_taskでタスクを完了状態に変更 |
7行目 | 使用例としてタスクを追加しcomplete_taskで完了に設定 |
# 実装後コード
import json
import os
from datetime import datetime, timedelta
class TodoApp:
def __init__(self, filename="todos.json"):
self.filename = filename
self.todos = self._load_todos()
def _load_todos(self):
if os.path.exists(self.filename):
with open(self.filename, 'r', encoding='utf-8') as f:
return json.load(f)
return []
def _save_todos(self):
with open(self.filename, 'w', encoding='utf-8') as f:
json.dump(self.todos, f, ensure_ascii=False, indent=2)
def add_task(self, title, description=""):
task = {
"id": len(self.todos) + 1,
"title": title,
"description": description,
"completed": False,
"created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
self.todos.append(task)
self._save_todos()
return task["id"]
def complete_task(self, task_id):
for task in self.todos:
if task["id"] == task_id:
task["completed"] = True
self._save_todos()
return True
return False
# ここから新機能の追加
def set_priority(self, task_id, priority):
if priority not in ["high", "medium", "low"]:
raise ValueError("優先度は'high', 'medium', 'low'のいずれかである必要があります")
for task in self.todos:
if task["id"] == task_id:
task["priority"] = priority
self._save_todos()
return True
return False
def set_due_date(self, task_id, days_from_now):
due_date = (datetime.now() + timedelta(days=days_from_now)).strftime("%Y-%m-%d")
for task in self.todos:
if task["id"] == task_id:
task["due_date"] = due_date
self._save_todos()
return True
return False
def get_tasks_by_priority(self, priority):
return [task for task in self.todos if task.get("priority") == priority]
def get_overdue_tasks(self):
today = datetime.now().strftime("%Y-%m-%d")
return [
task for task in self.todos
if "due_date" in task and task["due_date"] < today and not task["completed"]
]
# 実装後アプリの使用例
if __name__ == "__main__":
app = TodoApp()
task_id = app.add_task("レポート作成", "期末レポートを仕上げる")
app.set_priority(task_id, "high")
app.set_due_date(task_id, 7)
task_id2 = app.add_task("買い物", "牛乳と卵を買う")
app.set_priority(task_id2, "medium")
app.set_due_date(task_id2, 1)
high_priority_tasks = app.get_tasks_by_priority("high")
print("高優先度タスク:", json.dumps(high_priority_tasks, indent=2, ensure_ascii=False))
行番号 | 詳細説明 |
---|---|
1行目 | jsonやos、datetime、timedeltaをインポート |
2行目 | 従来のTodoAppクラスを定義し既存の機能を維持 |
3行目 | 新機能としてset_priorityで優先度を設定 |
4行目 | set_due_dateで期限日を指定 |
5行目 | get_tasks_by_priorityで優先度別のタスク取得 |
6行目 | get_overdue_tasksで期限切れタスクを取得 |
7行目 | 使用例として2つのタスクに優先度と期限日を設定後、結果を表示 |
※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。
ITやプログラミングに関するコラム
- 【Python】エクセルの作業を自動化する例を紹介
- 【Python】ファイルがあるのに「no such file or directory」エラーになる原因
- Pythonで何ができる?趣味にも活用する方法などを解説
- 【Excel】半角を全角、全角を半角に変換する方法