【備忘】よくつかうコードスニペット: Python標準ライブラリ系


## 目的
鳥頭のため、ちょっと書いてないだけで基礎的な記法も忘れる始末。

## 一覧

### json

#### JSONデータのシリアライズ（PythonオブジェクトをJSON文字列に変換）

```
import json

data = {
    "name": "Example Item",
    "price": 19.99,
    "in_stock": True
}

# JSON文字列に変換
json_data = json.dumps(data)
print(json_data)  # {"name": "Example Item", "price": 19.99, "in_stock": true}

```

####  JSONデータのデシリアライズ（JSON文字列をPythonオブジェクトに変換）

```
# JSON文字列
json_data = '{"name": "Example Item", "price": 19.99, "in_stock": true}'

# Pythonオブジェクトに変換
data = json.loads(json_data)
print(data)  # {'name': 'Example Item', 'price': 19.99, 'in_stock': True}

```

#### JSONファイルの読み込みと書き込み
```
# JSONファイルに書き込み
with open("data.json", "w") as f:
    json.dump(data, f)

# JSONファイルから読み込み
with open("data.json", "r") as f:
    data_from_file = json.load(f)
print(data_from_file)

```

### 日付と時間の操作

```
from datetime import datetime, timedelta

# 現在の日付と時間
now = datetime.now()

# 日付のフォーマット変更
formatted_date = now.strftime('%Y-%m-%d %H:%M:%S')

# 特定の日付までの加算
future_date = now + timedelta(days=7)

```

### リスト操作、表記

#### リストへの追加・削除

```
my_list = [1, 2, 3]

# 末尾に追加
my_list.append(4)  # [1, 2, 3, 4]

# 特定の位置に挿入
my_list.insert(1, 'a')  # [1, 'a', 2, 3, 4]

# 特定の要素を削除
my_list.remove('a')  # [1, 2, 3, 4]

# 最後の要素を取り出して削除
last_element = my_list.pop()  # 4, 残りは [1, 2, 3]

```

#### スライス
```
my_list = [1, 2, 3, 4, 5]

# 最初の3つの要素
first_three = my_list[:3]  # [1, 2, 3]

# 最後の2つの要素
last_two = my_list[-2:]  # [4, 5]

# 一定間隔での取得
every_second = my_list[::2]  # [1, 3, 5]

```

#### リスト内包表記とフィルタリング

```
# リストから偶数のみ抽出
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = [num for num in numbers if num % 2 == 0]

```

#### map記法
```
# リストの要素を二乗
numbers = [1, 2, 3, 4]
squared = list(map(lambda x: x**2, numbers))  # [1, 4, 9, 16]

```

#### filter関数
```
# 偶数のみ抽出
numbers = [1, 2, 3, 4, 5]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))  # [2, 4]

```

#### reduce関数
```
from functools import reduce

# リスト内の全要素の積
numbers = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, numbers)  # 24

```

### CSVファイルの読み書き

```
import csv

# CSVの読み込み
with open('data.csv', 'r') as file:
    reader = csv.reader(file)
    data = [row for row in reader]

# CSVへの書き込み
with open('data.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(['Name', 'Age'])
    writer.writerow(['Alice', 30])
    writer.writerow(['Bob', 25])

```

### クラス

#### サンプルクラス
```
class Animal:
    species = "Mammal"  # クラス変数: すべてのインスタンスで値を共有

    def __init__(self, name):
        self.name = name  # インスタンス変数: インスタンスごとに値が異なる
        self._name = f"{name}_private"

    @property # propertyデコレータによって、メソッドを属性のように扱える
    def name(self):  # ゲッター
        return self._name

    @name.setter
    def name(self, value):  # セッター
        if isinstance(value, str) and value:
            self._name = value
        else:
            raise ValueError("Name must be a non-empty string")

    @classmethod
    def set_species(cls, species_name):
        cls.species = species_name

    @staticmethod
    def is_animal():
        return True

cat = Animal("Whiskers")
dog = Animal("Buddy")

print(cat.species)  # Mammal
print(dog.species)  # Mammal
print(cat.name)  # Whiskers
print(dog.name)  # Buddy

# クラス変数を変更
Animal.species = "Bird"
print(cat.species)  # Bird
print(dog.species)  # Bird

# クラスメソッドの呼び出し
Animal.set_species("Reptile")
print(Animal.species)  # Reptile

# 静的メソッドの呼び出し
print(Animal.is_animal())  # True

cat.name = "Bob"  # セッターを使用して値を設定
print(cat.name)  # Bob

```

#### 特殊メソッド（マジックメソッド）

Pythonでは、__init__, __str__, __repr__ などの特殊メソッド（ダンダーメソッド）があり、特定の操作や組み込み関数をオーバーライドできる
```
class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

    def __str__(self):
        return f"{self.title} by {self.author}"  # print()での表示

    def __repr__(self):
        return f"Book({self.title!r}, {self.author!r})"  # オブジェクトの公式な文字列表現

book = Book("1984", "George Orwell")
print(book)  # 1984 by George Orwell
print(repr(book))  # Book('1984', 'George Orwell')

```