Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ None型とバイナリデータ | 型間相互作用
Pythonにおけるデータ型

None型とバイナリデータ

メニューを表示するにはスワイプしてください

実際のプログラムでは、欠損値やバイナリデータを扱う。None は「値が存在しない」ことを示し、bytes/bytearray は生のバイナリ内容に使用する。それぞれの適切な用途と、テキストとバイト間の安全な変換方法を理解する。

「値なし」を示す None

None は「ここには何もない」という意味の単一オブジェクト。

1234567
result = None email = None print(result is None) # True print(email is None) # True if result is None: print("No result yet")

is None0 も偽と判定されるため、真偽値チェックの代わりに "" を使用する。

123
value = 0 print(not value) # True print(value is None) # False

デフォルト値とフォールバック

None は、値が意図的に存在しないことを明確に示すマーカーとして使用されます。これにより、「値が提供されていない」状態と、0"" のような有効な値を区別できるため、デフォルト値やフォールバックの処理がより安全かつ予測可能になります。

1234567
x = None print(x or "unknown") # 'unknown' print("unknown" if x is None else x) x = 0 print(x or "unknown") # 'unknown' print("unknown" if x is None else x) # 0

関数とパラメータ

この例は、関数がパラメータに None を設定してタグが指定されていないことを示す方法を説明しています。これにより、関数は安全なデフォルト値を割り当てつつ、必要に応じて呼び出し元が値を上書きできるようになります。

1234567
def add_tag(text, tag=None): if tag is None: tag = "general" return f"[{tag}] {text}" print(add_tag("hello")) # [general] hello print(add_tag("hello", "news")) # [news] hello

バイナリデータ

str はテキストを保持し、bytes および bytearray は生のバイト値を保持します。

1234
b1 = b"hello" b2 = bytes([72, 105]) buf = bytearray(b"abc") buf[0] = 65

エンコーディングとデコーディング

エンコーディングはテキストをバイト列に変換し、信頼性の高い保存や転送を可能にする処理。デコーディングはそのバイト列を再び読みやすいテキストに戻す処理。UTF-8のような定義済みエンコーディングを使用することで、文字が正しく保持される。

123
text = "café" data = text.encode("utf-8") back = data.decode("utf-8")

実践におけるバイナリデータ

生のバイナリ情報を扱うには bytes および bytearray を使用。これらの型は、データが単なるテキストではない場合に不可欠であり、以下のようなタスクで利用される:

  • バイナリモードでのファイルの読み書き(画像、音声、実行ファイルなど);
  • ネットワーク越しのデータ送受信で、正確なバイト列を転送する必要がある場合;
  • ハードウェアや低レベルAPIとの通信時など、バイナリプロトコルの解析や構築。

bytesbytearray の違い

  • bytes オブジェクトはイミュータブル(不変):作成後に内容を変更できない。ファイル内容や暗号化ハッシュなど、固定されたバイナリデータに適している;
  • bytearray オブジェクトはミュータブル(可変):内容をその場で変更可能。保存や送信前にバイナリデータを構築・編集する際に便利。

例:バイナリデータの編集

# Create a bytes object (immutable)
data = b"hello"
# Create a mutable copy
data_mutable = bytearray(data)
data_mutable[0] = 72  # Change 'h' (104) to 'H' (72)
print(data_mutable)  # bytearray(b'Hello')

bytesbytearray の相互変換

  • bytes から bytearray へ変換して編集可能にする:
b = b"data"
ba = bytearray(b)
  • 編集後、bytearray から bytes へ戻して保存や送信に利用:
ba = bytearray(b"abc")
b = bytes(ba)

エンコードとデコード

  • 文字列に .encode() を使うと、特定のエンコーディング(例:UTF-8)の bytes オブジェクトを取得;
  • .decode() または bytes オブジェクトに bytearray を使うと、文字列に変換可能。

ファイルI/Oやネットワークデータの処理時には、生のバイト列をテキストに変換したり、その逆を行う必要があり、非常に重要。

主な利用例

  • ファイルI/O:
    • バイナリモード("rb" または "wb")でファイルを開き、正確なバイト列を読み書き。
  • ネットワークデータ:
    • ソケット通信ではデータの送受信がバイト単位で行われる。
  • バイナリプロトコル:
    • bytearray を使ってパケットを効率的に編集・構築。

それぞれの型を使い分けることで、現実的なデータ処理に強い堅牢なコードを記述可能。

Bytes と Bytearray の主な利用例

bytes および bytearray は、テキストではなく生のバイナリデータを直接扱う際に使用。これらの型は、以下のような場面で不可欠:

  • 画像、音声、実行ファイルなどのバイナリファイルの読み書き;
  • ネットワークデータの処理(ソケットは文字列ではなくバイト列を送受信);
  • バイナリプロトコルとのやり取り(メッセージをバイト列として構築・解析)。

