Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende None y Datos Binarios | Interacciones Entre Tipos
Tipos de Datos en Python

None y Datos Binarios

Desliza para mostrar el menú

Los programas reales gestionan valores ausentes y datos binarios. Utilizar None para indicar "sin valor" y bytes/bytearray para contenido binario en bruto. Conocer cuándo es apropiado cada uno y cómo convertir de forma segura entre texto y bytes.

None para "Sin valor"

None es un único objeto que significa "nada aquí".

1234567
result = None email = None print(result is None) # True print(email is None) # True if result is None: print("No result yet")

Utilizar is None en lugar de comprobaciones de veracidad, ya que 0 y "" también son valores falsos.

123
value = 0 print(not value) # True print(value is None) # False

Valores predeterminados y alternativas

None se utiliza como un marcador claro de que un valor falta intencionalmente. Permite distinguir entre "no se proporcionó valor" y valores válidos como 0 o "", haciendo que los valores predeterminados y las alternativas sean más seguros y predecibles.

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

Funciones y parámetros

Este ejemplo muestra cómo una función utiliza un parámetro establecido en None como señal de que no se proporcionó ninguna etiqueta. Esto permite que la función asigne un valor predeterminado seguro, mientras que el usuario aún puede sobrescribirlo si es necesario.

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

Datos binarios

str almacena texto, bytes y bytearray almacenan valores de bytes en bruto.

1234
b1 = b"hello" b2 = bytes([72, 105]) buf = bytearray(b"abc") buf[0] = 65

Codificación y decodificación

La codificación convierte texto en bytes para que pueda almacenarse o transferirse de manera confiable, mientras que la decodificación restaura esos bytes a texto legible. El uso de una codificación definida como UTF-8 garantiza que los caracteres se conserven correctamente.

123
text = "café" data = text.encode("utf-8") back = data.decode("utf-8")

Datos binarios en la práctica

Uso de bytes y bytearray para manejar información binaria en bruto. Estos tipos son esenciales para tareas donde los datos no son solo texto, tales como:

  • Lectura y escritura de archivos en modo binario (como imágenes, audio o archivos ejecutables);
  • Envío y recepción de datos a través de redes, donde se deben transmitir secuencias exactas de bytes;
  • Análisis o construcción de protocolos binarios, por ejemplo, al comunicarse con hardware o APIs de bajo nivel.

bytes vs bytearray

  • Los objetos bytes son inmutables: no se puede cambiar su contenido después de crearlos. Úselos cuando se necesiten datos binarios fijos, como el contenido de archivos o hashes criptográficos;
  • Los objetos bytearray son mutables: se puede modificar su contenido en el lugar. Esto es útil para construir o editar datos binarios antes de guardarlos o enviarlos.

Ejemplo: Modificación de datos binarios

# 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')

Conversión entre bytes y bytearray

  • Convertir bytes a bytearray para permitir modificaciones:
b = b"data"
ba = bytearray(b)
  • Convertir bytearray de nuevo a bytes para almacenamiento o transmisión:
ba = bytearray(b"abc")
b = bytes(ba)

Codificación y decodificación

  • Usar .encode() en una cadena para obtener un objeto bytes con una codificación específica (como UTF-8);
  • Usar .decode() en un objeto bytes o bytearray para obtener una cadena.

Esto es crucial al trabajar con entrada/salida de archivos o datos de red, donde a menudo se reciben o envían bytes en bruto y es necesario convertirlos a texto legible o desde él.

Casos de uso típicos

  • Entrada/Salida de archivos:
    • Abrir archivos en modo binario ("rb" o "wb") para leer o escribir bytes exactos.
  • Datos de red:
    • La comunicación por sockets envía y recibe datos como bytes.
  • Protocolos binarios:
    • Construcción o análisis de paquetes usando bytearray para ediciones eficientes en el lugar.

Comprender cuándo usar cada tipo ayuda a escribir código robusto para el manejo de datos en situaciones reales.

Casos de uso típicos para Bytes y Bytearray

Se utilizan bytes y bytearray al trabajar directamente con datos binarios en bruto, en lugar de texto. Estos tipos son esenciales en varios escenarios:

  • Lectura o escritura de archivos binarios, como imágenes, audio o ejecutables;
  • Manejo de datos de red, ya que los sockets envían y reciben bytes, no cadenas de texto;
  • Interacción con protocolos binarios, donde se deben construir o analizar mensajes como secuencias de bytes.

