10. Python の便利な活用方法

前回は統計の基礎について学びました。今回は、Pythonのより実践的な使い方を学んでいきましょう。

10.1 タプルやセットでデータを扱う簡単な方法

リスト以外のデータ構造を学びます:

タプルとセットの基本的な使い方

# タプル(値を変更できないリスト)
point = (3, 4)  # x座標とy座標
print(f"x座標:{point[0]}, y座標:{point[1]}")

# 複数の値を一度に返す
def get_circle_info(radius):
    area = 3.14 * radius ** 2
    circumference = 2 * 3.14 * radius
    return (area, circumference)  # タプルで返す

# タプルで受け取る
area, circum = get_circle_info(5)

# セット(重複しない要素の集合)
fruits = {"りんご", "バナナ", "みかん"}
fruits.add("りんご")  # 重複は追加されない
print(fruits)  # {'りんご', 'バナナ', 'みかん'}

# セットの演算
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
print(f"和集合:{set1 | set2}")  # 1,2,3,4,5,6
print(f"積集合:{set1 & set2}")  # 3,4

10.2 ファイルからの読み込み・書き込みでデータ保存

ファイル操作の基本を学びます:

メモをファイルに保存するプログラム

# テキストファイルへの書き込み
with open("memo.txt", "w", encoding="utf-8") as file:
    file.write("こんにちは!\n")
    file.write("Pythonの勉強中です\n")

# テキストファイルの読み込み
with open("memo.txt", "r", encoding="utf-8") as file:
    content = file.read()
    print(content)

# 1行ずつ読み込む
with open("memo.txt", "r", encoding="utf-8") as file:
    for line in file:
        print(f"行の内容:{line.strip()}")

# CSVファイルの操作
import csv

# CSVファイルへの書き込み
data = [
    ["名前", "点数"],
    ["太郎", 85],
    ["花子", 92]
]
with open("scores.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerows(data)

# CSVファイルの読み込み
with open("scores.csv", "r", encoding="utf-8") as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)

10.3 標準ライブラリで日付や時間を扱う

日付と時間の処理方法を学びます:

日付と時間の処理

from datetime import datetime, timedelta

# 現在の日時を取得
now = datetime.now()
print(f"現在:{now}")

# 日時のフォーマット
formatted = now.strftime("%Y年%m月%d日 %H時%M分")
print(formatted)

# 日付の計算
tomorrow = now + timedelta(days=1)
next_week = now + timedelta(weeks=1)
print(f"明日:{tomorrow.date()}")
print(f"来週:{next_week.date()}")

# 期間の計算
birthday = datetime(2024, 12, 25)
days_until = (birthday - now).days
print(f"誕生日まであと{days_until}日")

# 曜日の取得
weekdays = ["月", "火", "水", "木", "金", "土", "日"]
today_weekday = weekdays[now.weekday()]
print(f"今日は{today_weekday}曜日です")

10.4 アルゴリズムとは?シンプルな例で考える

簡単なアルゴリズムを実装してみます:

線形探索と二分探索

# 線形探索(リストから特定の値を探す)
def linear_search(numbers, target):
    for i, num in enumerate(numbers):
        if num == target:
            return i  # 見つかった位置を返す
    return -1  # 見つからなかった

