Pythonでできること一覧 - AI・データ分析・Web開発まで

Pythonでできることを網羅的に解説。AI・機械学習、データ分析、Web開発、自動化、ゲーム開発まで、具体的なコード例とともに初心者にも分かりやすく紹介します。

Learning Next 運営
54 分で読めます

Pythonでできること一覧 - AI・データ分析・Web開発まで

Pythonで何ができるか知っていますか?

みなさん、Pythonでどんなことができるか気になっていませんか?

「Pythonを学んでみたいけど、具体的に何ができるの?」 「どの分野でPythonが使われているの?」 「実際にどんなプログラムが作れるの?」

実は、Pythonは驚くほど多くのことができる汎用性の高いプログラミング言語なんです。

この記事では、Pythonでできることを分野別に網羅的に解説します。 具体的なコード例とともに、Pythonの素晴らしい可能性をお伝えしますね!

Pythonの特徴と人気の理由

まず、Pythonがなぜこれほど多くの分野で使われているのかを見てみましょう。

Pythonの主な特徴

Pythonには以下のような素晴らしい特徴があります。

Pythonの魅力:

  • 読みやすい文法:英語に近い自然な記述
  • 豊富なライブラリ:様々な機能を簡単に利用可能
  • クロスプラットフォーム:Windows、Mac、Linuxで動作
  • オープンソース:無料で利用可能
  • 活発なコミュニティ:豊富な情報とサポート

これらの特徴により、初心者から上級者まで幅広く愛用されています。

簡単なコード例を見てみよう

Pythonの読みやすさを実感してみましょう。

# Pythonの読みやすい文法例
def greet_user(name, age):
"""ユーザーに挨拶する関数"""
if age >= 20:
message = f"こんにちは、{name}さん!成人ですね。"
else:
message = f"こんにちは、{name}さん!{20 - age}年後に成人ですね。"
return message
# 使用例
result = greet_user("太郎", 18)
print(result) # こんにちは、太郎さん!2年後に成人ですね。

このコードでは、関数を定義してユーザーに挨拶しています。

条件分岐で年齢をチェックし、f-stringで文字列を組み立てています。 まるで英語を読んでいるような自然な文法で書けるんです。

このように、Pythonは英語に近い自然な文法で書くことができます。

AI・機械学習分野での活躍

PythonはAI・機械学習分野で最も人気の高い言語です。

機械学習ライブラリを使ってみよう

Pythonには強力な機械学習ライブラリが豊富にあります。

# scikit-learn を使った機械学習の例
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# データの読み込み
iris = load_iris()
X, y = iris.data, iris.target
# 訓練用とテスト用にデータを分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# モデルの訓練
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# 予測と精度の評価
predictions = model.predict(X_test)
accuracy = accuracy_score(y_test, predictions)
print(f"予測精度: {accuracy:.2f}")
print(f"予測結果: {predictions}")

このコードでは、有名なアイリス(花)のデータセットで分類を行っています。

train_test_splitでデータを訓練用とテスト用に分けて、RandomForestClassifierで機械学習モデルを作成しています。 たった数行のコードで、高精度な予測モデルが作れてしまうんです。

機械学習がこれほど簡単にできるのは、Pythonならではの魅力です。

ディープラーニングにも挑戦

より高度なAI技術であるディープラーニングも可能です。

# TensorFlow/Keras を使ったニューラルネットワーク
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import numpy as np
# サンプルデータの作成
X = np.random.random((1000, 10)) # 1000件、10特徴量
y = np.random.randint(2, size=(1000, 1)) # バイナリ分類
# モデルの構築
model = Sequential([
Dense(64, activation='relu', input_shape=(10,)),
Dense(32, activation='relu'),
Dense(1, activation='sigmoid')
])
# モデルのコンパイル
model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy']
)
# モデルの訓練
history = model.fit(X, y, epochs=10, batch_size=32, validation_split=0.2)
# 予測
new_data = np.random.random((5, 10))
predictions = model.predict(new_data)
print(f"予測確率: {predictions.flatten()}")

ニューラルネットワークを3層構造で構築しています。

Sequentialでモデルの層を順番に定義し、Denseで全結合層を作成しています。 compileでモデルの学習方法を設定し、fitで実際に学習を実行しているんです。

ディープラーニングのような高度な技術も、Pythonなら直感的に実装できます。

自然言語処理も簡単に

テキストデータの分析も得意分野です。