bytes はイミュータブルなシーケンスで、一度作成した内容は変更不可。ファイルの読み込みやネットワークパケットの受信など、データを変更せず保持したい場合に最適。

bytearray はミュータブルで、内容をその場で変更可能。bytearray を使用すると、メッセージを構築したり、バッファの一部を編集したり、バイナリデータを効率的に操作したりできる。

使い分けの目安:

  • 変更不要な固定バイナリデータ(ファイル内容や変更しないネットワークメッセージなど)には bytes
  • 編集や追加、その他の操作が必要な場合は bytearray を使用。

bytesbytearray の相互変換

Python では bytes(イミュータブル)と bytearray(ミュータブル)を簡単に相互変換可能。用途に応じて、編集不可のデータには bytes、内容を変更したい場合は bytearray を選択。

  • bytes() コンストラクタで bytearray をイミュータブルな bytes オブジェクトに変換;
  • bytearray() コンストラクタで bytes からミュータブルなコピーを作成。

バイナリデータを編集(bytearray)し、保存や送信前に固定(bytes)する場合などに有用。

raw = bytearray(b"data")
raw[0] = 68  # Change first byte to 'D'
locked = bytes(raw)  # Convert to immutable bytes

b = b"example"
mutable = bytearray(b)  # Convert to mutable bytearray
mutable.append(33)      # Add '!' (ASCII 33)

bytes に変換すると内容の変更は不可。編集が必要な場合は bytearray を利用し、最終的に bytes で固定。

1234567891011
# Convert bytes to bytearray b = b"hello" ba = bytearray(b) # Modify the bytearray (change 'h' to 'H') ba[0] = ord('H') print(ba) # bytearray(b'Hello') # Convert bytearray back to bytes b2 = bytes(ba) print(b2) # b'Hello'
123456
try: b"ID:" + "123" except TypeError as e: print(e) ok = b"ID:" + "123".encode("utf-8")

長さの違い

一部の文字は1つのテキスト要素ですが、複数バイトを必要とするため、str とエンコード後の長さが異なる場合があります。これは、UTF-8のようなエンコーディングが1文字を表現するのに複数バイトを使うことがあるためです。

123
ch = "é" len(ch) # 1 len(ch.encode()) # 2

ファイル

バイナリファイルは必ず "rb" モードで開き、生のバイト列をそのまま読み取る必要があります。これにより、Pythonがデータをテキストとして解釈しようとするのを防ぎます。

# with open("example.png", "rb") as f:
#     blob = f.read()
question mark

どのチェックが欠損値を正しく検出しますか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 4.  3

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

None型とバイナリデータ

実際のプログラムでは、欠損値やバイナリデータを扱う。None は「値が存在しない」ことを示し、bytes/bytearray は生のバイナリ内容に使用する。それぞれの適切な用途と、テキストとバイト間の安全な変換方法を理解する。

「値なし」を示す None

None は「ここには何もない」という意味の単一オブジェクト。

1234567
result = None email = None print(result is None) # True print(email is None) # True if result is None: print("No result yet")

is None0 も偽と判定されるため、真偽値チェックの代わりに "" を使用する。

123
value = 0 print(not value) # True print(value is None) # False

デフォルト値とフォールバック

None は、値が意図的に存在しないことを明確に示すマーカーとして使用されます。これにより、「値が提供されていない」状態と、0"" のような有効な値を区別できるため、デフォルト値やフォールバックの処理がより安全かつ予測可能になります。

1234567
x = None print(x or "unknown") # 'unknown' print("unknown" if x is None else x) x = 0 print(x or "unknown") # 'unknown' print("unknown" if x is None else x) # 0

関数とパラメータ

この例は、関数がパラメータに None を設定してタグが指定されていないことを示す方法を説明しています。これにより、関数は安全なデフォルト値を割り当てつつ、必要に応じて呼び出し元が値を上書きできるようになります。

1234567
def add_tag(text, tag=None): if tag is None: tag = "general" return f"[{tag}] {text}" print(add_tag("hello")) # [general] hello print(add_tag("hello", "news")) # [news] hello

バイナリデータ

str はテキストを保持し、bytes および bytearray は生のバイト値を保持します。

1234
b1 = b"hello" b2 = bytes([72, 105]) buf = bytearray(b"abc") buf[0] = 65

エンコーディングとデコーディング

エンコーディングはテキストをバイト列に変換し、信頼性の高い保存や転送を可能にする処理。デコーディングはそのバイト列を再び読みやすいテキストに戻す処理。UTF-8のような定義済みエンコーディングを使用することで、文字が正しく保持される。

123
text = "café" data = text.encode("utf-8") back = data.decode("utf-8")

実践におけるバイナリデータ

生のバイナリ情報を扱うには bytes および bytearray を使用。これらの型は、データが単なるテキストではない場合に不可欠であり、以下のようなタスクで利用される:

  • バイナリモードでのファイルの読み書き(画像、音声、実行ファイルなど);
  • ネットワーク越しのデータ送受信で、正確なバイト列を転送する必要がある場合;
  • ハードウェアや低レベルAPIとの通信時など、バイナリプロトコルの解析や構築。

