Pythonの基礎文法と主要データ構造の使い方

モジュールのインポートとエイリアス

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]]

タグ: Python NumPy List Dictionary lambda

5月14日 16:09 投稿