None та Бінарні Дані
Свайпніть щоб показати меню
Реальні програми обробляють відсутні значення та бінарні дані. Використовуйте None для позначення "немає значення", а bytes/bytearray — для необробленого бінарного вмісту. Важливо знати, коли кожен тип є доречним, і як безпечно конвертувати між текстом і байтами.
None для "Відсутнє значення"
None — це єдиний об'єкт, що означає "тут нічого немає".
1234567result = None email = None print(result is None) # True print(email is None) # True if result is None: print("No result yet")
Використовуйте is None замість перевірок на істинність, оскільки 0 та "" також є хибними значеннями.
123value = 0 print(not value) # True print(value is None) # False
Значення за замовчуванням і запасні варіанти
None використовується як чіткий маркер того, що значення навмисно відсутнє. Це дозволяє відрізняти "значення не надано" від допустимих значень, таких як 0 або "", що робить використання значень за замовчуванням і запасних варіантів безпечнішим і передбачуванішим.
1234567x = 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 як сигнал про те, що тег не був наданий. Це дозволяє функції призначити безпечне значення за замовчуванням, водночас дозволяючи виклику змінити його за потреби.
1234567def 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 містять необроблені байтові значення.
1234b1 = b"hello" b2 = bytes([72, 105]) buf = bytearray(b"abc") buf[0] = 65
Кодування та декодування
Кодування перетворює текст у байти для надійного зберігання або передачі, а декодування відновлює ці байти у читабельний текст. Використання визначеного кодування, наприклад UTF-8, гарантує правильне збереження символів.
123text = "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'
123456try: b"ID:" + "123" except TypeError as e: print(e) ok = b"ID:" + "123".encode("utf-8")
Відмінності у довжині
Деякі символи займають один текстовий елемент, але кілька байтів, тому їхня довжина у str та у закодованому вигляді може відрізнятися. Це відбувається тому, що кодування, такі як UTF-8, можуть використовувати більше одного байта для представлення одного символу.
123ch = "é" len(ch) # 1 len(ch.encode()) # 2
Файли
Бінарні файли потрібно відкривати в режимі "rb", щоб їхні байти зчитувалися саме так, як збережено. Це запобігає спробам Python інтерпретувати дані як текст.
# with open("example.png", "rb") as f:
# blob = f.read()
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат