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

У 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")

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

Деякі символи займають один текстовий елемент, але кілька байтів, тому їхня довжина у 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

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

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

У 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")

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

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

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