90UBA XXI, cátedra Balbiano

Pensamiento Computacional · Guía Primer Parcial

UBA XXI · Cátedra Balbiano · Guía intensiva del 1er parcial, con ejemplos del parcial del 21/4/2025
1 Estrategia general del parcial

La estructura del parcial Balbiano

El parcial de Pensamiento Computacional tiene 9 o 10 preguntas de opción múltiple con una sola respuesta correcta. La duración es de 1:30 h.

Las preguntas 1-5 (o 1-7) valen 1 punto cada una. Las últimas 4 (o 3) valen 2 puntos o 0 (sin puntos intermedios). La nota se calcula según una escala fija: de 13 puntos máximos posibles a nota del 1 al 10.

Puntos acumulados1-23-45-678910111213
Nota12345678910
Estrategia de puntaje
Con 7 puntos sacás un 4 y aprobás el parcial. Hay varias maneras de llegar: las cinco preguntas de 1 punto más una de 2, o tres de 1 punto más dos de 2, por ejemplo. Como las de 2 puntos son todo o nada, asegurá primero las de 1 punto y después andá por las largas.

Ojo: aprobar el parcial no es promocionar. En UBA XXI promocionás la materia, sin rendir final, si aprobás los dos parciales con 4 o más y el promedio entre los dos da 6,50 o más. Con promedio entre 4 y 6 vas a final.

Los tipos de preguntas del parcial 21/4/2025

Cada tema (1 a 8) repite la misma estructura de 9 ejercicios. Los tipos que aparecen:

