54  🐍 Actividad 2: atributos y métodos de los objetos

Fecha: 03 de noviembre, 2026

Objetivo: Utilizar los atributos y métodos de los objetos de Python (cadenas, listas, tuplas, conjuntos y diccionarios) y comprender cómo se comportan los métodos en objetos mutables e inmutables.

Nivel: Básico a intermedio.

Instrucciones: Resuelve cada ejercicio completando su código. Antes de ejecutar cada programa, analiza qué resultado esperas obtener. Completa los espacios ______; en algunos ejercicios se revisa tu respuesta automáticamente.

54.1 ¿Cómo usar los editores de esta página?

Los editores de esta página funcionan igual que en la 🐍 Actividad 1: presiona Run Code para ejecutar el código; en algunos ejercicios, Run Code también revisa tu respuesta. Usa Show Hint para ver una pista y, después, Show Solution para ver la solución.

Importante

Lo que escribas en los editores no se guarda al recargar la página. Si quieres conservar tu código, usa las opciones B, C o D de la siguiente sección.

Usa este editor libre para probar los ejemplos del recordatorio:

54.2 ¿Dónde hacer esta actividad?

Puedes resolver la actividad de cuatro formas. El contenido y los ejercicios son los mismos; elige la que prefieras. También encontrarás los enlaces a cada opción en la barra de la derecha, en Haz esta actividad en…

A: en este libro B: en Google Colab C: en Jupyter Notebook D: en RStudio (tu .qmd)
¿Dónde se ejecuta? En tu navegador, en esta página. En una computadora de Google. En tu computadora. En tu computadora.
¿Qué necesitas? Nada, solo el navegador. Una cuenta de Google. El entorno quarto-python con Jupyter. RStudio y el entorno quarto-python configurado.
Archivo Ninguno. actividad2.ipynb (en tu Drive). actividad2.ipynb actividad2.qmd
¿Se guarda tu trabajo? No: se pierde al recargar la página. Sí, si guardas una copia en tu Drive. Sí, en tu computadora. Sí, en tu computadora (y puedes subirlo a GitHub).
¿Necesita internet? Solo para cargar la página. Sí, siempre. No. No.
Revisión de respuestas Automática, con Run Code. Celdas ✅ Verificar. Celdas ✅ Verificar. Bloques ✅ Verificar.
Resultado final — Notebook en Drive. Notebook .ipynb. Documento HTML con Render.

54.2.1 Opción A. En este libro

Usa los editores interactivos de esta página, como se explica en la sección anterior, ¿Cómo usar los editores de esta página?. Es la opción más rápida, pero tu código no se guarda: si quieres conservarlo, cópialo en otro lugar antes de cerrar la página.

54.2.2 Opción B. En Google Colab

Abrir en Colab
  1. Da clic en el botón Open in Colab e inicia sesión con tu cuenta de Google.
  2. Guarda tu propia copia: Archivo > Guardar una copia en Drive. ¡No te saltes este paso! Si trabajas sin guardar una copia, tus cambios se perderán.
  3. Ejecuta las celdas en orden, de arriba hacia abajo, con el botón ▶ o con Shift + Enter.
  4. Completa los espacios ______ de cada ejercicio y ejecuta la celda.

¿Qué cambia respecto al libro?

En el libro (Opción A) En Google Colab (Opción B)
Editores con el botón Run Code. Celdas de código con el botón ▶ (o Shift + Enter).
Botones Show Hint y Show Solution. Bloques 💡 Pista y ✔️ Solución: da clic sobre ellos para desplegarlos.
Run Code revisa tu respuesta automáticamente. Ejecuta tu solución y después la celda ✅ Verificar el ejercicio…
Start Over regresa al código inicial. No existe: si borras algo, consúltalo en el libro o vuelve a abrir el enlace original.
Cada editor es independiente. Todas las celdas comparten las mismas variables: ejecútalas en orden.
El código se pierde al recargar la página. El código se guarda en tu copia de Drive.
Nota

En los ejercicios con verificación, la última línea de tu código guarda el resultado en la variable respuesta (por ejemplo, respuesta = porcentaje). No borres esa línea: la celda ✅ Verificar revisa esa variable. Si la sesión se desconecta, usa Entorno de ejecución > Ejecutar todas.

54.2.3 Opción C. En Jupyter Notebook (en tu computadora)

  1. Descarga el notebook: 📥 actividad2.ipynb. También puedes verlo en GitHub.

  2. Mueve el archivo a la carpeta donde guardas tus trabajos del curso.

  3. Abre la Terminal, activa tu entorno y abre Jupyter Notebook:

    source ~/.venvs/quarto-python/bin/activate
    jupyter notebook
    source ~/.venvs/quarto-python/Scripts/activate
    jupyter notebook
  4. Se abrirá el navegador. Navega hasta la carpeta del archivo y da doble clic en actividad2.ipynb.

  5. Ejecuta las celdas en orden con Shift + Enter. Tu trabajo se guarda con Ctrl/Cmd + S.

Las diferencias con el libro son las mismas que en Google Colab (tabla de la opción B). Además:

  • La celda ✅ Verificar muestra su código (en Colab aparece oculto); no necesitas leerlo, solo ejecutarlo.
  • No cierres la Terminal mientras usas Jupyter: es el programa que ejecuta tu código. Para terminar, guarda el notebook y presiona Ctrl + C en la Terminal.
  • Si jupyter: command not found, activa el entorno (paso 3) o consulta el capítulo Configuraciones para usar Quarto con Python.

54.2.4 Opción D. En RStudio, con tu propio archivo .qmd

Esta opción te da tu propio documento de Quarto con toda la actividad: escribes tus respuestas en él, lo guardas en tu carpeta del curso y, al final, lo conviertes en un documento HTML con Render. Es la mejor opción si quieres entregar tu actividad o guardarla en tu repositorio de GitHub.

Requisito: haber configurado tu entorno en el capítulo Configuraciones para usar Quarto con Python (pasos 1 a 6).

  1. Descarga el archivo: 📥 actividad2.qmd.

  2. Muévelo a la carpeta de tu proyecto de RStudio del curso y ábrelo con File > Open File…

  3. En el encabezado (YAML), cambia Tu nombre por tu nombre:

    ---
    title: "🐍 Actividad 2: atributos y métodos de los objetos"
    author: "Tu nombre"
    format: html
    jupyter: python3
    execute:
      error: true   # Muestra los errores sin detener el documento
    ---
  4. Ejecuta los bloques en orden con el botón ▶ de cada bloque (o Cmd/Ctrl + Shift + Enter). El resultado aparece debajo de cada bloque.

  5. Completa los espacios ______ y ejecuta los bloques ✅ Verificar después de tu solución.

  6. Guarda tus cambios (Cmd/Ctrl + S) y, al terminar, presiona Render para generar actividad2.html con todas tus respuestas y resultados.

Elemento del YAML ¿Para qué sirve?
jupyter: python3 Usa el motor Jupyter con el Python de QUARTO_PYTHON al presionar Render.
execute: error: true Si un bloque tiene un error (por ejemplo, un ______ sin completar), el documento sí se genera y muestra el error en lugar de detenerse.
Tip¿Y si quiero empezar mi propio .qmd desde cero?

También puedes crear un documento nuevo con File > New File > Quarto Document…, poner el YAML de arriba y copiar ahí los ejercicios que quieras. Así practicas lo que aprendiste en el Paso 7 del capítulo de configuración.

Advertencia

Si al ejecutar un bloque aparece ModuleNotFoundError o NameError: name '______' is not defined:

  • NameError con ______ significa que todavía no completaste ese espacio: es normal.
  • ModuleNotFoundError indica un problema de configuración: consulta la solución de problemas del capítulo de configuración.

54.3 Recordatorio: ¿cómo se usa un objeto?

En Python accedemos a los atributos y métodos de un objeto con un punto (.):

objeto.atributo      # Atributo: información del objeto (sin paréntesis)
objeto.metodo()      # Método: una acción que realiza el objeto (con paréntesis)

La diferencia principal:

Atributo Método
¿Qué es? Un dato guardado en el objeto. Una función que pertenece al objeto.
¿Lleva paréntesis? No: objeto.atributo Sí: objeto.metodo()
Ejemplo numero.real saludo.upper()