# 二分探索(ソート済みリストで効率的に探す)
def binary_search(numbers, target):
    left = 0
    right = len(numbers) - 1

    while left <= right:
        mid = (left + right) // 2
        if numbers[mid] == target:
            return mid
        elif numbers[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1

# バブルソート(単純なソートアルゴリズム)
def bubble_sort(numbers):
    n = len(numbers)
    for i in range(n):
        for j in range(n - 1 - i):
            if numbers[j] > numbers[j + 1]:
                numbers[j], numbers[j + 1] = numbers[j + 1], numbers[j]
    return numbers

# アルゴリズムのテスト
numbers = [4, 2, 7, 1, 9, 3]
print(f"ソート前:{numbers}")
sorted_numbers = bubble_sort(numbers.copy())
print(f"ソート後:{sorted_numbers}")

10.5 random モジュールでランダムな数字を生成する

乱数の基本的な使い方を学びます:

ランダムな数字を生成する

import random

# ランダムな整数を生成
dice = random.randint(1, 6)  # サイコロ
print(f"サイコロ:{dice}")

# リストからランダムに選択
fruits = ["りんご", "バナナ", "みかん", "ぶどう"]
selected = random.choice(fruits)
print(f"選ばれた果物:{selected}")

# リストをシャッフル
numbers = list(range(1, 6))  # [1, 2, 3, 4, 5]
random.shuffle(numbers)
print(f"シャッフル後:{numbers}")

# 複数の要素をランダムに選択
winners = random.sample(fruits, 2)
print(f"当選した果物:{winners}")

# 0から1の間の小数を生成
probability = random.random()
print(f"確率:{probability:.2f}")

10.6 ガチャの確率をシミュレーションをしてみよう

ゲームのガチャシステムをシミュレートします:

ガチャの確率をシミュレーションする

import random
from collections import Counter

def gacha_simulation(pulls):
    # アイテムと確率の設定
    items = {
        "SSR": 0.03,  # 3%
        "SR": 0.12,   # 12%
        "R": 0.85     # 85%
    }

    # ガチャを引く
    results = []
    for _ in range(pulls):
        probability = random.random()
        cumulative = 0
        for rarity, chance in items.items():
            cumulative += chance
            if probability <= cumulative:
                results.append(rarity)
                break

    # 結果の集計
    count = Counter(results)

    # 結果の表示
    print(f"\n{pulls}回ガチャを引いた結果:")
    for rarity, num in count.items():
        percentage = (num / pulls) * 100
        print(f"{rarity}: {num}回 ({percentage:.1f}%)")

# シミュレーション実行
gacha_simulation(100)  # 100回引く

10.7 外部サービスのデータを利用する

WebAPIからデータを取得する方法を学びます:

天気情報を取得する

import requests
import json

def get_weather(city):
    """
    OpenWeatherMap APIから天気情報を取得する例
    実際の利用にはAPIキーが必要です
    """
    api_key = "あなたのAPIキー"
    url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"

    try:
        response = requests.get(url)
        data = response.json()

        weather = data["weather"][0]["description"]
        temp = data["main"]["temp"]

        print(f"{city}の天気:{weather}")
        print(f"気温:{temp}℃")

    except Exception as e:
        print(f"エラーが発生しました:{e}")

# 天気情報の取得
# get_weather("Tokyo")  # APIキーが必要なためコメントアウト

課題 1. テキストファイルから名前を読み込み、ランダム抽選するプログラム

テキストファイルから名前を読み込み、ランダム抽選するプログラム

import random

def random_selector():
    try:
        # ファイルから名前を読み込む
        with open("names.txt", "r", encoding="utf-8") as file:
            names = [line.strip() for line in file if line.strip()]

        if not names:
            print("ファイルが空です")
            return

        # 抽選する人数を入力
        while True:
            try:
                num_winners = int(input("何人抽選しますか?:"))
                if num_winners <= 0:
                    print("1以上の数を入力してください")
                elif num_winners > len(names):
                    print(f"候補者({len(names)}人)より多い人数は選べません")
                else:
                    break
            except ValueError:
                print("数字を入力してください")

        # 抽選実行
        winners = random.sample(names, num_winners)

        # 結果発表
        print("\n当選者発表!")
        for i, winner in enumerate(winners, 1):
            print(f"{i}人目:{winner}")

    except FileNotFoundError:
        print("names.txtファイルが見つかりません")
    except Exception as e:
        print(f"エラーが発生しました:{e}")

# プログラムの実行
random_selector()

課題 2. 現在時刻を取得し、「現在の時刻は ◯ 時 ◯ 分です」と表示するプログラム

現在時刻を取得し、「現在の時刻は ◯ 時 ◯ 分です」と表示するプログラム

from datetime import datetime
import time

def digital_clock():
    try:
        while True:
            # 現在時刻を取得
            now = datetime.now()

            # 時刻を整形して表示
            time_str = now.strftime("%H時%M分%S秒")
            print(f"\r現在の時刻は{time_str}です", end="")

            # 1秒待機
            time.sleep(1)

    except KeyboardInterrupt:
        print("\n\nプログラムを終了します")
    except Exception as e:
        print(f"\nエラーが発生しました:{e}")

# プログラムの実行
print("デジタル時計を起動します(終了するにはCtrl+Cを押してください)")
digital_clock()

# チャレンジ:
# - アラーム機能を追加する
# - 時計の表示をデジタル風にアレンジする
# - 複数の地域の時刻を同時に表示する

まとめ

この章で学んだこと:

  • タプルとセットの基本的な使い方
  • ファイル操作の方法
  • 日付と時間の扱い方
  • 簡単なアルゴリズムの実装
  • 乱数とシミュレーション
  • 外部データの利用方法

次の章では、これまでの学習を活かして、より発展的なプログラミングについて学んでいきます!