EjercicioTipo de preguntaQué piden
1, 4, 7Encontrar el programa correcto¿Cuál programa muestra/hace exactamente X?
2Trazar expresión aritmética¿Qué muestra print(...)? (con precedencia, **, //)
3Lista resultante¿Con qué contenido queda la lista al final?
5Función fun()¿Qué devuelve la función con el texto dado?
6Trazar bucle anidado¿Qué muestra por pantalla un programa con dos for/while?
8Elegir función correcta¿Cuál def hace que el programa muestre X?
9Equivalencia de condiciones¿Cuál condición es equivalente a la dada (probando con valores)?

Las 3 preguntas que te tenés que hacer antes de cada ejercicio

Pregunta 1: ¿Qué tipo de ejercicio es?

Mirá la primera oración. Las palabras clave te dicen todo:

  • "¿Qué muestra el siguiente programa?" → Trazá la ejecución línea a línea (Ej 2 y 6).
  • "¿Cuál de los siguientes programas muestra X?" → Probá cada opción A/B/C/D con los valores dados; descartá las que tiren error o resultado distinto (Ej 1, 4, 7).
  • "¿Con qué contenido acabará la lista?" → Simulá el bucle paso a paso en papel (Ej 3).
  • "¿Qué devuelve la función fun?" → Trazá el for/while interno y mirá qué tipo devuelve el return (Ej 5).
  • "¿Cuál es la versión correcta de la función?" → Chequeá nombre, cantidad y orden de parámetros, y que el return devuelva lo correcto (Ej 8).
  • "¿Cuál condición es candidata a ser equivalente?" → Probá con los valores que da el enunciado: la equivalente da el mismo V/F que la original en todos los casos (Ej 9).

Pregunta 2: ¿Cuáles son los valores iniciales?

Antes de trazar, anotá en un margen todos los valores iniciales de las variables. Nunca trates de tener los valores "en la cabeza": escribilos.

Pregunta 3: ¿Hay trampa de precedencia o de tipo?

  • ¿Hay potencia (**)? Se evalúa antes que * y /.
  • ¿Hay división entera (//) o módulo (%)? Mismo nivel que *.
  • ¿Hay int(num) == num? Es la forma de detectar si un float es entero.
  • ¿El índice de lista es negativo? lista[-1] es el último elemento.
La regla de oro
Nunca confíes en tu intuición para código Python. Siempre simulá línea a línea en papel. El 80% de los errores en parciales se produce por "ya sé qué hace" sin verificar.

Orden de precedencia de operadores Python

1. ** (potencia): mayor precedencia
2. * / // % (multiplicación, divisiones, módulo)
3. + - (suma y resta)
4. Comparaciones: == != < > <= >=
5. not
6. and
7. or: menor precedencia
Ejemplo de precedencia · Parcial 21/4/2025 Tema 1, Ejercicio 2
a=1; b=0; c=2.5; d=-2
print((a+d**2)/(c-b))
Paso a paso:
1. d**2 = (-2)**2 = 4 (la potencia se evalúa primero)
2. a + 4 = 1 + 4 = 5
3. c - b = 2.5 - 0 = 2.5
4. 5 / 2.5 = 2.0
Resultado: 2.0 (opción C)
Trampa clásica: precedencia de **
La potencia ** se evalúa antes que *, /, +, -. Sin paréntesis, d**2 se calcula primero y recién después se hace la suma a+d**2. Otra trampa frecuente: x**0 = 1 para cualquier x.
↑ Volver al índice
2 Python básico · tipos, operadores y expresiones

Tipos de datos fundamentales

TipoEjemploDescripción
int3, -10, 0Número entero
float2.5, 3.14, -0.5Número con decimales
str'hola', "mundo"Cadena de texto
boolTrue, FalseVerdadero o falso

Operadores aritméticos

OperadorSignificadoEjemploResultado
+suma5+38
-resta5-32
*multiplicación5*315
/división (siempre float)7/23.5
//cociente entero7//23
%resto de la división7%21
**potencia2**38
int() vs float()
int(num) trunca hacia cero: int(3.9) → 3, int(-3.9) → -3.
El truco num == int(num) detecta si un float es en realidad entero: 3.0 == int(3.0) → True, 3.5 == int(3.5) → False.

El operador * con strings y listas

En Python el operador * aplicado a una string o lista con un entero repite:

'hola' * 2  →  'holahola'
'*' * 5     →  '*****'
[0] * 3     →  [0, 0, 0]
[1, 2] * 2  →  [1, 2, 1, 2]
Ejemplo de tracing · Parcial 21/4/2025 Tema 7
a=0; b=1; c=2; d=-2
cant = d - b*b + c*2/b + 4
print('&' * int(cant))
Paso a paso:
1. b*b = 1*1 = 1
2. c*2/b = 2*2/1 = 4.0
3. cant = -2 - 1 + 4.0 + 4 = 5.0
4. int(5.0) = 5
5. '&' * 5 = '&&&&&'
Resultado: &&&&&
Ejemplo de tracing · Parcial 21/4/2025 Tema 4, Ejercicio 2
a=0; b=1; c=2; d=-2
cant = d*d + b**(2+c)*a
print('0' * cant)
Paso a paso:
1. d*d = (-2)*(-2) = 4
2. 2+c = 2+2 = 4
3. b**4 = 1**4 = 1
4. 1*a = 1*0 = 0 (el *a aplasta toda esa parte)
5. cant = 4 + 0 = 4
6. '0'*4 = '0000'
Resultado: 0000 (opción D)

Contar cuántas condiciones se evalúan

No es un ejercicio fijo del parcial, pero la idea te sirve para trazar cualquier if sin equivocarte. La lógica es:

  • Si la primera condición de un if es verdadera y usa or, Python no evalúa la segunda (cortocircuito).
  • Si la primera condición de un if es falsa y usa and, Python no evalúa la segunda (cortocircuito).
  • Una vez que entra a un if, los elif que siguen no se evalúan.
  • Un else no es una condición evaluada (es el caso "restante"), así que no suma al conteo.
Ejemplo conceptual: contar condiciones evaluadas
a=10; ok=True
if a==1 and ok:      # evalúa a==1 (False) → cortocircuito: ok NO se evalúa
  ...
elif a>1:            # se evalúa (True) → entra
  print('Segundo')
else:                # no se llega
  ...
Total de condiciones evaluadas: 2 (a==1 y a>1). El else no cuenta. El ok no se evalúa por cortocircuito.
Trampa: if encadenados vs if/elif
Varios if seguidos son independientes: se evalúa cada uno sí o sí.
elif solo se evalúa si el bloque anterior fue falso.
Esta diferencia genera muchos errores en el conteo de condiciones.

Leer datos del usuario: input()

La función input() lee lo que el usuario escribe por teclado. Regla clave: input() SIEMPRE devuelve un str (una string), aunque el usuario escriba un número.

nombre = input('Tu nombre: ')   # si tipea Ana  → nombre = 'Ana'  (str)
edad   = input('Tu edad: ')     # si tipea 30   → edad   = '30'   (str, NO 30)

Por eso, para hacer cuentas hay que convertir la entrada con int() o float():

n = int(input('Un entero: '))     # tipea 7    → n = 7      (int)
p = float(input('Un decimal: '))  # tipea 2.5  → p = 2.5    (float)
Trampa clásica: olvidar la conversión
Si hacés edad = input(...) y luego edad * 2, como edad es la string '30', el resultado es '3030' (repite la string), no 60. Para sumar/multiplicar como número necesitás int(input(...)) o float(input(...)).
Patrón leer-y-procesar
n = int(input('Numero: '))   # usuario escribe 7
resultado = n * 3 + 1
print(resultado)
Paso a paso:
1. input() devuelve '7' (str)
2. int('7') = 7 (ahora es int)
3. 7 * 3 + 1 = 22
Resultado: 22
↑ Volver al índice
3 Condicionales · if / elif / else

Estructura básica

if condicion1:
    # se ejecuta si condicion1 es True
elif condicion2:
    # se ejecuta si condicion1 fue False y condicion2 es True
else:
    # se ejecuta si ninguna condición anterior fue True
Regla de oro de condicionales
Una vez que Python encuentra un bloque cuya condición es True, ejecuta ese bloque y salta todo el resto del if/elif/else. Los bloques que siguen no se evalúan.

Operadores de comparación y lógicos

OperadorSignificadoEjemplo
==iguala == 5
!=distintoa != 5
<, >, <=, >=comparacióna < 10
inpertenenciax in ('a','b','c')
not inno pertenenciax not in lista
andY lógicoa>0 and b>0
orO lógicoa==1 or b==1
notnegaciónnot (a==1)

El operador in con range()

a in range(1, 8, 2) es equivalente a a in (1, 3, 5, 7). Esto aparece en preguntas de equivalencia de condiciones.

Ejemplo de tracing · Parcial 21/4/2025 Tema 7, Ejercicio 1
producto='birome'; unidad='caja'; precio=60
if producto in ('block A4','etiqueta'):
    ...
elif producto in ('plasticola','hoja','birome'):
    if unidad in ('ciento','docena','bolsa'):
        print('barato')
    else:
        print('caro')
Tracing:
1. producto='birome'. ¿Está en ('block A4','etiqueta')? No → sigue.
2. ¿Está en ('plasticola','hoja','birome')? Sí → entra.
3. ¿unidad='caja' está en ('ciento','docena','bolsa')? No → else.
4. Muestra: "caro"
Ejemplo de equivalencia de condiciones · Parcial 21/4/2025 Tema 4, Ejercicio 9

¿Cuál condición es candidata a ser equivalente a la siguiente?

(num in sel) and (num!=int(num) or num>0 or num%3==0)

Probar con: sel=[2,21,-1,56], num=22 y num=21.

Original con num=22 (no está en sel): False and ... = False.
Original con num=21 (está en sel): True and (False or True or True) = True.

La candidata correcta (opción A del parcial) es:

((num>=1 or not(int(num)==num) or
  (num%3!=1 and num%3!=2)) and (num in sel))

Verificación: con num=22 → (... ) and False = False ✓; con num=21 → (True or ...) and True = True ✓. Las tablas de verdad coinciden.

Condicionales anidados: conteo de condiciones paso a paso

Para contar condiciones evaluadas con valores dados, seguí este método:

  1. Copiá el programa en papel con los valores iniciales.
  2. Evaluá la primera condición. Anotá si es True o False.
  3. Si es True: marcá las líneas que se ejecutan, tachá los elif/else siguientes al mismo nivel.
  4. Si es False: pasá al siguiente elif (que sí se evalúa). Sumás 1 al contador.
  5. Los else sin condición no suman al contador.
  6. Repetí para todos los bloques anidados.
Trampa: cortocircuito con and/or
and: si la primera parte es False, la segunda NO se evalúa. No suma al contador.
or: si la primera parte es True, la segunda NO se evalúa. No suma al contador.
Esto puede hacer diferencia entre opciones que parecen similares.
↑ Volver al índice
4 Ciclos · for y while

El ciclo for

for variable in secuencia:
    # cuerpo del bucle

El cuerpo se ejecuta una vez por cada elemento de la secuencia. La secuencia puede ser una lista, una string, un range, una tupla.

range(): la función más importante del parcial

LlamadaGeneraIteraciones
range(5)0, 1, 2, 3, 45
range(2, 7)2, 3, 4, 5, 65
range(1, 15, 5)1, 6, 113
range(9, 5, -1)9, 8, 7, 64
range(9, 5, -3)9, 62
range(1, 10, -4)(vacío)0
range() con paso negativo
Para que range(inicio, fin, paso) genere elementos, se necesita que inicio > fin cuando el paso es negativo. Si inicio <= fin con paso negativo, el range está vacío y el bucle no itera.

El ciclo while

while condicion:
    # cuerpo del bucle
    # (la condición se reevalúa antes de cada iteración)

El cuerpo se ejecuta mientras la condición sea True. Cuidado con el bucle infinito: siempre tiene que haber algo dentro del bucle que modifique la condición.

Ejemplo: tracing de for anidado · Parcial 21/4/2025 Tema 7, Ejercicio 6
impares='13579'
for i in range(len(impares)):
    linea=''
    for j in range(len(impares)*2):
        if j%2!=0:
            linea+=impares[j//2]
        else:
            linea+=' '
    print(linea)
Tracing:
• len(impares)=5, así que el for externo itera 5 veces (i=0..4).
• El for interno itera 10 veces (j=0..9) y arma linea.
• j par → agrega ' '; j impar → agrega impares[j//2].
• j=0: ' '; j=1: '1'; j=2: ' '; j=3: '3'; j=5: '5'; j=7: '7'; j=9: '9'.
• linea = ' 1 3 5 7 9', y se imprime 5 veces (una por cada i).
Salida (opción B): 5 líneas iguales con " 1 3 5 7 9".
Ejemplo: for con slicing que modifica la string · Parcial 21/4/2025 Tema 5, Ejercicio 6
digitos='123456'
izq=''
for i in range(len(digitos)):
    print(izq+digitos)
    digitos=digitos[1:]
    izq+=' '
Clave: range(len(digitos)) se evalúa una sola vez al inicio del for. Aunque digitos se acorte adentro, el for itera 6 veces.
• i=0: imprime ''+'123456' → "123456"; después digitos='23456', izq=' '.
• i=1: imprime ' 23456'; después digitos='3456', izq=' '.
• i=2: imprime ' 3456'.
• i=3: imprime ' 456'.
• i=4: imprime ' 56'.
• i=5: imprime ' 6'.
Salida (opción B): efecto de "escalera" con 6 líneas.
Ejemplo: for con range desde 1 hasta len-1 · Parcial 21/4/2025 Tema 4, Ejercicio 6
cartel='desde'
print(cartel.upper())
izq=' '
for i in range(1,len(cartel)-1):
    print(izq+cartel[i])
    izq+=' '
print(cartel.upper())
Tracing:
• Antes del for: imprime 'DESDE'.
• range(1, 5-1) = range(1, 4), así que i=1,2,3.
• i=1: imprime ' '+cartel[1] → " e"; izq=' '.
• i=2: imprime ' '+cartel[2] → " s".
• i=3: imprime ' '+cartel[3] → " d".
• Después del for: imprime 'DESDE'.
Salida (opción C): DESDE /  e /   s /    d / DESDE.
Trampa: reasignar la variable de control en el for
for i in range(1,15,5):
    i=0  # ¡esto NO afecta al rango!
Aunque reasignes i dentro del for, el siguiente paso del range asigna el nuevo valor. El bucle sigue iterando normalmente (3 veces en este caso).
↑ Volver al índice
5 Listas y tuplas

Lista: colección mutable de elementos

numeros = [4, 3, 1, 2]
numeros[0]   →  4        # primer elemento (índice 0)
numeros[-1]  →  2        # último elemento
numeros[1:3] →  [3, 1]  # slicing: posiciones 1 y 2 (3 no entra)

Índices negativos

Un índice negativo cuenta desde el final de la lista:

a = [10, 20, 30, 40]
a[-1] →  40   # último
a[-2] →  30   # penúltimo
a[-(len(a))] →  a[0] → 10  # primer elemento

Métodos de lista más usados en parciales

MétodoQué haceEjemplo
append(x)Agrega x al finala.append(5)
extend(lista)Agrega todos los elementos de lista al finala.extend([6,7])
remove(x)Elimina la primera ocurrencia de xa.remove(3)
sort()Ordena la lista de menor a mayor (modifica la original)a.sort()
reverse()Invierte el orden de la lista (modifica la original)a.reverse()
copy()Genera una copia independienteb=a.copy()
count(x)Cuenta cuántas veces aparece xa.count(1)
+ concatena, no modifica
a + b genera una nueva lista. No modifica a ni b.
a.extend(b) sí modifica a.
Esta diferencia es clave en los ejercicios de "¿cuál NO deja la lista así?".
Ejemplo: lista con índice negativo · Parcial 21/4/2025 Tema 7
indicador=[1,2,3,4,5,6]
numeros=[1,2,3,4,5,6]
final=[0]*6          # [0,0,0,0,0,0]
for i in range(len(numeros)):
    final[-(indicador[i])] = numeros[i]
Iteraciones:
i=0: final[-1]=1 → [0,0,0,0,0,1]
i=1: final[-2]=2 → [0,0,0,0,2,1]
i=2: final[-3]=3 → [0,0,0,3,2,1]
i=3: final[-4]=4 → [0,0,4,3,2,1]
i=4: final[-5]=5 → [0,5,4,3,2,1]
i=5: final[-6]=6 → [6,5,4,3,2,1]
Resultado: [6,5,4,3,2,1]
Ejemplo: lista resultante con indicador[i]-1 · Parcial 21/4/2025 Tema 4, Ejercicio 3
indicador=[7,5,1,3,2,4,6]
numeros=[1,2,3,4,5,6,7]
final=[0]*7
for i in range(len(numeros)):
    final[indicador[i]-1]=numeros[i]
Iteraciones (recordá que indicador[i]-1 da el índice positivo donde guardar):
i=0: final[7-1]=final[6]=1 → [0,0,0,0,0,0,1]
i=1: final[5-1]=final[4]=2 → [0,0,0,0,2,0,1]
i=2: final[1-1]=final[0]=3 → [3,0,0,0,2,0,1]
i=3: final[3-1]=final[2]=4 → [3,0,4,0,2,0,1]
i=4: final[2-1]=final[1]=5 → [3,5,4,0,2,0,1]
i=5: final[4-1]=final[3]=6 → [3,5,4,6,2,0,1]
i=6: final[6-1]=final[5]=7 → [3,5,4,6,2,7,1]
Resultado (opción B): [3, 5, 4, 6, 2, 7, 1]
Ejemplo: integrar dos listas con extend + sort · Parcial 21/4/2025 Tema 6, Ejercicio 4
impares=[15,7,11,3]
pares=[22,14]
numeros=[]
numeros.extend(impares)
numeros.extend(pares)
numeros.sort()
Paso a paso:
1. Después del primer extend: numeros=[15,7,11,3].
2. Después del segundo: numeros=[15,7,11,3,22,14].
3. sort() ordena ascendente: [3, 7, 11, 14, 15, 22].
Es la opción C del parcial. Las opciones que parecen razonables pero fallan suelen usar numeros=impares (asignación, no copia) o sumar listas de a una con un for, dejando numeros mal armado.
Ejemplo: sort + reverse para ordenar descendente · Parcial 21/4/2025
numeros=[-3.36,10,2,0.25,-3]
enteros=[]
fraccionarios=[]
for num in numeros:
    if num==int(num):    # ¿es entero?
        enteros.append(num)
    else:
        fraccionarios.append(num)
enteros.sort()
enteros.reverse()
fraccionarios.sort()
fraccionarios.reverse()
Después del for: enteros=[10,2,-3], fraccionarios=[-3.36,0.25]
Después de sort+reverse: enteros=[10,2,-3], fraccionarios=[0.25,-3.36]
Resultado: enteros [10,2,-3] y fraccionarios [0.25,-3.36]

Tuplas

Las tuplas son como listas pero inmutables (no se pueden modificar). Se crean con paréntesis:

t = (1, 2, 3)
t[0]  →  1     # acceso igual que lista
t[-1] →  3     # índice negativo igual que lista

En los parciales las tuplas aparecen principalmente como secuencias en for y como argumentos del operador in.

↑ Volver al índice
6 Strings · slicing, métodos y recorridos

Acceso a caracteres y slicing

pal = 'GEMELO'
pal[0]    →  'G'     # primer carácter (índice 0)
pal[-1]   →  'O'     # último carácter
pal[2:]   →  'MELO'  # desde posición 2 hasta el final
pal[:3]   →  'GEM'   # desde el inicio hasta posición 2 (3 no entra)
pal[1:4]  →  'EME'   # posiciones 1, 2, 3
pal[::-1] →  'OLEMEG' # invertir la string
Slicing: el "hasta" nunca entra
En s[a:b], el índice b no está incluido. 'hola'[1:3] da 'ol', no 'ola'. Acordate: el índice de fin siempre queda afuera.
Ejemplo: concatenación con índice negativo y .upper() · Parcial 21/4/2025 Tema 4, Ejercicio 7

El programa debe mostrar: Siempre la vocal: A está varias veces en ANACONDA

palabra='anaconda'
txt='la vocal: '
frase='Siempre '
frase=frase+txt+palabra[-1].upper()
frase=frase+' está varias veces en '
frase=frase+palabra.upper()
print(frase)
Tracing:
1. palabra[-1] = 'a' (último carácter); .upper() = 'A'.
2. Tras la primera concatenación: frase = 'Siempre la vocal: A'.
3. Tras la segunda: frase = 'Siempre la vocal: A está varias veces en '.
4. palabra.upper() = 'ANACONDA'; tras la tercera: frase = 'Siempre la vocal: A está varias veces en ANACONDA'.
Es la opción B del parcial.
Ejemplo: concatenación con slicing y .upper() · Parcial 21/4/2025 Tema 1, Ejercicio 7

El programa debe mostrar: Agustín, LA PLACA BACTERIANA DENTAL SE QUITA CON: PLAKOUT

mens='LA PLACA DENTAL SE QUITA CON'
nom='Agustín'
tipo='bacteriana'
producto='plakout'
textoMens=nom+', '+mens[:8]+' '+tipo.upper()
textoMens=textoMens+mens[8:]
textoMens=textoMens+': '+producto.upper()
print(textoMens)
Tracing:
1. mens[:8] = 'LA PLACA' (los primeros 8 caracteres; el 8 no entra).
2. mens[8:] = ' DENTAL SE QUITA CON' (todo lo demás, empezando por el espacio).
3. tipo.upper() = 'BACTERIANA'; producto.upper() = 'PLAKOUT'.
4. Después de la primera línea: 'Agustín, LA PLACA BACTERIANA'.
5. Después de la segunda: 'Agustín, LA PLACA BACTERIANA DENTAL SE QUITA CON'.
6. Después de la tercera: 'Agustín, LA PLACA BACTERIANA DENTAL SE QUITA CON: PLAKOUT'.
Es la opción B del parcial.

Métodos de string más usados en parciales

MétodoQué haceEjemplo
upper()Convierte a mayúsculas'hola'.upper() → 'HOLA'
lower()Convierte a minúsculas'HOLA'.lower() → 'hola'
replace(a,b)Reemplaza todas las ocurrencias de a por b'hola'.replace('o','0') → 'h0la'
split()Parte la string por espacios en blancos → lista'a b c'.split() → ['a','b','c']
join(lista)Une una lista con el separador dado → string' '.join(['a','b']) → 'a b'
count(s)Cuenta cuántas veces aparece s'banana'.count('a') → 3
len(s)Longitud de la stringlen('hola') → 4
Trampa: replace() devuelve una nueva string
frase = 'hola mundo'
frase.replace('hola','chau')  # ← ¡NO modifica frase!
print(frase)  # sigue siendo 'hola mundo'

frase = frase.replace('hola','chau')  # ← esto SÍ funciona
print(frase)  # ahora es 'chau mundo'
En los parciales aparecen opciones con frase.replace(...) sin reasignar: esas opciones son incorrectas.
Ejemplo: replace + upper · Parcial 21/4/2025 Tema 7
El objetivo es obtener: LAS ABEJAS VAALAN Y LAS OVEJAS BALAN
frase='Las abejas vuelan y las ovejas balan'
animal1='abeja'; animal2='oveja'
frase=frase.replace(animal1,'ABEJA')
frase=frase.replace(animal2,'OVEJA')
for voc in 'eiou':
    frase=frase.replace(voc,'A')
print(frase.upper())
Paso 1: replace('abeja','ABEJA') → "Las ABEJAs vuelan y las ovejas balan" (la 's' final queda minúscula porque replace solo coincide con 'abeja', no con 'abejas').
Paso 2: replace('oveja','OVEJA') → "Las ABEJAs vuelan y las OVEJAs balan".
Paso 3: el for recorre 'eiou'. Solo afecta minúsculas (las MAYÚSCULAS de ABEJAS/OVEJAS no se tocan):
  • 'e'→'A': 'vuelan' → 'vuAlan'.
  • 'i'→'A': no hay 'i' en la frase.
  • 'o'→'A': no hay 'o' minúscula.
  • 'u'→'A': 'vuAlan' → 'vAAlan'.
  Resultado tras el for: "Las ABEJAs vAAlan y las OVEJAs balan".
Paso 4: .upper() convierte todo a mayúsculas → "LAS ABEJAS VAALAN Y LAS OVEJAS BALAN" ✓
Ejemplo: split() y join() para editar palabras · Parcial 21/4/2025
def edita(t, palabras):
    t=t.lower()
    lista=t.split()
    for i in range(len(lista)):
        if lista[i] in palabras:
            lista[i]=lista[i].upper()
    return ' '.join(lista)

txt='argumentar caos en cualquier situación no es compromiso'
resalta=['compromiso','caos']
print(edita(txt, resalta))
1. t.lower() → minúsculas (ya está).
2. split() → lista de palabras.
3. Para cada palabra: si está en resalta, la pone en mayúsculas.
4. join() vuelve a armar la frase.
Resultado: argumentar CAOS en cualquier situación no es COMPROMISO
Ejemplo: bucle sobre string con count() · Parcial 21/4/2025
def fun(t):
    vocales='AEIOUÁÉÍÓÚÜ'
    repetidas=''
    for letra in t:
        if letra in vocales and t.count(letra)>0:
            if letra not in repetidas:
                repetidas+=letra
    return repetidas.lower()
txt='Estaba LA RANA cantando debajo del AGUA'
print(fun(txt))
La condición t.count(letra)>0 es siempre True si la letra está en t (y si pasó el primer in vocales). Entonces la función recorre todas las letras y agrega al resultado las vocales mayúsculas que aparecen por primera vez.
Vocales mayúsculas en el texto (en orden de aparición): E, A, U → devuelve 'eau'
↑ Volver al índice
7 Funciones · definición, parámetros y return

Estructura básica de una función

def nombre_funcion(parametro1, parametro2):
    # cuerpo de la función
    resultado = parametro1 + parametro2
    return resultado

Para llamar a la función y usar su resultado:

valor = nombre_funcion(3, 5)   # valor = 8
print(nombre_funcion(10, 2))   # imprime 12
Los 3 componentes clave
1. Parámetros: variables que recibe la función al ser llamada.
2. Cuerpo: las instrucciones que ejecuta.
3. return: el valor que devuelve. Sin return la función devuelve None.

Tipo de pregunta: "¿cuál función es adecuada?"

El parcial te muestra un programa que llama a una función con ciertos argumentos y una salida esperada. Tenés que encontrar la definición correcta. Estrategia:

  1. Mirá cómo se llama la función: producto(lista[i], factor[i]) → recibe 2 parámetros.
  2. Mirá la salida esperada y deducí qué operación hace: si da 3, 0, 6 con (1,3), (0,6), (3,2) → es multiplicación.
  3. Eliminá opciones con número de parámetros incorrecto.
  4. Verificá que el return devuelva lo correcto.
Ejemplo: función fun que devuelve un bool · Parcial 21/4/2025 Tema 1, Ejercicio 5
def fun(t):
    vocales='AEIOUÁÉÍÓÚÜ'
    t=t.upper()
    cont=0
    for letra in t:
        if letra in vocales:
            cont+=1
    return cont>6

txt='Una oruga NEGRA en un PAJAR'
print(fun(txt))
Tracing:
1. t = 'UNA ORUGA NEGRA EN UN PAJAR' (todo en mayúsculas).
2. Cuenta vocales (A, E, I, O, U y acentuadas): U, A, O, U, A, E, A, E, U, A, A → 11.
3. return 11 > 6 → True.
Salida: True (opción C). Patrón clave: la función cuenta y compara; el return ya devuelve un booleano sin if/else.
Ejemplo: elegir función edita correcta · Parcial 21/4/2025 Tema 4, Ejercicio 8

El programa debe mostrar: HASTA<ESP>LA<ESP>VISTA<ESP>BABY<ESP><ESP><ESP>

txt='hasta la vista baby!!!'
print(edita(txt,',- .!?'))
La opción correcta (B) es:
def edita(t, carEsp):
    lista=list(t)
    for i in range(len(lista)):
        if lista[i] in carEsp:
            lista[i]='<esp>'
    t=''.join(lista)
    return t.upper()
Estrategia para descartar las otras:
• Cantidad de parámetros: edita se llama con 2 argumentos. Las opciones con def edita(carEsp) o def edita(t) están mal.
• Orden de parámetros: si la opción dice def edita(carEsp, t) los argumentos se asignan al revés: pruebas mentalmente que list(t) daría error o resultado distinto.
• Return: el texto final está en MAYÚSCULAS, así que la función necesita .upper() en el return.
• Substitución vacía: una opción usa lista[i]='', que elimina los caracteres en vez de reemplazarlos por <esp>.
Trampas en las opciones de función
Las opciones incorrectas suelen tener:
• Número incorrecto de parámetros (0, 1 en lugar de 2).
• Usar variables no definidas dentro de la función (n2*n2 cuando debería ser n1*n2).
• return que devuelve la variable equivocada (devuelve n2 en lugar del resultado).
• Sin return (la función devuelve None).

Alcance de variables (scope)

Las variables definidas dentro de una función solo existen dentro de ella. Las variables definidas fuera (globales) pueden leerse dentro pero no modificarse sin global.

Ejemplo integrador: función + strings + listas

Patrón de función que devuelve lista filtrada
def solo_pares(numeros):
    resultado = []
    for n in numeros:
        if n % 2 == 0:
            resultado.append(n)
    return resultado

datos = [1, 4, 7, 8, 3, 6]
print(solo_pares(datos))  # [4, 8, 6]
Este patrón (crear lista vacía, recorrer con for, agregar con append, retornar) es el más frecuente en las funciones del parcial.
↑ Volver al índice