54.3.1 Atributos de los números: real e imag

Un número complejo tiene una parte real y una parte imaginaria: \(a + bi\). En Python la unidad imaginaria se escribe con j, por ejemplo 3 + 4j.

Los números en Python tienen dos atributos:

Atributo ¿Qué contiene? Ejemplo con 3 + 4j
real La parte real del número. 3.0
imag La parte imaginaria del número (sin la j). 4.0
Código
numero = 3 + 4j          # Número complejo

print(numero.real)       # Atributo: parte real
3.0
Código
print(numero.imag)       # Atributo: parte imaginaria
4.0
Código
print(type(numero.real)) # Ambas partes se guardan como float
<class 'float'>

Los enteros (int) y los decimales (float) también tienen estos atributos. Su parte imaginaria es 0:

Código
edad = 20
print(edad.real)
20
Código
print(edad.imag)
0

Compara con un método del mismo objeto. conjugate() regresa el conjugado del número (\(3 - 4i\)), y por ser método lleva paréntesis:

Código
print(numero.conjugate())
(3-4j)
Código
saludo = "hola"
print(saludo.upper())    # Método de las cadenas
HOLA

Si escribes paréntesis en un atributo, Python marca un error, porque un atributo es un dato y no una función que se pueda llamar:

Código
numero.real()
TypeError: 'float' object is not callable

54.3.2 dir(): ¿qué atributos y métodos tiene un objeto?

La función dir() regresa una lista con los nombres de todos los atributos y métodos de un objeto:

Código
print(dir(numero))
['__abs__', '__add__', '__bool__', '__class__', '__complex__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__mul__', '__ne__', '__neg__', '__new__', '__pos__', '__pow__', '__radd__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__rpow__', '__rsub__', '__rtruediv__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', 'conjugate', 'imag', 'real']

Los nombres que empiezan y terminan con doble guion bajo, como __add__, son métodos especiales que Python usa internamente (por ejemplo, __add__ se ejecuta cuando usamos +). Por ahora podemos ignorarlos y mostrar solo los demás (no te preocupes por la sintaxis de esta línea: la entenderás en el capítulo de ciclos for):

Código
print([nombre for nombre in dir(numero) if not nombre.startswith("_")])
['conjugate', 'imag', 'real']

Ahí aparecen real e imag (atributos) y conjugate (método). Hagamos lo mismo con una cadena de texto:

