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

None型とバイナリデータ

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

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

「値なし」を示す 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 はテキストを保持し、bytesbytearray は生のバイト値を保持します。

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 を使用し、生のバイナリコンテンツには bytesbytearray を利用する。それぞれの適切な用途と、テキストとバイト間の安全な変換方法を理解する。

「値なし」を示す 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 はテキストを保持し、bytesbytearray は生のバイト値を保持します。

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