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
У 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'
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()
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
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
У 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'
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()
Дякуємо за ваш відгук!