Código
print([nombre for nombre in dir("hola") if not nombre.startswith("_")])
['capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'removeprefix', 'removesuffix', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
Tip

dir() no indica cuál nombre es atributo y cuál es método. Para saberlo, consulta su documentación con help().

54.3.3 help(): ¿cómo se usa un atributo o método?

La función help() muestra la documentación de un objeto, una función o un método: qué hace, qué argumentos recibe y qué regresa.

Código
help(str.upper)
Help on method_descriptor:

upper(self, /) unbound builtins.str method
    Return a copy of the string converted to uppercase.
Código
help(str.replace)
Help on method_descriptor:

replace(self, old, new, count=-1, /) unbound builtins.str method
    Return a copy with all occurrences of substring old replaced by new.

      count
        Maximum number of occurrences to replace.
        -1 (the default value) means replace all occurrences.

    If the optional argument count is given, only the first count occurrences are
    replaced.

Para consultar un método escribimos el tipo, un punto y el nombre del método sin paréntesis: help(str.replace), no help(str.replace()). También funciona con un objeto: help(saludo.upper).

Función ¿Qué hace? Ejemplo
type() Indica el tipo del objeto. type(numero)
dir() Lista los nombres de sus atributos y métodos. dir(numero)
help() Muestra la documentación de un objeto o método. help(str.upper)
Nota

Si ejecutas help(str) en la consola, la documentación es muy larga y se muestra por páginas. Avanza con la barra espaciadora y sal con la tecla q. En Jupyter, Colab y Quarto se muestra completa debajo de la celda.

54.3.4 Funciones integradas y atributos más usados

Además de los métodos, Python tiene funciones integradas (built-in functions), como len(). Estas funciones no se escriben con punto: el objeto va dentro de los paréntesis.

Función integrada Método Atributo
¿Cómo se escribe? funcion(objeto) objeto.metodo() objeto.atributo
Ejemplo len(lista) lista.count(3) numero.real
¿Funciona con…? Muchos tipos de objetos. Solo con el tipo al que pertenece. Solo con el tipo al que pertenece.

Por eso escribimos len(lista) y no lista.len().

Funciones integradas más usadas

Función ¿Qué hace? Ejemplo Resultado
print() Muestra uno o más valores. print("Hola", 5) Hola 5
type() Regresa el tipo del objeto. type(3.5) <class 'float'>
id() Regresa la identidad del objeto. id(x) 4371203472
len() Regresa el número de elementos. len([4, 7, 1]) 3
sum() Suma los elementos. sum([4, 7, 1]) 12
min(), max() Regresan el menor o el mayor elemento. max([4, 7, 1]) 7
abs() Valor absoluto. abs(-8) 8
round() Redondea a cierto número de decimales. round(3.14159, 2) 3.14
pow() Potencia (igual que **). pow(2, 10) 1024
divmod() Cociente y residuo de una división entera. divmod(17, 5) (3, 2)
sorted() Regresa una lista nueva ordenada. sorted([4, 7, 1]) [1, 4, 7]
range() Genera una secuencia de enteros. list(range(1, 6)) [1, 2, 3, 4, 5]
int(), float(), str() Convierten a entero, decimal o texto. int("42") 42
list(), tuple(), set() Convierten a lista, tupla o conjunto. set([1, 1, 2]) {1, 2}
isinstance() Indica si un objeto es de cierto tipo. isinstance(5, int) True
dir() Lista los atributos y métodos de un objeto. dir(5) ['__abs__', ...]
help() Muestra la documentación. help(len) (documentación)

Pruébalas: modifica la lista y presiona Run Code.

Advertencia

Si escribes una función integrada como si fuera un método, obtendrás un error: numeros.len() produce AttributeError: 'list' object has no attribute 'len'.

Atributos más usados

Los atributos son menos comunes que los métodos en los tipos básicos de Python. Estos son los que más usarás:

Tipo de objeto Atributo ¿Qué contiene? Ejemplo Resultado
int, float, complex real Parte real del número. (3 + 4j).real 3.0
int, float, complex imag Parte imaginaria del número. (3 + 4j).imag 4.0
int numerator Numerador (el propio entero). (7).numerator 7
int denominator Denominador (siempre 1). (7).denominator 1
range start, stop, step Inicio, fin y paso del rango. range(0, 10, 2).step 2
Cualquier objeto __class__ El tipo del objeto (igual que type()). "hola".__class__ <class 'str'>
Cualquier objeto __doc__ El texto de su documentación. len.__doc__ 'Return the number of items...'
Nota

Para usar un atributo directamente sobre un número entero escribe el número entre paréntesis: (7).numerator. Si escribes 7.numerator, Python cree que el punto es el punto decimal y marca un SyntaxError.

Cuando trabajes con bibliotecas como NumPy y pandas, los atributos serán muy frecuentes:

Biblioteca Atributo ¿Qué contiene?
NumPy (array) shape Dimensiones del arreglo, por ejemplo (3, 4).
NumPy (array) ndim Número de dimensiones.
NumPy (array) size Número total de elementos.
NumPy (array) dtype Tipo de dato de los elementos.
NumPy (array) T La matriz transpuesta.
pandas (DataFrame) shape Número de filas y columnas.
pandas (DataFrame) columns Nombres de las columnas.
pandas (DataFrame) dtypes Tipo de dato de cada columna.

54.3.5 Principales métodos

Tipo Método ¿Qué hace? ¿Modifica el objeto?
str upper(), lower() Convierte a mayúsculas / minúsculas. No, regresa una nueva cadena.
str replace(a, b) Reemplaza a por b. No, regresa una nueva cadena.
str count(x) Cuenta cuántas veces aparece x. No
str split(sep) Separa la cadena en una lista. No
str strip() Elimina espacios al inicio y al final. No
list append(x) Agrega x al final. Sí
list extend(lista) Agrega varios elementos al final. Sí
list insert(i, x) Inserta x en la posición i. Sí
list remove(x) Elimina la primera aparición de x. Sí
list pop() Elimina y regresa el último elemento. Sí
list sort(), reverse() Ordena / invierte la lista. Sí
tuple count(x), index(x) Cuenta / busca la posición de x. No
set add(x) Agrega x al conjunto. Sí
set union(), intersection(), difference() Operaciones de conjuntos. No, regresan un nuevo conjunto.
dict keys(), values(), items() Regresan las claves, valores o pares. No
dict get(clave) Regresa el valor de una clave (o None si no existe). No
dict update(dicc) Agrega o actualiza pares clave-valor. Sí
dict pop(clave) Elimina una clave y regresa su valor. Sí

Observa el patrón: los métodos de los objetos inmutables (str, tuple) nunca modifican el objeto original, siempre regresan un objeto nuevo.

54.4 Parte I. Cadenas de texto (str)

54.4.1 Ejercicio 1. Transformar un nombre

Dada la variable nombre, muestra:

  • El nombre en mayúsculas.
  • El nombre en minúsculas.
  • El nombre sin los espacios al inicio y al final.
  • La variable nombre original. ¿Cambió?
NotaPista

Usa los métodos upper(), lower() y strip(). Recuerda escribir el punto y los paréntesis: nombre.upper().

TipSolución
nombre = "   Ana María López   "

print(nombre.upper())
print(nombre.lower())
print(nombre.strip())
print(nombre)  # No cambió: las cadenas son inmutables

Cada método regresa una cadena nueva; la original no cambia porque las cadenas son inmutables.

54.4.2 Ejercicio 2. Los dígitos de \(\pi\)

La variable pi guarda las primeras cifras de \(\pi\) como texto:

  1. Quita el punto decimal con replace() y guarda el resultado en digitos. Muestra cuántos dígitos son con len().
  2. Cuenta cuántas veces aparecen los dígitos "3", "5" y "9" con el método count().
  3. Calcula el porcentaje de dígitos impares (1, 3, 5, 7 y 9):

\[\% \text{impares} = \frac{\text{número de dígitos impares}}{\text{total de dígitos}} \times 100\]

Deja el resultado en la última línea para que se revise tu respuesta.

NotaPista

pi.replace(".", "") reemplaza el punto por una cadena vacía, es decir, lo elimina. digitos.count("3") regresa cuántos 3 hay. Para los impares suma cinco conteos: digitos.count("1") + digitos.count("3") + ...

TipSolución
pi = "3.1415926535897932384"

digitos = pi.replace(".", "")
print("Dígitos:", digitos, "Total:", len(digitos))   # Total: 20

print("3:", digitos.count("3"))   # 4
print("5:", digitos.count("5"))   # 3
print("9:", digitos.count("9"))   # 3

impares = (digitos.count("1") + digitos.count("3") + digitos.count("5")
           + digitos.count("7") + digitos.count("9"))
porcentaje = impares / len(digitos) * 100
porcentaje   # 65.0

Observa que count() funciona porque pi es una cadena de texto (str). Si pi fuera un número (float), no tendría los métodos replace() ni count().

54.4.3 Ejercicio 3. Separar y unir texto

Separa la siguiente cadena en una lista de frutas con split() y después vuelve a unirlas en una sola cadena, separadas por " | ", con el método join().

NotaPista

split(",") separa la cadena cada vez que encuentra una coma. join() se escribe al revés de lo que esperarías: primero el separador y luego la lista, " | ".join(lista).

TipSolución
frutas = "manzana,pera,uva,mango"

lista_frutas = frutas.split(",")
print(lista_frutas)
print(type(lista_frutas))

unidas = " | ".join(lista_frutas)
print(unidas)

Observa que split() convierte una cadena (str) en una lista (list), y join() hace lo contrario.

54.5 Parte II. Listas (list)

54.5.1 Ejercicio 4. Mi lista de compras

A partir de la lista compras:

  1. Agrega "café" al final con append().
  2. Agrega "pan" y "queso" con extend().
  3. Inserta "agua" en la primera posición con insert().
  4. Elimina "leche" con remove().
  5. Elimina el último elemento con pop() y guárdalo en la variable ultimo.
  6. Muestra la lista final, el elemento eliminado y el número de elementos con len().
NotaPista

extend() recibe una lista: compras.extend(["pan", "queso"]). insert() recibe la posición y el elemento: compras.insert(0, "agua").

TipSolución
compras = ["huevos", "leche", "tortillas"]

compras.append("café")
compras.extend(["pan", "queso"])
compras.insert(0, "agua")
compras.remove("leche")
ultimo = compras.pop()

print(compras)
print("Elemento eliminado:", ultimo)
print("Número de elementos:", len(compras))

54.5.2 Ejercicio 5. Ordenar calificaciones

  1. Ordena las calificaciones de menor a mayor con sort().
  2. Ordénalas de mayor a menor con sort(reverse=True).
  3. ¿Cuántas veces aparece el 10? Usa count().
  4. Con la lista ordenada de mayor a menor, ¿en qué posición está el primer 6? Usa index() y deja el resultado en la última línea.
NotaPista

sort() no regresa nada, solo modifica la lista: escribe calificaciones.sort() en su propia línea. Para la posición: calificaciones.index(6).

TipSolución
calificaciones = [8, 10, 6, 9, 10, 7, 6]

calificaciones.sort()
print(calificaciones)

calificaciones.sort(reverse=True)
print(calificaciones)

print("Veces que aparece el 10:", calificaciones.count(10))

calificaciones.index(6)   # 5

54.5.3 Ejercicio 6. ¿Por qué obtengo None?

Ejecuta el código y responde:

  • ¿Qué valor tiene ordenada?
  • ¿Qué valor tiene numeros?
  • ¿Cómo lo corregirías para que ordenada tenga la lista ordenada sin modificar numeros?
NotaPista

Los métodos que modifican una lista, como sort(), regresan None. Existe una función llamada sorted() que regresa una lista nueva.

TipSolución

El método sort() modifica la lista original (las listas son mutables) y no regresa nada, es decir, regresa None. Para obtener una lista nueva ordenada sin modificar la original utilizamos la función sorted():

numeros = [5, 2, 9, 1]
ordenada = sorted(numeros)

print("ordenada:", ordenada)   # [1, 2, 5, 9]
print("numeros:", numeros)     # [5, 2, 9, 1]

54.5.4 Ejercicio 7. Copia vs. referencia

Ejecuta el código. ¿Por qué cambió también lista_a? Compruébalo comparando las identidades con id() y después corrígelo con el método copy(), para que lista_a no cambie.

NotaPista

Cambia la segunda línea por lista_b = lista_a.copy().

TipSolución

lista_b = lista_a no crea una lista nueva: ambas variables hacen referencia al mismo objeto. Con copy() creamos un objeto nuevo:

lista_a = [1, 2, 3]
lista_b = lista_a.copy()
lista_b.append(4)

print("lista_a:", lista_a)   # [1, 2, 3]
print("lista_b:", lista_b)   # [1, 2, 3, 4]
print("¿Mismo objeto?", id(lista_a) == id(lista_b))   # False

54.6 Parte III. Tuplas (tuple) y conjuntos (set)

54.6.1 Ejercicio 8. Métodos de una tupla

Las tuplas son inmutables, por lo que solo tienen dos métodos: count() e index().

  1. Cuenta cuántas veces aparece "rojo".
  2. Encuentra la posición de "azul".
  3. Ejecuta la última línea, que intenta agregar un color con append(). ¿Qué error obtienes y por qué?
NotaPista

colores.count("rojo") y colores.index("azul"). Usa dir(colores) para ver qué métodos tiene una tupla.

TipSolución
colores = ("rojo", "verde", "azul", "rojo", "amarillo")

print("Veces que aparece rojo:", colores.count("rojo"))   # 2
print("Posición de azul:", colores.index("azul"))         # 2

colores.append("negro")   # AttributeError

Obtenemos un AttributeError: 'tuple' object has no attribute 'append': las tuplas no tienen el método append() porque son inmutables.

54.6.2 Ejercicio 9. Divisores comunes y máximo común divisor

Los conjuntos divisores_12 y divisores_18 deberían contener todos los divisores de 12 y de 18, pero a uno le falta un elemento:

  1. Agrega el divisor que le falta a divisores_12 con add().
  2. Obtén todos los números que dividen a 12 o a 18 con union().
  3. Obtén los divisores de 12 que no dividen a 18 con difference().
  4. Obtén los divisores comunes con intersection().
  5. En la última línea, calcula el máximo común divisor (MCD) de 12 y 18 aplicando la función max() a los divisores comunes.
NotaPista

12 = 2 × 6, así que el 6 divide a 12. divisores_12.add(6) modifica el conjunto; divisores_12.intersection(divisores_18) regresa un conjunto nuevo. max() es una función y no un método: max(comunes).

TipSolución
divisores_12 = {1, 2, 3, 4, 12}
divisores_18 = {1, 2, 3, 6, 9, 18}

divisores_12.add(6)
print("Dividen a 12 o a 18:", divisores_12.union(divisores_18))
print("Dividen a 12 pero no a 18:", divisores_12.difference(divisores_18))   # {4, 12}

comunes = divisores_12.intersection(divisores_18)
print("Divisores comunes:", comunes)   # {1, 2, 3, 6}

max(comunes)   # 6

Recuerda que los conjuntos no tienen orden, por lo que los elementos pueden aparecer en un orden distinto.

54.7 Parte IV. Diccionarios (dict)

54.7.1 Ejercicio 10. Ficha de un estudiante

A partir del diccionario estudiante:

  1. Muestra sus claves con keys() y sus valores con values().
  2. Obtén la carrera con get(). ¿Qué pasa si pides una clave que no existe, como "telefono"?
  3. Agrega el semestre (1) y actualiza la edad a 20 con update().
  4. Elimina la clave "correo" con pop().
  5. Muestra los pares clave-valor con items().
NotaPista

update() recibe otro diccionario: estudiante.update({"semestre": 1, "edad": 20}). pop() recibe la clave que quieres eliminar.

TipSolución
estudiante = {
    "nombre": "Ana",
    "edad": 19,
    "carrera": "Matemáticas para el Desarrollo",
    "correo": "ana@ejemplo.com"
}

print(estudiante.keys())
print(estudiante.values())

print(estudiante.get("carrera"))
print(estudiante.get("telefono"))  # Regresa None en lugar de un error

estudiante.update({"semestre": 1, "edad": 20})
correo = estudiante.pop("correo")

print(estudiante.items())

54.8 Reto final: estadística sin ciclos

Con los métodos y las funciones integradas que conoces, calcula las principales medidas estadísticas de la lista datos, sin modificar la lista original:

  1. Media: la suma de los datos entre el número de datos, redondeada a 2 decimales.
  2. Mediana: el dato que queda en medio cuando la lista está ordenada (la lista tiene 9 datos, así que es el que está en el índice 4).
  3. Moda: el dato que más se repite.
  4. Rango: la diferencia entre el dato mayor y el menor.
  5. Guarda los resultados en el diccionario resumen y déjalo en la última línea.
NotaPista
  • Media: round(sum(datos) / len(datos), 2).
  • Mediana: sorted(datos) regresa una lista nueva ordenada; el elemento de en medio está en el índice len(ordenados) // 2 (el operador // divide y descarta los decimales).
  • Moda: max() acepta el argumento key, que indica qué comparar. max(set(datos), key=datos.count) busca, entre los valores únicos, el que tiene el mayor datos.count(...).
  • Rango: usa max() y min().
TipSolución
datos = [12, 7, 3, 7, 25, 12, 7, 9, 18]

media = round(sum(datos) / len(datos), 2)
ordenados = sorted(datos)
mediana = ordenados[len(ordenados) // 2]
moda = max(set(datos), key=datos.count)
rango = max(datos) - min(datos)

print("Datos originales:", datos)
print("Datos ordenados:", ordenados)

resumen = {"media": media, "mediana": mediana, "moda": moda, "rango": rango}
resumen   # {'media': 11.11, 'mediana': 9, 'moda': 7, 'rango': 22}

Si hubieras usado datos.sort(), la lista original se habría modificado (las listas son mutables). sorted() es una función que regresa un objeto nuevo y deja intacto el original.

54.9 Referencias