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()
# チャレンジ:
# - アラーム機能を追加する
# - 時計の表示をデジタル風にアレンジする
# - 複数の地域の時刻を同時に表示する
まとめ
この章で学んだこと:
- タプルとセットの基本的な使い方
- ファイル操作の方法
- 日付と時間の扱い方
- 簡単なアルゴリズムの実装
- 乱数とシミュレーション
- 外部データの利用方法
次の章では、これまでの学習を活かして、より発展的なプログラミングについて学んでいきます!