bytes es una secuencia inmutable, lo que significa que no se puede cambiar su contenido después de crearlo. Esto es ideal cuando se necesita asegurar que los datos permanezcan sin cambios, como al leer un archivo o recibir un paquete de red.

bytearray es mutable, por lo que se puede modificar su contenido en el lugar. Utilice bytearray cuando sea necesario construir un mensaje, alterar partes de un búfer o manipular datos binarios de manera eficiente antes de enviarlos o guardarlos.

Cuándo usar cada uno:

  • Usar bytes para datos binarios fijos y de solo lectura, como el contenido de archivos o mensajes de red que no necesitan modificarse;
  • Usar bytearray cuando sea necesario editar, agregar o modificar los datos binarios antes de su procesamiento o transmisión.

Conversión entre bytes y bytearray

Se puede convertir fácilmente entre objetos bytes (inmutables) y bytearray (mutables) en Python. Esto permite elegir el tipo adecuado según las necesidades—bytes para datos fijos, bytearray cuando se necesita modificar el contenido.

  • Usar el constructor bytes() para convertir un bytearray en un objeto bytes inmutable;
  • Usar el constructor bytearray() para crear una copia mutable a partir de un objeto bytes.

Esto es útil cuando se necesita editar datos binarios (usando bytearray), y luego fijarlos (usando bytes) para almacenamiento o transmisión segura.

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)

Una vez convertido a bytes, no se puede cambiar el contenido. Utilice bytearray cuando sea necesario editar datos binarios antes de finalizarlos como 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")

Diferencias de longitud

Algunos caracteres ocupan un elemento de texto pero varios bytes, por lo que su longitud en str y en la forma codificada puede diferir. Esto ocurre porque codificaciones como UTF-8 pueden usar más de un byte para representar un solo carácter.

123
ch = "é" len(ch) # 1 len(ch.encode()) # 2

Archivos

Los archivos binarios deben abrirse en modo "rb" para que sus bytes sin procesar se lean exactamente como están almacenados. Esto evita que Python intente interpretar los datos como texto.

# with open("example.png", "rb") as f:
#     blob = f.read()
question mark

¿Qué verificación detecta correctamente un valor faltante?

Selecciona la respuesta correcta

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 4. Capítulo 3

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

None y Datos Binarios

Los programas reales gestionan valores ausentes y datos binarios. Utilizar None para indicar "sin valor" y bytes/bytearray para contenido binario en bruto. Conocer cuándo es apropiado cada uno y cómo convertir de forma segura entre texto y bytes.

None para "Sin valor"

None es un único objeto que significa "nada aquí".

1234567
result = None email = None print(result is None) # True print(email is None) # True if result is None: print("No result yet")

Utilizar is None en lugar de comprobaciones de veracidad, ya que 0 y "" también son valores falsos.

123
value = 0 print(not value) # True print(value is None) # False

Valores predeterminados y alternativas

None se utiliza como un marcador claro de que un valor falta intencionalmente. Permite distinguir entre "no se proporcionó valor" y valores válidos como 0 o "", haciendo que los valores predeterminados y las alternativas sean más seguros y predecibles.

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

Funciones y parámetros

Este ejemplo muestra cómo una función utiliza un parámetro establecido en None como señal de que no se proporcionó ninguna etiqueta. Esto permite que la función asigne un valor predeterminado seguro, mientras que el usuario aún puede sobrescribirlo si es necesario.

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

Datos binarios

str almacena texto, bytes y bytearray almacenan valores de bytes en bruto.

1234
b1 = b"hello" b2 = bytes([72, 105]) buf = bytearray(b"abc") buf[0] = 65

Codificación y decodificación

La codificación convierte texto en bytes para que pueda almacenarse o transferirse de manera confiable, mientras que la decodificación restaura esos bytes a texto legible. El uso de una codificación definida como UTF-8 garantiza que los caracteres se conserven correctamente.

123
text = "café" data = text.encode("utf-8") back = data.decode("utf-8")

Datos binarios en la práctica

Uso de bytes y bytearray para manejar información binaria en bruto. Estos tipos son esenciales para tareas donde los datos no son solo texto, tales como:

  • Lectura y escritura de archivos en modo binario (como imágenes, audio o archivos ejecutables);
  • Envío y recepción de datos a través de redes, donde se deben transmitir secuencias exactas de bytes;
  • Análisis o construcción de protocolos binarios, por ejemplo, al comunicarse con hardware o APIs de bajo nivel.

