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 None замість перевірок на істинність, оскільки 0 та "" також є хибними значеннями.

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.

bytes проти bytearray

  • Об'єкти 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')

Перетворення між bytes та bytearray

  • Перетворення bytes у bytearray для можливості змін:
b = b"data"
ba = bytearray(b)
  • Перетворення bytearray назад у bytes для зберігання або передачі:
ba = bytearray(b"abc")
b = bytes(ba)

Кодування та декодування

  • Використання .encode() для рядка, щоб отримати об'єкт bytes з певним кодуванням (наприклад, UTF-8);
  • Використання .decode() для об'єкта bytes або bytearray, щоб отримати рядок.

Це важливо при роботі з файлами або мережевими даними, де часто потрібно отримувати або надсилати сирі байти та перетворювати їх у читабельний текст або навпаки.

Типові сценарії використання

  • Файловий ввід/вивід:
    • Відкриття файлів у бінарному режимі ("rb" або "wb") для читання чи запису точних байтів.
  • Мережеві дані:
    • Передача та отримання даних через сокети у вигляді байтів.
  • Бінарні протоколи:
    • Побудова або парсинг пакетів за допомогою bytearray для ефективного редагування на місці.

Розуміння, коли використовувати кожен тип, допомагає писати надійний код для обробки даних у реальних задачах.

Типові сценарії використання Bytes та Bytearray

Використання bytes та bytearray при роботі безпосередньо з сирими бінарними даними, а не з текстом. Ці типи є необхідними у кількох випадках:

  • Читання або запис бінарних файлів, таких як зображення, аудіо або виконувані файли;
  • Обробка мережевих даних, оскільки сокети надсилають і отримують байти, а не рядки;
  • Взаємодія з бінарними протоколами, коли потрібно створювати або парсити повідомлення як послідовності байтів.

bytes — це незмінна послідовність, тобто її вміст не можна змінити після створення. Це ідеально, коли потрібно гарантувати незмінність даних, наприклад, при читанні файлу або отриманні мережевого пакета.

bytearray — змінна, тому її вміст можна змінювати на місці. Використання bytearray для побудови повідомлення, зміни частин буфера або ефективної маніпуляції бінарними даними перед відправкою чи збереженням.

Коли використовувати кожен тип:

  • Використання bytes для фіксованих, лише для читання бінарних даних, наприклад, вмісту файлів або мережевих повідомлень, які не потрібно змінювати;
  • Використання bytearray, коли потрібно редагувати, додавати або іншим чином змінювати бінарні дані перед подальшою обробкою чи передачею.

Перетворення між bytes та bytearray

Можливість легко конвертувати між об'єктами bytes (незмінними) та bytearray (змінними) у Python. Це дозволяє обирати відповідний тип для задачі — 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")

Відмінності у довжині

Деякі символи займають один текстовий елемент, але кілька байтів, тому їхня довжина у str та у закодованому вигляді може відрізнятися. Це відбувається тому, що кодування, такі як UTF-8, можуть використовувати більше одного байта для представлення одного символу.

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

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Секція 4. Розділ 3
some-alt