Pythonでできること一覧 - AI・データ分析・Web開発まで
Pythonでできることを網羅的に解説。AI・機械学習、データ分析、Web開発、自動化、ゲーム開発まで、具体的なコード例とともに初心者にも分かりやすく紹介します。
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_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestClassifierfrom 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 tffrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Denseimport 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 refrom 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 pdimport matplotlib.pyplot as pltimport 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 sqlite3import 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, jsonifyfrom 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.pyfrom django.db import modelsfrom 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.pyfrom django.shortcuts import render, get_object_or_404from django.http import JsonResponsefrom django.core.paginator import Paginatorfrom .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 osimport shutilfrom 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 requestsfrom bs4 import BeautifulSoupimport csvimport 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 pygameimport randomimport sys
# Pygame の初期化pygame.init()
# 画面設定SCREEN_WIDTH = 800SCREEN_HEIGHT = 600screen = 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 tkfrom tkinter import ttk, filedialog, messageboximport pandas as pdimport matplotlib.pyplot as pltfrom 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 timeimport jsonfrom datetime import datetimeimport requests
# GPIO制御(Raspberry Pi環境でのみ動作)try: import RPi.GPIO as GPIO import Adafruit_DHT RASPBERRY_PI = Trueexcept 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, Dependsfrom pydantic import BaseModelfrom typing import List, Optionalimport sqlite3from 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の豊富な可能性を活用して、創造的なプロジェクトを始めてみてくださいね!