Pythonプログラミングにおける基本概念と主要データ構造の設計指針

ソフトウェア開発において、プログラムは「データ」と「アルゴリズム(ビジネスロジック)」の組み合わせで構成されます。効率的な開発を行うためには、言語が提供するデータ型、制御構造、および標準ライブラリの特性を深く理解することが不可欠です。

1. 変数とデータ型の特性

Pythonは動的型付け言語であり、変数はメモリ上のオブジェクトを指し示します。id()関数でメモリアドレスを、type()関数で型を確認できます。

# 変数の定義と確認
app_status = "active"
timeout_val = None

print(id(app_status))  # メモリアドレスの確認
print(type(app_status)) # 型の確認(str型)

主要なデータ型

  • 数値型: int(整数), float(浮動小数点数)
  • 文字列 (str): シングル、ダブル、またはトリプルクォートで定義。トリプルクォートは複数行の保持が可能です。
  • リスト (list): 順序付けられた可変な要素の集合。
  • 辞書 (dict): キーと値のペアによるマッピング。
  • タプル (tuple): 不変(イミュータブル)な順序付き集合。
  • 集合 (set): 重複を許さない要素の集まり。
  • 論理型 (bool): True/False。数値の0、空の文字列、NoneなどはFalseと判定されます。

2. 文字列操作とスライス

文字列は不変オブジェクトであり、多様なメソッドが用意されています。

# 文字列メソッドの例
raw_path = " /usr/local/bin/python "
clean_path = raw_path.strip().upper() # 前後空白削除と大文字変換
parts = clean_path.split("/") # 区切り文字で分割

スライス処理

インデックスを利用して特定範囲のデータを抽出します。[開始:終了:ステップ]の形式をとり、終了インデックスは含まれません(左閉右開)。

sample_str = "PY-TH-ON"
print(sample_str[0:2])    # 'PY'
print(sample_str[::-1])   # 'NO-HT-YP' (反転)

3. 制御構造と演算子

条件分岐(if)とループ(for, while)はプログラムの論理フローを制御します。

論理演算とメンバーシップ

and, or, notによる論理結合のほか、in演算子で要素の存在確認、is演算子でオブジェクトの一致確認を行います。

ループ処理

# リスト内包表記による効率的なリスト生成
sq_list = [n ** 2 for n in range(10) if n % 2 == 0]

# Whileループとelse
count = 5
while count > 0:
    count -= 1
else:
    print("カウントダウン終了")

4. データ構造の操作

辞書 (Dictionary)

キーにはハッシュ可能な型(文字列、数値、タプル等)のみ指定可能です。

config = {"host": "localhost", "port": 8080}
# 安全な値の取得
port_num = config.get("port", 80)
# キーと値の列挙
for key, val in config.items():
    print(f"{key}: {val}")

集合 (Set)

数学的な集合演算(和集合、積集合など)が可能です。

nodes_a = {"node1", "node2", "node3"}
nodes_b = {"node3", "node4"}
# 積集合
common = nodes_a & nodes_b # {'node3'}
# 差集合
unique_a = nodes_a - nodes_b # {'node1', 'node2'}

5. 関数設計とスコープ

関数はコードの再利用性を高めるための最小単位です。

def process_data(target, *args, mode="default", **kwargs):
    """
    位置引数、可変引数(*args)、キーワード引数(**kwargs)を組み合わせた例
    """
    global_var_access = "関数外の変数を変更するには 'global' 宣言が必要"
    return target.count(args[0]) if args else 0

# 匿名関数 (lambda)
multiply = lambda x, y: x * y

6. 標準ライブラリの活用

osモジュール

ファイルパス操作やディレクトリ一覧の取得に使用します。os.path.join()によるパス結合はOS間の差異を吸収します。

time/datetimeモジュール

time.strftime()を利用して、タイムスタンプを任意のフォーマット文字列(例:"%Y-%m-%d %H:%M:%S")に変換できます。

7. データベース操作 (PyMySQL)

外部ライブラリを用いてMySQL等のRDBMSと連携します。接続、カーソル生成、実行、コミット/クローズのライフサイクル管理が重要です。

import pymysql

def fetch_records(query):
    conn = pymysql.connect(host='127.0.0.1', user='web_user', password='password', db='app_db')
    try:
        with conn.cursor() as cursor:
            cursor.execute(query)
            return cursor.fetchall()
    finally:
        conn.close()

8. 例外処理 (Exception Handling)

予期せぬエラー(実行時エラー)によるプログラムの強制終了を防ぎます。

try:
    result = 10 / int(input_val)
except ZeroDivisionError:
    print("エラー: 0で割ることはできません")
except Exception as e:
    print(f"不明なエラー: {e}")
finally:
    print("リソースを解放します")

9. ファイル入出力と直列化

with構文(コンテキストマネージャ)を使用することで、ファイルのクローズ漏れを自動的に防止します。

import json

# JSONデータの書き出し
data_payload = {"id": 101, "tags": ["python", "dev"]}
with open("export.json", "w", encoding="utf-8") as f:
    json.dump(data_payload, f, ensure_ascii=False)

# JSONデータの読み込み
with open("export.json", "r") as f:
    loaded_data = json.load(f)

タグ: Python PyMySQL JSON error-handling data-structures

7月3日 16:57 投稿