bytesbytearray の違い

  • bytes オブジェクトはイミュータブル(不変):作成後に内容を変更できない。ファイル内容や暗号化ハッシュなど、固定されたバイナリデータに適している;
  • bytearray オブジェクトはミュータブル(可変):内容をその場で変更可能。保存や送信前にバイナリデータを構築・編集する際に便利。

例:バイナリデータの編集

# Create a bytes object (immutable)
data = b"hello"
# Create a mutable copy
data_mutable = bytearray(data)
data_mutable[0] = 72  # Change 'h' (104) to 'H' (72)
print(data_mutable)  # bytearray(b'Hello')

bytesbytearray の相互変換

  • bytes から bytearray へ変換して編集可能にする:
b = b"data"
ba = bytearray(b)
  • 編集後、bytearray から bytes へ戻して保存や送信に利用:
ba = bytearray(b"abc")
b = bytes(ba)

エンコードとデコード

  • 文字列に .encode() を使うと、特定のエンコーディング(例:UTF-8)の bytes オブジェクトを取得;
  • .decode() または bytes オブジェクトに bytearray を使うと、文字列に変換可能。

ファイルI/Oやネットワークデータの処理時には、生のバイト列をテキストに変換したり、その逆を行う必要があり、非常に重要。

主な利用例

  • ファイルI/O:
    • バイナリモード("rb" または "wb")でファイルを開き、正確なバイト列を読み書き。
  • ネットワークデータ:
    • ソケット通信ではデータの送受信がバイト単位で行われる。
  • バイナリプロトコル:
    • bytearray を使ってパケットを効率的に編集・構築。

それぞれの型を使い分けることで、現実的なデータ処理に強い堅牢なコードを記述可能。

Bytes と Bytearray の主な利用例

bytes および bytearray は、テキストではなく生のバイナリデータを直接扱う際に使用。これらの型は、以下のような場面で不可欠:

  • 画像、音声、実行ファイルなどのバイナリファイルの読み書き;
  • ネットワークデータの処理(ソケットは文字列ではなくバイト列を送受信);
  • バイナリプロトコルとのやり取り(メッセージをバイト列として構築・解析)。

bytes はイミュータブルなシーケンスで、一度作成した内容は変更不可。ファイルの読み込みやネットワークパケットの受信など、データを変更せず保持したい場合に最適。

bytearray はミュータブルで、内容をその場で変更可能。bytearray を使用すると、メッセージを構築したり、バッファの一部を編集したり、バイナリデータを効率的に操作したりできる。

使い分けの目安:

  • 変更不要な固定バイナリデータ(ファイル内容や変更しないネットワークメッセージなど)には bytes
  • 編集や追加、その他の操作が必要な場合は bytearray を使用。

bytesbytearray の相互変換

Python では bytes(イミュータブル)と bytearray(ミュータブル)を簡単に相互変換可能。用途に応じて、編集不可のデータには bytes、内容を変更したい場合は bytearray を選択。

  • bytes() コンストラクタで bytearray をイミュータブルな bytes オブジェクトに変換;
  • bytearray() コンストラクタで bytes からミュータブルなコピーを作成。

バイナリデータを編集(bytearray)し、保存や送信前に固定(bytes)する場合などに有用。

raw = bytearray(b"data")
raw[0] = 68  # Change first byte to 'D'
locked = bytes(raw)  # Convert to immutable bytes

b = b"example"
mutable = bytearray(b)  # Convert to mutable bytearray
mutable.append(33)      # Add '!' (ASCII 33)

bytes に変換すると内容の変更は不可。編集が必要な場合は bytearray を利用し、最終的に bytes で固定。

1234567891011
# Convert bytes to bytearray b = b"hello" ba = bytearray(b) # Modify the bytearray (change 'h' to 'H') ba[0] = ord('H') print(ba) # bytearray(b'Hello') # Convert bytearray back to bytes b2 = bytes(ba) print(b2) # b'Hello'
123456
try: b"ID:" + "123" except TypeError as e: print(e) ok = b"ID:" + "123".encode("utf-8")

長さの違い

一部の文字は1つのテキスト要素ですが、複数バイトを必要とするため、str とエンコード後の長さが異なる場合があります。これは、UTF-8のようなエンコーディングが1文字を表現するのに複数バイトを使うことがあるためです。

123
ch = "é" len(ch) # 1 len(ch.encode()) # 2

ファイル

バイナリファイルは必ず "rb" モードで開き、生のバイト列をそのまま読み取る必要があります。これにより、Pythonがデータをテキストとして解釈しようとするのを防ぎます。

# with open("example.png", "rb") as f:
#     blob = f.read()
すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 4.  3
some-alt