bytes vs bytearray

  • Los objetos bytes son inmutables: no se puede cambiar su contenido después de crearlos. Úselos cuando se necesiten datos binarios fijos, como el contenido de archivos o hashes criptográficos;
  • Los objetos bytearray son mutables: se puede modificar su contenido en el lugar. Esto es útil para construir o editar datos binarios antes de guardarlos o enviarlos.

Ejemplo: Modificación de datos binarios

# 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')

Conversión entre bytes y bytearray

  • Convertir bytes a bytearray para permitir modificaciones:
b = b"data"
ba = bytearray(b)
  • Convertir bytearray de nuevo a bytes para almacenamiento o transmisión:
ba = bytearray(b"abc")
b = bytes(ba)

Codificación y decodificación

  • Usar .encode() en una cadena para obtener un objeto bytes con una codificación específica (como UTF-8);
  • Usar .decode() en un objeto bytes o bytearray para obtener una cadena.

Esto es crucial al trabajar con entrada/salida de archivos o datos de red, donde a menudo se reciben o envían bytes en bruto y es necesario convertirlos a texto legible o desde él.

Casos de uso típicos

  • Entrada/Salida de archivos:
    • Abrir archivos en modo binario ("rb" o "wb") para leer o escribir bytes exactos.
  • Datos de red:
    • La comunicación por sockets envía y recibe datos como bytes.
  • Protocolos binarios:
    • Construcción o análisis de paquetes usando bytearray para ediciones eficientes en el lugar.

Comprender cuándo usar cada tipo ayuda a escribir código robusto para el manejo de datos en situaciones reales.

Casos de uso típicos para Bytes y Bytearray

Se utilizan bytes y bytearray al trabajar directamente con datos binarios en bruto, en lugar de texto. Estos tipos son esenciales en varios escenarios:

  • Lectura o escritura de archivos binarios, como imágenes, audio o ejecutables;
  • Manejo de datos de red, ya que los sockets envían y reciben bytes, no cadenas de texto;
  • Interacción con protocolos binarios, donde se deben construir o analizar mensajes como secuencias de bytes.

bytes es una secuencia inmutable, lo que significa que no se puede cambiar su contenido después de crearlo. Esto es ideal cuando se necesita asegurar que los datos permanezcan sin cambios, como al leer un archivo o recibir un paquete de red.

bytearray es mutable, por lo que se puede modificar su contenido en el lugar. Utilice bytearray cuando sea necesario construir un mensaje, alterar partes de un búfer o manipular datos binarios de manera eficiente antes de enviarlos o guardarlos.

Cuándo usar cada uno:

  • Usar bytes para datos binarios fijos y de solo lectura, como el contenido de archivos o mensajes de red que no necesitan modificarse;
  • Usar bytearray cuando sea necesario editar, agregar o modificar los datos binarios antes de su procesamiento o transmisión.

Conversión entre bytes y bytearray

Se puede convertir fácilmente entre objetos bytes (inmutables) y bytearray (mutables) en Python. Esto permite elegir el tipo adecuado según las necesidades—bytes para datos fijos, bytearray cuando se necesita modificar el contenido.

  • Usar el constructor bytes() para convertir un bytearray en un objeto bytes inmutable;
  • Usar el constructor bytearray() para crear una copia mutable a partir de un objeto bytes.

Esto es útil cuando se necesita editar datos binarios (usando bytearray), y luego fijarlos (usando bytes) para almacenamiento o transmisión segura.

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)

Una vez convertido a bytes, no se puede cambiar el contenido. Utilice bytearray cuando sea necesario editar datos binarios antes de finalizarlos como 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")

Diferencias de longitud

Algunos caracteres ocupan un elemento de texto pero varios bytes, por lo que su longitud en str y en la forma codificada puede diferir. Esto ocurre porque codificaciones como UTF-8 pueden usar más de un byte para representar un solo carácter.

123
ch = "é" len(ch) # 1 len(ch.encode()) # 2

Archivos

Los archivos binarios deben abrirse en modo "rb" para que sus bytes sin procesar se lean exactamente como están almacenados. Esto evita que Python intente interpretar los datos como texto.

# with open("example.png", "rb") as f:
#     blob = f.read()
¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 4. Capítulo 3
some-alt