# 自然言語処理の例(テキスト分析)
import re
from collections import Counter
def analyze_text(text):
"""テキストを分析する関数"""
# テキストの前処理
text = text.lower()
words = re.findall(r'\b\w+\b', text)
# 単語の出現回数をカウント
word_count = Counter(words)
# 結果の表示
print(f"総単語数: {len(words)}")
print(f"ユニーク単語数: {len(word_count)}")
print("出現頻度Top10:")
for word, count in word_count.most_common(10):
print(f" {word}: {count}回")
return word_count
# 使用例
sample_text = """
Pythonは素晴らしいプログラミング言語です。
データ分析や機械学習に最適です。
Pythonを学ぶことで多くの可能性が広がります。
"""
word_frequency = analyze_text(sample_text)

正規表現でテキストから単語を抽出し、Counterで出現回数を数えています。

re.findallで単語境界を考慮した単語抽出を行い、most_commonで頻出単語を取得しています。 たった数行で、本格的なテキスト分析ができてしまうんです。

自然言語処理の基礎も、Pythonなら簡単に始められます。

データ分析・データサイエンスの強力な武器

Pythonはデータ分析分野でも広く使用されています。

データ処理と可視化をマスター

実際のデータを使った分析例を見てみましょう。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# サンプルデータの作成
np.random.seed(42)
data = {
'月': ['1月', '2月', '3月', '4月', '5月', '6月'],
'売上': [1200, 1350, 1100, 1500, 1800, 1650],
'顧客数': [120, 135, 100, 140, 160, 155],
'平均購入額': [10000, 10000, 11000, 10714, 11250, 10645]
}
df = pd.DataFrame(data)
# データの基本情報
print("データの概要:")
print(df.head())
print(f"
データ型:
{df.dtypes}")
# 統計情報
print(f"
統計情報:
{df.describe()}")

pandasでデータフレームを作成し、基本的な情報を表示しています。

head()で最初の数行、dtypesでデータ型、describe()で統計情報を確認できます。 数行のコードで、データの全体像が把握できてしまうんです。

データ分析の第一歩として、まずはデータを理解することが重要です。

続いて、グラフで可視化してみましょう。

# グラフの作成
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
# 売上の推移
axes[0, 0].plot(df['月'], df['売上'], marker='o')
axes[0, 0].set_title('月別売上推移')
axes[0, 0].set_ylabel('売上(万円)')
# 顧客数の推移
axes[0, 1].bar(df['月'], df['顧客数'])
axes[0, 1].set_title('月別顧客数')
axes[0, 1].set_ylabel('顧客数(人)')
# 売上と顧客数の相関
axes[1, 0].scatter(df['顧客数'], df['売上'])
axes[1, 0].set_title('顧客数 vs 売上')
axes[1, 0].set_xlabel('顧客数')
axes[1, 0].set_ylabel('売上')
# 平均購入額の推移
axes[1, 1].plot(df['月'], df['平均購入額'], marker='s', color='green')
axes[1, 1].set_title('平均購入額の推移')
axes[1, 1].set_ylabel('平均購入額(円)')
plt.tight_layout()
plt.show()

matplotlibで4つのグラフを一度に作成しています。

subplotsで複数のグラフを配置し、plotで線グラフ、barで棒グラフ、scatterで散布図を描画しています。 tight_layoutでグラフの配置を自動調整しているんです。

データの傾向や関係性が視覚的に一目で分かるようになります。

データベース操作も簡単

データベースとの連携も得意分野です。

import sqlite3
import pandas as pd
# データベースの作成と接続
conn = sqlite3.connect('sales_data.db')
# テーブルの作成
create_table_sql = """
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
price REAL NOT NULL,
category TEXT NOT NULL,
stock INTEGER NOT NULL
)
"""
conn.execute(create_table_sql)
# サンプルデータの挿入
products_data = [
('ノートPC', 89800, 'Electronics', 50),
('デスクチェア', 15800, 'Furniture', 30),
('コーヒーメーカー', 12800, 'Kitchen', 20),
('本棚', 8900, 'Furniture', 15),
('タブレット', 45800, 'Electronics', 25)
]
conn.executemany(
"INSERT INTO products (name, price, category, stock) VALUES (?, ?, ?, ?)",
products_data
)
# データの読み込みと分析
df = pd.read_sql_query("SELECT * FROM products", conn)
print("商品データ:")
print(df)
# カテゴリ別分析
category_analysis = df.groupby('category').agg({
'price': ['mean', 'min', 'max'],
'stock': 'sum'
}).round(2)
print(f"
カテゴリ別分析:
{category_analysis}")
conn.close()

SQLiteデータベースを作成し、商品データを管理しています。

executemanyで複数のデータを一括挿入し、read_sql_queryでSQL結果をDataFrameに変換しています。 groupbyでカテゴリ別に集計し、aggで複数の統計量を一度に計算しているんです。

データベースからデータを取得して、すぐに分析できるのがPythonの強みです。

Web開発で動的なサイトを作ろう

PythonはWeb開発でも強力な選択肢です。

Flask を使ったWebアプリケーション

軽量なWebフレームワークFlaskで始めてみましょう。

from flask import Flask, render_template, request, jsonify
from datetime import datetime
app = Flask(__name__)
# サンプルデータ
todos = [
{"id": 1, "task": "Pythonの学習", "completed": False, "created_at": "2024-01-01"},
{"id": 2, "task": "プロジェクト作成", "completed": True, "created_at": "2024-01-02"}
]
@app.route('/')
def index():
"""メインページ"""
return render_template('index.html', todos=todos)
@app.route('/api/todos', methods=['GET'])
def get_todos():
"""全てのTODOを取得"""
return jsonify(todos)
@app.route('/api/todos', methods=['POST'])
def create_todo():
"""新しいTODOを作成"""
data = request.get_json()
new_todo = {
"id": len(todos) + 1,
"task": data['task'],
"completed": False,
"created_at": datetime.now().strftime('%Y-%m-%d')
}
todos.append(new_todo)
return jsonify(new_todo), 201
@app.route('/api/todos/<int:todo_id>', methods=['PUT'])
def update_todo(todo_id):
"""TODOを更新"""
todo = next((t for t in todos if t['id'] == todo_id), None)
if not todo:
return jsonify({"error": "TODO not found"}), 404
data = request.get_json()
todo.update(data)
return jsonify(todo)
if __name__ == '__main__':
app.run(debug=True)

Flaskで簡単なTODOアプリのAPIを作成しています。

@app.routeでURL ルートを定義し、HTTPメソッド(GET、POST、PUT)に応じて処理を分岐しています。 jsonifyでJSONレスポンスを返し、request.get_json()でJSONデータを受け取っているんです。

たった数十行で、本格的なWeb APIが作れてしまいます。

Django で本格的なWebアプリも

より大規模なWebアプリケーションにはDjangoが最適です。

# models.py
from django.db import models
from django.contrib.auth.models import User
class Blog(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
class Meta:
ordering = ['-created_at']
# views.py
from django.shortcuts import render, get_object_or_404
from django.http import JsonResponse
from django.core.paginator import Paginator
from .models import Blog
def blog_list(request):
"""ブログ一覧を表示"""
blogs = Blog.objects.all()
paginator = Paginator(blogs, 5) # 1ページに5件
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
return render(request, 'blog/list.html', {'page_obj': page_obj})
def blog_detail(request, blog_id):
"""ブログ詳細を表示"""
blog = get_object_or_404(Blog, id=blog_id)
return render(request, 'blog/detail.html', {'blog': blog})

Djangoでブログシステムのモデルとビューを定義しています。

models.Modelでデータベースモデルを作成し、ForeignKeyでユーザーとの関連を設定しています。 Paginatorでページネーション機能を実装し、get_object_or_404で安全なデータ取得を行っているんです。

Djangoなら、企業レベルのWebアプリケーションも開発できます。

自動化・スクリプトで作業効率アップ

Pythonは日常業務の自動化にも最適です。

ファイル操作を自動化しよう

散らかったファイルを自動で整理するスクリプトを作ってみましょう。

import os
import shutil
from pathlib import Path
def organize_files(source_dir, target_dir):
"""ファイルを種類別に整理する"""
# ファイル種別の定義
file_types = {
'images': ['.jpg', '.jpeg', '.png', '.gif', '.bmp'],
'documents': ['.pdf', '.doc', '.docx', '.txt', '.xlsx'],
'videos': ['.mp4', '.avi', '.mov', '.wmv'],
'archives': ['.zip', '.rar', '.7z', '.tar']
}
source_path = Path(source_dir)
target_path = Path(target_dir)
# ターゲットディレクトリの作成
for category in file_types.keys():
(target_path / category).mkdir(parents=True, exist_ok=True)
moved_files = 0
# ファイルの分類と移動
for file_path in source_path.iterdir():
if file_path.is_file():
file_extension = file_path.suffix.lower()
# ファイル種別を判定
category = 'others'
for cat, extensions in file_types.items():
if file_extension in extensions:
category = cat
break
# ファイルの移動
if category != 'others':
target_file = target_path / category / file_path.name
shutil.move(str(file_path), str(target_file))
moved_files += 1
print(f"移動: {file_path.name} -> {category}/")
print(f"合計 {moved_files} ファイルを整理しました")
# 使用例
# organize_files('/Users/username/Downloads', '/Users/username/OrganizedFiles')

ファイル拡張子に基づいて、自動でフォルダに分類しています。

Pathクラスでファイルパスを操作し、iterdir()でディレクトリ内のファイルを順番に処理しています。 mkdirでフォルダを作成し、shutil.moveでファイルを移動しているんです。

このスクリプトを実行するだけで、散らかったファイルが一瞬で整理されます。

Web スクレイピングで情報収集

Webサイトから自動で情報を収集することもできます。

import requests
from bs4 import BeautifulSoup
import csv
import time
def scrape_news(url, output_file):
"""ニュースサイトから記事情報を取得"""
try:
response = requests.get(url)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
# ニュース記事を取得(サイト構造に応じて調整)
articles = soup.find_all('article', class_='news-item')
news_data = []
for article in articles:
try:
title = article.find('h2').text.strip()
summary = article.find('p', class_='summary').text.strip()
date = article.find('time')['datetime']
link = article.find('a')['href']
news_data.append({
'title': title,
'summary': summary,
'date': date,
'link': link
})
except Exception as e:
print(f"記事の解析でエラー: {e}")
continue
# CSVファイルに保存
with open(output_file, 'w', newline='', encoding='utf-8') as csvfile:
fieldnames = ['title', 'summary', 'date', 'link']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for article in news_data:
writer.writerow(article)
print(f"{len(news_data)}件の記事を {output_file} に保存しました")
except Exception as e:
print(f"スクレイピングでエラー: {e}")
# 日次レポートの自動生成例
def automate_daily_report():
"""日次レポートの自動生成"""
today = datetime.datetime.now().strftime('%Y-%m-%d')
# 複数のニュースサイトから情報収集
news_sources = [
'https://example-news1.com',
'https://example-news2.com'
]
for i, url in enumerate(news_sources):
output_file = f'news_report_{today}_source{i+1}.csv'
scrape_news(url, output_file)
time.sleep(2) # サーバーに負荷をかけないよう待機
print(f"{today}の日次レポート生成完了")

requestsでWebページを取得し、BeautifulSoupでHTMLを解析しています。

find_allで特定のHTML要素を抽出し、csv.DictWriterでCSVファイルに保存しています。 time.sleepでアクセス間隔を調整し、サーバーに負荷をかけないよう配慮しているんです。

このスクリプトにより、毎日の情報収集が自動化できます。

ゲーム開発で楽しくプログラミング

Pythonはゲーム開発でも活用できます。

Pygame でシューティングゲーム

実際にプレイできるゲームを作ってみましょう。

import pygame
import random
import sys
# Pygame の初期化
pygame.init()
# 画面設定
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("シンプルシューティングゲーム")
# 色の定義
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
class Player:
def __init__(self):
self.x = SCREEN_WIDTH // 2
self.y = SCREEN_HEIGHT - 50
self.width = 30
self.height = 30
self.speed = 5
def move(self, keys):
if keys[pygame.K_LEFT] and self.x > 0:
self.x -= self.speed
if keys[pygame.K_RIGHT] and self.x < SCREEN_WIDTH - self.width:
self.x += self.speed
def draw(self, screen):
pygame.draw.rect(screen, BLUE, (self.x, self.y, self.width, self.height))
class Enemy:
def __init__(self):
self.x = random.randint(0, SCREEN_WIDTH - 30)
self.y = 0
self.width = 30
self.height = 30
self.speed = 3
def move(self):
self.y += self.speed
def draw(self, screen):
pygame.draw.rect(screen, RED, (self.x, self.y, self.width, self.height))
def is_off_screen(self):
return self.y > SCREEN_HEIGHT
class Bullet:
def __init__(self, x, y):
self.x = x
self.y = y
self.width = 5
self.height = 10
self.speed = 7
def move(self):
self.y -= self.speed
def draw(self, screen):
pygame.draw.rect(screen, GREEN, (self.x, self.y, self.width, self.height))
def is_off_screen(self):
return self.y < 0

ゲームの基本要素(プレイヤー、敵、弾)をクラスで定義しています。

各クラスにmoveメソッドで移動処理、drawメソッドで描画処理を実装しています。 is_off_screenメソッドで画面外判定を行い、オブジェクトの生死を管理しているんです。

オブジェクト指向プログラミングの考え方で、ゲームの構造を整理できています。

メインゲームループでこれらのクラスを組み合わせて、実際のゲームを動かします。

def main():
clock = pygame.time.Clock()
player = Player()
enemies = []
bullets = []
score = 0
font = pygame.font.Font(None, 36)
# 敵の生成タイマー
enemy_spawn_timer = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
# 弾を発射
bullet = Bullet(player.x + player.width // 2, player.y)
bullets.append(bullet)
# プレイヤーの移動
keys = pygame.key.get_pressed()
player.move(keys)
# 敵の生成
enemy_spawn_timer += 1
if enemy_spawn_timer > 60: # 1秒ごと(60FPS)
enemies.append(Enemy())
enemy_spawn_timer = 0
# 当たり判定
for bullet in bullets[:]:
for enemy in enemies[:]:
if (bullet.x < enemy.x + enemy.width and
bullet.x + bullet.width > enemy.x and
bullet.y < enemy.y + enemy.height and
bullet.y + bullet.height > enemy.y):
bullets.remove(bullet)
enemies.remove(enemy)
score += 10
break
# 画面の描画
screen.fill(WHITE)
player.draw(screen)
for enemy in enemies:
enemy.draw(screen)
for bullet in bullets:
bullet.draw(screen)
# スコアの表示
score_text = font.render(f"Score: {score}", True, BLACK)
screen.blit(score_text, (10, 10))
pygame.display.flip()
clock.tick(60)
pygame.quit()
sys.exit()
if __name__ == "__main__":
main()

ゲームループで全ての処理を統合しています。

イベント処理でキー入力を検知し、タイマーで敵の生成を制御しています。 当たり判定では矩形の重なりを計算し、得点システムも実装しているんです。

Pythonなら、本格的なゲームもこれだけで作れてしまいます。

GUI アプリケーションを作ろう

デスクトップアプリケーションも作成できます。

Tkinter でデータ分析ツール

使いやすいGUIアプリを作ってみましょう。

import tkinter as tk
from tkinter import ttk, filedialog, messagebox
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
class DataAnalyzerApp:
def __init__(self, root):
self.root = root
self.root.title("データ分析ツール")
self.root.geometry("800x600")
self.df = None
self.setup_ui()
def setup_ui(self):
# メニューバー
menubar = tk.Menu(self.root)
self.root.config(menu=menubar)
file_menu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label="ファイル", menu=file_menu)
file_menu.add_command(label="CSVファイルを開く", command=self.load_csv)
file_menu.add_command(label="終了", command=self.root.quit)
# メインフレーム
main_frame = ttk.Frame(self.root, padding="10")
main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
# ファイル読み込みボタン
ttk.Button(main_frame, text="CSVファイルを読み込み",
command=self.load_csv).grid(row=0, column=0, pady=5)
# データ表示エリア
self.tree = ttk.Treeview(main_frame)
self.tree.grid(row=1, column=0, columnspan=2, pady=10, sticky=(tk.W, tk.E, tk.N, tk.S))
# 分析ボタン
analysis_frame = ttk.Frame(main_frame)
analysis_frame.grid(row=2, column=0, columnspan=2, pady=10)
ttk.Button(analysis_frame, text="基本統計",
command=self.show_statistics).pack(side=tk.LEFT, padx=5)
ttk.Button(analysis_frame, text="グラフ作成",
command=self.create_graph).pack(side=tk.LEFT, padx=5)
# 結果表示エリア
self.result_text = tk.Text(main_frame, height=10, width=50)
self.result_text.grid(row=3, column=0, columnspan=2, pady=10, sticky=(tk.W, tk.E))
def load_csv(self):
file_path = filedialog.askopenfilename(
title="CSVファイルを選択",
filetypes=[("CSV files", "*.csv"), ("All files", "*.*")]
)
if file_path:
try:
self.df = pd.read_csv(file_path)
self.display_data()
messagebox.showinfo("成功", "ファイルが正常に読み込まれました")
except Exception as e:
messagebox.showerror("エラー", f"ファイルの読み込みに失敗しました: {e}")
def show_statistics(self):
if self.df is None:
messagebox.showwarning("警告", "データが読み込まれていません")
return
# 統計情報を計算
stats = self.df.describe()
# 結果を表示
self.result_text.delete(1.0, tk.END)
self.result_text.insert(tk.END, "基本統計情報:
")
self.result_text.insert(tk.END, "=" * 50 + "
")
self.result_text.insert(tk.END, str(stats))
def main():
root = tk.Tk()
app = DataAnalyzerApp(root)
root.mainloop()
if __name__ == "__main__":
main()

TkinterでCSVファイルを読み込んで分析するGUIアプリを作成しています。

filedialogでファイル選択ダイアログを表示し、Treeviewでデータを表形式で表示しています。 messageboxでユーザーへの通知を行い、Textウィジェットで分析結果を表示しているんです。

クリック操作だけでデータ分析ができるアプリが完成します。

IoT・ハードウェア制御も可能

PythonはIoT やハードウェア制御にも使用できます。

Raspberry Pi での活用例

実際のセンサーを制御するプログラムを見てみましょう。

# Raspberry Pi での温湿度センサー制御例
import time
import json
from datetime import datetime
import requests
# GPIO制御(Raspberry Pi環境でのみ動作)
try:
import RPi.GPIO as GPIO
import Adafruit_DHT
RASPBERRY_PI = True
except ImportError:
# 開発環境でのシミュレーション
RASPBERRY_PI = False
print("Raspberry Pi環境ではありません。シミュレーションモードで実行します。")
class IoTSensorManager:
def __init__(self):
self.sensor_type = Adafruit_DHT.DHT22 if RASPBERRY_PI else None
self.sensor_pin = 4 # GPIO4番ピン
self.led_pin = 18 # LED用GPIO18番ピン
if RASPBERRY_PI:
GPIO.setmode(GPIO.BCM)
GPIO.setup(self.led_pin, GPIO.OUT)
def read_sensor_data(self):
"""センサーからデータを読み取り"""
if RASPBERRY_PI:
humidity, temperature = Adafruit_DHT.read_retry(
self.sensor_type, self.sensor_pin
)
if humidity is not None and temperature is not None:
return {
'temperature': round(temperature, 1),
'humidity': round(humidity, 1),
'timestamp': datetime.now().isoformat()
}
else:
# シミュレーションデータ
import random
return {
'temperature': round(random.uniform(20, 30), 1),
'humidity': round(random.uniform(40, 70), 1),
'timestamp': datetime.now().isoformat()
}
return None
def control_led(self, status):
"""LED制御"""
if RASPBERRY_PI:
GPIO.output(self.led_pin, GPIO.HIGH if status else GPIO.LOW)
else:
print(f"LED {'ON' if status else 'OFF'} (シミュレーション)")
def send_to_cloud(self, data):
"""クラウドサービスへデータ送信"""
try:
# 例: AWS IoT や Google Cloud IoT への送信
endpoint = "https://your-iot-endpoint.com/api/sensor-data"
response = requests.post(
endpoint,
json=data,
headers={'Content-Type': 'application/json'},
timeout=10
)
if response.status_code == 200:
print("データをクラウドに送信しました")
return True
else:
print(f"送信エラー: {response.status_code}")
return False
except Exception as e:
print(f"送信に失敗しました: {e}")
return False
def run_monitoring(self, interval=60):
"""定期的な監視処理"""
print("IoT監視を開始します...")
try:
while True:
# センサーデータ取得
data = self.read_sensor_data()
if data:
print(f"温度: {data['temperature']}°C, "
f"湿度: {data['humidity']}%")
# 温度に応じてLED制御
if data['temperature'] > 25:
self.control_led(True)
print("高温警告: LED点灯")
else:
self.control_led(False)
# クラウドへデータ送信
self.send_to_cloud(data)
# ローカルファイルにも保存
self.save_local_data(data)
time.sleep(interval)
except KeyboardInterrupt:
print("
監視を停止します...")
finally:
if RASPBERRY_PI:
GPIO.cleanup()

IoTセンサーからデータを取得し、条件に応じてLEDを制御しています。

Adafruit_DHTライブラリで温湿度センサーを読み取り、GPIOでLEDを制御しています。 取得したデータをクラウドに送信し、ローカルファイルにも保存しているんです。

Pythonなら、IoTシステム全体を統合的に制御できます。

API開発で他のシステムと連携

PythonはREST APIの開発にも適しています。

FastAPI で高速API

最後に、高性能なAPIサーバーを作ってみましょう。

from fastapi import FastAPI, HTTPException, Depends
from pydantic import BaseModel
from typing import List, Optional
import sqlite3
from datetime import datetime
app = FastAPI(title="Task Management API", version="1.0.0")
# データモデル
class TaskCreate(BaseModel):
title: str
description: Optional[str] = None
priority: Optional[str] = "medium"
class Task(BaseModel):
id: int
title: str
description: Optional[str]
priority: str
completed: bool
created_at: str
# データベース接続
def get_db():
conn = sqlite3.connect('tasks.db')
conn.row_factory = sqlite3.Row
# テーブル作成
conn.execute('''
CREATE TABLE IF NOT EXISTS tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
description TEXT,
priority TEXT DEFAULT 'medium',
completed BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
conn.commit()
try:
yield conn
finally:
conn.close()
@app.get("/")
def read_root():
"""APIの基本情報"""
return {
"message": "Task Management API",
"version": "1.0.0",
"endpoints": {
"tasks": "/tasks",
"docs": "/docs"
}
}
@app.get("/tasks", response_model=List[Task])
def get_tasks(
completed: Optional[bool] = None,
priority: Optional[str] = None,
db: sqlite3.Connection = Depends(get_db)
):
"""全タスクを取得"""
query = "SELECT * FROM tasks WHERE 1=1"
params = []
if completed is not None:
query += " AND completed = ?"
params.append(completed)
if priority:
query += " AND priority = ?"
params.append(priority)
query += " ORDER BY created_at DESC"
cursor = db.execute(query, params)
tasks = cursor.fetchall()
return [
Task(
id=task['id'],
title=task['title'],
description=task['description'],
priority=task['priority'],
completed=bool(task['completed']),
created_at=task['created_at']
)
for task in tasks
]
@app.post("/tasks", response_model=Task)
def create_task(task: TaskCreate, db: sqlite3.Connection = Depends(get_db)):
"""新しいタスクを作成"""
cursor = db.execute(
"""
INSERT INTO tasks (title, description, priority)
VALUES (?, ?, ?)
""",
(task.title, task.description, task.priority)
)
db.commit()
# 作成されたタスクを取得
task_id = cursor.lastrowid
created_task = db.execute(
"SELECT * FROM tasks WHERE id = ?", (task_id,)
).fetchone()
return Task(
id=created_task['id'],
title=created_task['title'],
description=created_task['description'],
priority=created_task['priority'],
completed=bool(created_task['completed']),
created_at=created_task['created_at']
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)

FastAPIでタスク管理APIを作成しています。

pydanticでデータモデルを定義し、自動的なバリデーションと型チェックを実現しています。 Dependsで依存性注入を使用し、データベース接続を効率的に管理しているんです。

@app.get@app.postなどのデコレータでHTTPメソッドを定義し、自動的にAPIドキュメントも生成されます。

FastAPIなら、企業レベルの高性能APIも簡単に開発できます。

まとめ:Pythonの無限の可能性

Pythonでできることの重要なポイントをまとめます。

Pythonで実現できる分野:

  • AI・機械学習:TensorFlow、scikit-learn で高度な分析
  • データ分析:pandas、matplotlib で効率的なデータ処理
  • Web開発:Flask、Django で本格的なWebアプリケーション
  • 自動化:日常業務の効率化とスクリプト作成
  • ゲーム開発:Pygame でインタラクティブなゲーム
  • GUI アプリ:Tkinter でデスクトップアプリケーション
  • IoT・ハードウェア:Raspberry Pi でのセンサー制御
  • API開発:FastAPI で高性能なRESTful API

Pythonの魅力:

  • 学習しやすい文法
  • 豊富なライブラリ
  • 活発なコミュニティ
  • 幅広い応用分野

Pythonは非常に汎用性が高く、アイデア次第で様々なアプリケーションを開発できます。

まずは興味のある分野から始めて、徐々に他の分野にも挑戦してみましょう。 きっとPythonの素晴らしい世界に魅了されるはずです。

大切なのは、まず一歩踏み出すことです。 ぜひPythonの豊富な可能性を活用して、創造的なプロジェクトを始めてみてくださいね!

関連記事