モジュールのインポートとエイリアス
Pythonではimport文を使用してモジュールを読み込みます。asキーワードを用いることで、モジュールに別名(エイリアス)を付けることが可能です。これにより、コード記述量を減らし、可読性を高めることができます。
import math as m
# mathモジュールのsqrt関数をエイリアス 'm' 経由で呼び出す
result = m.sqrt(25)
print(result) # 出力: 5.0
リスト(List)の操作と注意点
リストの生成と多次元配列
リストはPythonで頻繁に使用されるデータ型で、異なる型の要素を格納可能です。特定の値で初期化されたリストを作成する際は、乗算演算子が便利ですが、オブジェクトの参照に関する挙動に注意が必要です。
特に2次元配列を作成する場合、[[0] * n] * nのような書き方をすると、内側のリストの参照がコピーされるため、一行の変更が他の行にも影響してしまいます。これを避けるには、リスト内包表記を使用します。
# 推奨される2次元配列の初期化(リスト内包表記)
# 各行が独立したオブジェクトとなる
matrix = [[0] * 5 for _ in range(3)]
matrix[0][0] = 1
print(matrix)
# 出力: [[1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
# 非推奨の例(参照が共有される)
wrong_matrix = [[0] * 5] * 3
wrong_matrix[0][0] = 1
print(wrong_matrix)
# 出力: [[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]]
リストのスライス
スライス構文[start:stop:step]を使うと、リストの一部を簡単に抽出できます。startは開始インデックス、stopは終了インデックス(含まない)、stepはステップ幅を表します。
data = [10, 20, 30, 40, 50, 60, 70]
print(data[1:4]) # インデックス1から3まで: [20, 30, 40]
print(data[:3]) # 最初から3つ: [10, 20, 30]
print(data[-2:]) # 末尾から2つ: [60, 70]
print(data[::2]) # 1つ飛ばしで取得: [10, 30, 50, 70]
print(data[::-1]) # リストを逆順に: [70, 60, 50, 40, 30, 20, 10]
文字列(String)とその不変性
Pythonの文字列は「イミュータブル(不変)」なオブジェクトです。文字列の内容を変更する操作を行うと、実際には新しい文字列オブジェクトが生成されます。
text = "Python"
# 文字列を置換しようとする
modified = text.replace("P", "J")
print(text) # 元のオブジェクトは変わらない: "Python"
print(modified) # 新しいオブジェクトが返る: "Jython"
文字列操作のユーティリティ
split()メソッドは区切り文字で文字列を分割し、リストとして返します。join()はその逆で、リストの要素を連結して文字列にします。
csv_data = "apple,banana,orange"
items = csv_data.split(",") # ['apple', 'banana', 'orange']
joined = "-".join(items)
print(joined) # "apple-banana-orange"
辞書(Dictionary)の基本
辞書はキーと値のペアを格納するデータ構造です。キーは一意である必要があります。keys()、values()、items()はビューオブジェクトを返し、辞書の内容が変わると動的に更新されます。
person = {"name": "Alice", "age": 30}
# 値の取得
print(person.get("name")) # "Alice"
# 存在しないキーの場合のデフォルト値
print(person.get("address", "Unknown")) # "Unknown"
# キーと値のペアをループ処理
for key, val in person.items():
print(f"{key}: {val}")
集合(Set)
集合は重複しない要素の集まりです。リストから重複を除去する場合などに利用されます。
nums = [1, 2, 2, 3, 4, 4, 5]
unique_nums = set(nums)
print(unique_nums) # {1, 2, 3, 4, 5}
# 要素の追加と削除
unique_nums.add(6)
unique_nums.discard(2) # 要素が存在しなくてもエラーにならない
組み込み関数とラムダ式
ソートと数値計算
sorted()は新しいソート済みリストを返しますが、リストのsort()メソッドはリスト自体を破壊的に変更します。
scores = [85, 40, 92, 77]
sorted_scores = sorted(scores) # 昇順
print(sorted_scores)
# 降順ソート
desc_scores = sorted(scores, reverse=True)
ラムダ(Lambda)式
ラムダ式は名前を持たない小さな関数を定義する際に使用します。主にsorted()のkey引数や、map()、filter()などと組み合わせて使われます。
# 2倍にする関数
double = lambda x: x * 2
print(double(5)) # 10
# タプルのリストを2番目の要素でソート
pairs = [(1, 'one'), (3, 'three'), (2, 'two')]
pairs.sort(key=lambda p: p[1])
print(pairs) # [(1, 'one'), (3, 'three'), (2, 'two')]
算術演算子の注意点
Pythonの除算には2種類あります。/は常に浮動小数点数を返し、//は整数除算(切り捨て)を行います。負の数の整数除算は、数学的な床関数(floor)に従うため、ゼロ方向ではなく負の無限大方向に丸められます。
print(10 / 3) # 3.3333...
print(10 // 3) # 3
# 負の数の整数除算
print(-10 // 3) # -4 (ゼロ方向の-3ではなく、より小さい-4になる)
NumPyの基本機能
NumPyは数値計算を効率的に行うためのライブラリです。
linspace
np.linspace()は、指定された区間を等間隔に分割した値の配列を生成します。
import numpy as np
# 0から10までの範囲を5分割
arr = np.linspace(0, 10, num=5)
print(arr) # [ 0. 2.5 5. 7.5 10. ]
zeros
np.zeros()は、要素が全て0の配列を生成します。初期化によく使われます。
# 3行4列のゼロ行列
zero_matrix = np.zeros((3, 4))
print(zero_matrix)
meshgrid
np.meshgrid()は、2つの1次元配列から格子状の座標行列を生成します。3Dグラフの描画などに利用されます。
x = np.array([1, 2, 3])
y = np.array([4, 5])
X, Y = np.meshgrid(x, y)
print(X)
# [[1 2 3]
# [1 2 3]]
print(Y)
# [[4 4 4]
# [5 5 5]]