Acá encontrarás ejercicios para practicar programar usando funciones.
En los siguientes videos podrás ver una explicación del tema y también la resolución paso a paso de estos ejercicios:
- Funciones
- Ejemplos de funciones
- Errores comunes con funciones
- Ejercicios con funciones
- Ejercicio con varias funciones
- Pruebas (casos de prueba doctests, testing unitario)
La resolución de cada ejercicio se muestra al hacer click sobre la consigna.
Nota: estos enunciados y resoluciones fueron diseñados con el objetivo de ayudar a programadores principiantes a desarrollar habilidades algorítmicas y de razonamiento lógico. La finalidad principal no se enfoca en la sintaxis y herramientas concretas de Python 3, y la mayoría de los ejercicios podrían resolverse con cualquier lenguaje dentro del paradigma imperativo. Es por ese motivo que algunas resoluciones muestran un algoritmo genérico y no orientado específicamente a Python.
1
Solicitar al usuario que ingrese su dirección email. Imprimir un mensaje indicando si la dirección es válida o no, valiéndose de una función para decidirlo. Una dirección se considerará válida si contiene el símbolo "@".
Solución:
def validar(email):
caracterBuscado="@"
emailValido=False
for c in email:
if c==caracterBuscado:
return True
return False
direccion=input("Tu email: ")
if validar(direccion):
print("Dirección válida")
else:
print("Dirección inválida")
2
Solicitar números al usuario hasta que ingrese el cero. Por cada uno, mostrar la suma de sus dígitos (utilizando una función que realice dicha suma).
Solución:
def sumaDigitos(numero):
suma=0
while numero!=0:
digito=numero%10
suma=suma+digito
numero=numero//10
return suma
num=int(input("Número a procesar: "))
while num!=0:
print("Suma:",sumaDigitos(num))
num=int(input("Número a procesar: "))
3
Solicitar números al usuario hasta que ingrese el cero. Por cada uno, mostrar la suma de sus dígitos. Al finalizar, mostrar la sumatoria de todos los números ingresados y la suma de sus dígitos. Reutilizar la misma función realizada en el ejercicio 2.
Solución:
def sumaDigitos(numero):
suma=0
while numero!=0:
digito=numero%10
suma=suma+digito
numero=numero//10
return suma
sumatoria=0
num=int(input("Número a procesar: "))
while num!=0:
print("Suma:",sumaDigitos(num))
sumatoria=sumatoria+num
num=int(input("Número a procesar: "))
print("Sumatoria:", sumatoria)
print("Dígitos:", sumaDigitos(sumatoria))
4
Requerir al usuario que ingrese un número entero e informar si es primo o no, utilizando una función booleana que lo decida.
Solución:
def primo(num):
for i in range(2,num):
if num%i==0:
return False
return True
numero=int(input("Número: "))
if primo(numero):
print("Es primo")
else:
print("No es primo")
5
Solicitar al usuario un número entero y luego un dígito. Informar la cantidad de ocurrencias del dígito en el número, utilizando para ello una función que calcule la frecuencia.
Solución:
def frecuencia(numero,digito):
cantidad=0
while numero!=0:
ultDigito=numero%10
if ultDigito==digito:
cantidad+=1
numero=numero//10
return cantidad
num=int(input("Número: "))
un_digito=int(input("Dígito: "))
print("Frecuencia del dígito en el número:",frecuencia(num,un_digito))
6
Escribir un programa que pida números al usuario, motrar el factorial de cada uno y, al finalizar, la cantidad total de números leídos en total. Utilizar una o más funciones, según sea necesario.
Solución:
def factorial(numero):
f=1
if numero!=0:
for i in range(1,numero+1):
f=f*i
return f
cantidad=0
num=int(input("Número (-1 para cortar): "))
while num!=-1:
print("Factorial:", factorial(num))
cantidad+=1
num=int(input("Número (-1 para cortar): "))
print("Se leyeron",cantidad,"números")
7
Escribir un programa que pida números positivos al usuario. Mostrar el número cuya sumatoria de dígitos fue mayor y la cantidad de números cuya sumatoria de dígitos fue menor que 10. Utilizar una o más funciones, según sea necesario.
Solución:
def sumaDigitos(numero):
suma=0
while numero!=0:
digito=numero%10
suma=suma+digito
numero=numero//10
return suma
cantidad=0
mayor=-1
numero=int(input("Número positivo: "))
while numero>=0:
suma=sumaDigitos(numero)
if suma > mayor:
mayor=suma
n_mayorsuma=numero
if suma < 10:
cantidad+=1
numero=int(input("Número positivo: "))
print("Sumatoria de dígitos de",n_mayorsuma,":",mayor)
print("Cantidad con sumatoria menor a 10:",cantidad)
8
Solicitar al usuario el ingreso de números primos. La lectura finalizará cuando ingrese un número que no sea primo. Por cada número, mostrar la suma de sus dígitos. También solicitar al usuario un dígito e informar la cantidad de veces que aparece en el número (frecuencia). Al finalizar el programa, mostrar el factorial del mayor número ingresado.
Solución:
def primo(num):
for i in range(2,num):
if num%i==0:
return False
return True
def frecuencia(numero,digito):
cantidad=0
while numero!=0:
ultDigito=numero%10
if ultDigito==digito:
cantidad+=1
numero=numero//10
return cantidad
def factorial(numero):
f=1
if numero!=0:
for i in range(1,numero+1):
f=f*i
return f
def sumaDigitos(numero):
suma=0
while numero!=0:
digito=numero%10
suma=suma+digito
numero=numero//10
return suma
mayor=0
numero=int(input("Número primo: "))
while primo(numero):
print("Suma de los dígitos:",sumaDigitos(numero))
digito=int(input("Dígito: "))
print("El",digito,"aparece",frecuencia(numero,digito),"veces")
if numero > mayor:
mayor=numero
numero=int(input("Número primo: "))
print("Factorial de",mayor,":",factorial(mayor))
9
Sin ejecutar el siguiente programa, determinar cuál es la salida en pantalla si se ingresan los valores x=6, y=7:
def coordenadaZ(x,y):
x=x+10
y=y+15
return x+y
#programa principal
x=int(input("Coordenada eje x: "))
y=int(input("Coordenada eje y: "))
for i in range(3):
z=coordenadaZ(x,y)
x=x+1
y=y+1
print(x," . ",y)
def coordenadaZ(x,y):
x=x+10
y=y+15
return x+y
#programa principal
x=int(input("Coordenada eje x: "))
y=int(input("Coordenada eje y: "))
for i in range(3):
z=coordenadaZ(x,y)
x=x+1
y=y+1
print(x," . ",y)
Solución: 9 . 10
10
El siguiente programa debería imprimir el número 2 si se le ingresan como valores x=5, y=1 pero en su lugar imprime 5. ¿Qué hay que corregir?
def maximo(a,b):
if x>y:
return x
else:
return y
def minimo(a,b):
if x<y:
return x
else:
return y
#programa principal
x=int(input("Un número: "))
y=int(input("Otro número: "))
print(maximo(x-3, minimo(x+2, y-5)))
def maximo(a,b):
if x>y:
return x
else:
return y
def minimo(a,b):
if x<y:
return x
else:
return y
#programa principal
x=int(input("Un número: "))
y=int(input("Otro número: "))
print(maximo(x-3, minimo(x+2, y-5)))
Solución: Las funciones no utilizan sus parámetros a, b sino las variables globales x, y. Para corregir el error se deben utilizar los parámetros dentro del cuerpo de ambas funciones.
11
Escribir una función que, dado un número de DNI, retorne True si el número es válido y False si no lo es. Para que un número de DNI sea válido debe tener entre 7 y 8 dígitos.
Solución:
def validarDNI(dni):
cantidad=0
while dni!=0:
cantidad+=1
dni//=10
return cantidad==7 or cantidad==8
12
Escribir una función que, dado un string, retorne la longitud de la última palabra. Se considera que las palabras están separadas por uno o más espacios. También podría haber espacios al principio o al final del string pasado por parámetro.
Solución:
def lenUltimaPalabra(frase):
if len(frase)==0:
return 0
cantidad=0
for i in range(len(frase)):
if frase[i]!=' ':
cantidad+=1
else:
if i<len(frase)-1 and frase[i+1]!=' ':
cantidad=0
return cantidad
13
Escribir un programa que permita al usuario obtener un identificador para cada uno de los socios de un club. Para eso ingresará nombre completo y número de DNI de cada socio, indicando que finalizará el procesamiento mediante el ingreso de un nombre vacío.
Precondición: el formato del nombre de los socios será: nombre apellido. Podría ingresarse más de un nombre, en cuyo caso será: nombre1 nombre2 apellido. Si un socio tuviera más de un apellido, el usuario sólo ingresará uno.
Se debe validar que el número de DNI tenga 7 u 8 dígitos. En caso contrario, el programa debe dejar al usuario en un bucle hasta que ingrese un DNI correcto.
Por cada socio se debe imprimir su identificador único, el cual estará formado por: el primer nombre, la cantidad de letras del apellido y los primeros 3 dígitos de su DNI. Ejemplo:
Nombre: Alba María Linares
DNI: 25834910
Alba7258
Solución:
def lenUltimaPalabra(cadena):
longitud=len(cadena)
if longitud==0:
return 0
cantidad=0
for i in range(longitud):
if cadena[i]!=' ':
cantidad+=1
else:
if cadena[i]==' ' and i<(longitud-1) and cadena[i+1]!=' ':
cantidad=0
return cantidad
def DNIvalido(dni):
cantidad=0
while dni!=0:
cantidad+=1
dni//=10
return cantidad==7 or cantidad==8
def primerosTresDigitos(numero):
while numero >= 1000:
numero = numero // 10
return numero
def obtenerIdentificador(nombre, dni):
nombre=nombre.strip()
id=nombre[:nombre.find(" ")]
id=id+str(lenUltimaPalabra(nombre))
id=id+str(primerosTresDigitos(dni))
return id
#programa principal
nombre=input("Nombre del socio: ")
while nombre!="":
dni=int(input("DNI del socio: "))
while !(DNIvalido(dni)):
print("Número inválido.")
dni=int(input("DNI del socio: "))
print(obtenerIdentificador(nombre,dni))
nombre=input("Nombre del socio: ")
14
Escribir la función titulo(), la cual recibe un string y lo retorna convirtiendo la primera letra de cada palabra a mayúscula y las demás letras a minúscula, dejando inalterados los demás caracteres. Precondición: el separador de palabras es el espacio: " ". Agregar doctests con suficientes casos de prueba para validar que la función retorna el valor esperado ante distintos argumentos.
Solución:
def titulo(cadena):
'''
Recibe una cadena de caracteres y retorna una copia que tiene la
primera letra de cada palabra en mayúsculas y el resto de las letras
en minúsculas.
>>> titulo('esto es una frase')
'Esto Es Una Frase'
>>> titulo('ESTO ES UNA FRASE')
'Esto Es Una Frase'
>>> titulo('palabra')
'Palabra'
>>> titulo(' esto es una frase')
' Esto Es Una Frase'
>>> titulo('esto es una frase ')
'Esto Es Una Frase '
>>> titulo('esto es una frase')
'Esto Es Una Frase'
>>> titulo('')
''
>>> titulo(' ')
' '
>>> titulo('123')
'123'
>>> titulo('-1esto 2es 3una 4frase')
'-1Esto 2Es 3Una 4Frase'
>>> titulo('esto1 es2 una3 frase4---')
'Esto1 Es2 Una3 Frase4---'
'''
nueva=""
inicioPalabra=True #indica el inicio de una palabra
for caracter in cadena:
if not caracter.isalpha():
nueva=nueva+caracter
inicioPalabra=True
else:
if inicioPalabra:
nueva=nueva+caracter.upper()
inicioPalabra=False #ya no es el inicio de una palabra
else:
nueva=nueva+caracter.lower()
return nueva