Salta al contenido principal

Funciones en Python (2024)

Sitio: Facultad de Ingeniería U.Na.M.
Curso: Informática ET241/EM241/IC241/IN241/IM204
Libro: Funciones en Python (2024)
Imprimido por: Cuenta visitante
Día: domingo, 8 de junio de 2025, 14:44

1. Introducción

¿Qué es una función?

Una función en Python (y en cualquier otro lenguaje de programación) es un bloque de líneas de código o un conjunto de instrucciones cuya finalidad es realizar una tarea específica. Puede reutilizarse a voluntad para repetir dicha tarea.

Las funciones nos ayudan a que el código sea más fácil de leer y entender, porque evitan tener que repetir códigos dentro de un programa.

Anteriormente, usamos algunas funciones como, por ejemplo, max() para obtener el valor máximo de una lista. Si quisiéramos, en lugar de utilizar esta función, escribir todo el código para hallar el valor máximo, tendríamos que escribir todo lo siguiente: 

lista=[23,5,45,6,7,21,9]
primero = True # para identificar el 1er valor.
for i in lista:
    if primero:
        maximo = i
        primero = False # tomo un valor de la lista
        # como maximo, solo la primera vez.
    elif i > maximo:
        maximo = i
print(maximo)


En lugar de tener que escribir todas estas líneas, simplemente llamamos a la función max() cada vez que sea necesario. Es por eso que una de las grandes ventajas de usar funciones es que reduce el número total de líneas de código.

Una función tiene tres componentes importantes:

  1.     los parámetros o argumentos que recibe , que son los valores que recibe la función como entrada y los utiliza.
  2.     el código de la función, que son las operaciones o procesos que hace la función.
  3.     el resultado (o valor de retorno), que es el valor final o salida  que entrega o regresa la función.


Recordemos el modelo computacional visto al inicio:



Observación: Hay un Estándar que establece las notaciones de las funciones:

https://docs.python.org/3/glossary.html#term-annotation

Vamos a resumirlas:

1) Una función puede recibir cero o mas argumentos

2) Una función puede no retornar nada o retornar varios argumentos

3) Los nombres de las funciones se escriben en minúsculas y no llevan espacios.

4) Los Argumentos pasados (al llamar)  son reemplazado respectivamente por los parámetros (lo que reciben) de la función ( el mismo orden).

Aquí se pueden ver mas dealltes sobres las funciones : https://entrenamiento-python-basico.readthedocs.io/es/latest/leccion5/funciones.html


2. Funciones Predefinidas

Hay varias funciones que ya venimos utilizando desde el comienzo de la asignatura, como por ejemplo print()input(), int(), float()max(), min(), len(), etc. Todas estas son funciones que ya están incluidas en Python. Se suelen denominar Built-in Functions. (Ver documentación ACÁ)

No es necesario escribir el código, sino que solamente hay que llamarlas para poder utilizarlas.

Acá hay una lista en orden alfabético de estas funciones.

Built-in Functions


Ahora, vamos a ver cómo podemos crear nuestras propias funciones.

3. Creación de funciones

Antes de crear una función tenemos que hacernos las siguientes preguntas:

1) ¿Es necesario crear una función?
Crear una función es la mejor solución si:
  • Tenemos un fragmento de código que se usa en muchos sitios. En este caso, utilizar una función nos evitaría tener código repetido, y haría que modificarlo fuera más fácil, ya que bastaría con cambiar la función una vez.
  • Tenemos que escribir un código muy largo. Es mejor crear funciones que agrupen ciertos fragmentos de código en funcionalidades específicas, haciendo que el código resultante sea más fácil de leer.
  • No existe una función built-in que realice lo que necesitamos.
2) ¿Qué queremos que haga la función? ¿Cuál es el proceso?
Tenemos que definir claramente qué parte del problema o consigna tiene que ser resuelto por una función. 

3) ¿Qué valores (entradas) debe recibir la función para que realice lo que queremos?

4) ¿Qué tipo de resultados (salidas) ofrece la función? 
Tenemos que definir si la función solamente debe hacer alguna operación y mostrar el resultado, o si debe retornar algún valor para que sea utilizado en el resto del código.

¿Cómo crear una función en Python?

Cualquier función debe tener:

  • Un nombre que represente qué hace esa función.
  • Los argumentos de entrada: Los valores que la función debe recibir para poder operar correctamente.
  • El código a ejecutar (Proceso): Las operaciones o instrucciones que debe hacer.
  • Los parámetros de salida o valor de retorno: los resultados que la función debe mostrar o regresar.

Sintaxis

  • Para definir una función nueva en Python se utiliza la palabra reservada def seguida de un nombre y los argumentos de entrada entre paréntesis, y luego los dos puntos (:)
  • En la siguientes líneas (con la identación correspondiente), se escribe el conjunto de sentencias que debe realizar la función.
  • Finalmente, se utiliza la palabra clave return para devolver un valor si es necesario.


NOTA: LAS DECLARACIONES DE LAS FUNCIONES DEBEN ESTAR ANTES DEL CÓDIGO PRINCIPAL O MAIN SCRIPT!!!


4. Argumentos de entrada

Hay diferentes formas de pasarle argumentos a una función:

  • Teniendo funciones sin argumentos de entrada.
  • Pasando los argumentos por posición.
  • Pasando los argumentos por nombre.
  • Teniendo argumentos por defecto.




4.1. Sin argumentos

Funciones sin argumentos de entrada

Empecemos con un ejemplo de la función más sencilla de todas. Una función sin parámetros de entrada ni parámetros de salida.

Primeramente, declaramos o definimos la función:

def saludar(): #comienza la declacarión de la función
    print("Hola") # termina la función
    #No regresa nada!!

Después tenemos que llamar a la función por su nombre.

saludar() #con el nombre llamo a la función

Si ejecutamos, en el terminal se debería ver: Hola!



4.2. Un solo argumento

Funciones con un solo argumento de entrada

Vamos a complicar un poco las cosas pasando un argumento de entrada

En la declaración de la función, tenemos que indicar entre paréntesis que espera recibir un argumento. El nombre que pongamos entre los paréntesis será el nombre de la variable que le damos al argumento y con el que operaremos dentro de la función.

Por ejemplo, definimos la misma función anterior pero con un argumento de entrada.

def saludar(nombre): #comienza la declacarión de la función
    print("Hola",nombre) # termina la función
    #No regresa nada!!

Ahora cuando llamemos a la función, sí o sí debemos pasarle un argumento. Por ejemplo:

saludar("Daniel") #llamo a la función pasando un argumento fijo
saludar(input("Ingrese su nombre:"))#llamo a la función pasando un argumento ingresando.

Entonces, al ejecutar, veremos en el terminal: Hola  Daniel

Y en el segundo caso, mostrará lo que se ingrese por teclado.

Python permite pasar argumentos también de otras formas. A continuación las explicamos.


4.3. Por posición

Argumentos por posición

Los argumentos por posición o posicionales son la forma más básica e intuitiva de pasar parámetros. Si tenemos una función suma() que acepta dos parámetros, se puede llamar como se muestra a continuación:

def suma(a,b): #comienza la declaración de la función
    #esta función recibe 2 argumentos
    return (a+b)  # termina la función retorno la suma

def suma1(a,b): #comienza la declaración de la función
    #esta función recibe 2 argumentos
    print (a+b)  # termina la función no retorno NADA, solo muestro la suma
    
x=2
y=3
suma(x,y) # llamo a la función pasando 2 arguentos, NO veo el retorno!!
print(suma(x,y)) # llamo a la función pasando 2 arguentos, VEO el retorno!!
suma1(x,y) # llamo a la función pasando 2 arguentos, veo las suma que muestra suma1
suma(x) #esto tira ERROR!, suma espera 2 argumentos no uno
suma(x,y,5) #esto tira ERROR!, suma espera 2 argumentos no tres!!

Al tratarse de parámetros posicionales, se interpreta que el primer número es y el segundo b

El número de parámetros es fijo, por lo que si intentamos llamar a la función con solo uno, dará error. Por ejemplo:

suma(x) #esto tira ERROR!, suma espera 2 argumentos no uno
suma(x,y,5) #esto tira ERROR!, suma espera 2 argumentos no tres!!

Tampoco es posible usar más argumentos de los tiene la función definidos, ya que no sabría que hacer con ellos. 

suma(x,y,5) #esto tira ERROR!, suma espera 2 argumentos no tres!!


4.4. Por nombre

Argumentos por nombre

Otra forma de llamar a una función, es usando el nombre del argumento con = y su valor. El siguiente código hace lo mismo que el código anterior, con la diferencia de que los argumentos no son posicionales.

def suma(a,b,c=0): #comienza la declacarión de la función, c toma por efecto c=0
    #esta función recibe 2 argumentos
    print("a vale: ",a)
    print("b vale: ",b)
    return (a+b+c)  # termina la función retorno la suma

print(suma(a=3,b=2))#asigno los valores, no respeta la posicion del arg. si el nombre
print(suma(b=1,a=2))#asigno los valores, ver que conserva el valor, no importa el orden
print(suma(3,2,5)) # esta línea no tira error , c No toma el valor por defecto, ahora vale 5

Al indicar en la llamada a la función el nombre de la variable y el valor, el orden ya no importa.

Como es de esperar, si indicamos un argumento que no ha sido definido como parámetro de entrada, tendremos un error, si se declara o define con tres argumentos, NO puede recibir 4, tiraría error.




4.5. Por defecto

Argumentos por defecto

Tal vez queramos tener una función con algún parámetro opcional, que pueda ser usado o no dependiendo de diferentes circunstancias. Para ello, lo que podemos hacer es asignar un valor por defecto a la función.  En el siguiente caso c valdría cero salvo que se indique lo contrario.

def suma(a,b,c=0): #comienza la declacarión de la función, decalro c=0
    #esta función recibe 2 o 3 argumentos
    return (a+b+c)  # termina la función retorno la suma

print(suma(3,2,5)) # esta línea no tira erro , pero NO toma en cuenta el 5

Dado que el parámetro c tiene un valor por defecto, 5, la función puede ser llamada tomando c=5.

5. Variables Globales y Locales

Variables Globales en Python

En Python las variables declaradas fuera de una función se conocen como variables globales. Se puede acceder a estas variables tanto dentro como fuera de una función, ya que tienen un alcance global.

Por ejemplo:

def mostrar():#la función No recbie argumento.
    print(a) #a se definió en main script.
    
#main script o código principal
a=3 #a se define fuera de TODA función=> varaible Global!!
mostrar()#

La variable a en el código se declara fuera de la función. Sin embargo al llamar a la función mostrar(), se pudo acceder a a porque se declaró con un alcance global.

Otro ejemplo:

def agregar():#la función No recbie argumento.
    l.append(int(input("Ingrese un número entero:"))) #lse definió en main script.
def agregar1(x):#la función  recibe argumento.
    l.append(x) #l se definió en main script.
    
#main script o código principal
l=[1,2,3]# esta lista es global
agregar()
print(l)
agregar1(5)#paso un argumento para agregar a l
print(l)

Variables Locales en Python

Veamos qué pasa si hacemos lo contrario, si declaramos una variable dentro de una función y queremos acceder a ella fuera de la función.

def mostrar():#la función No recbie argumento.
    a=5
    print(a) #a se definió en main script.
    
#main script o código principal
print(a)# la variable a SOLO existe dentro de función mostrar.

En este caso, tenemos un NameError porque la variable a no está definida globalmente.

NameError: name 'a' is not defined

Las variables definidas dentro de las funciones se llaman variables locales. Su valor sólo se puede utilizar dentro de la función en la que se declaran.


 Tener en cuenta que no es buena idea llamar con el mismo nombre a variables locales y globales ya que se presta a confusión.

6. Pasaje por Valor

Pasaje de variables a funciones por valor

Veamos el siguiente ejemplo:


def duplicar(n):
    n=n*2 #duplico el valor de n, que es una copia de la n global.
    print("el id de n dentro de la función: ", id(n))
    print(n) #NO regreso NADA!
    #la n local vale 4!
#main script o código principal
n=2 #n global vale 2
duplicar(n)
print("el id de n fuera de la función: ", id(n))
print(n) #la n de main, global vale 2!!

La salida de este scritp será:

el id de n dentro de la función:  11753992
4
el id de n fuera de la función:  11753928
2

Vemos que los id son distintos => son distintas variables, esto concuerda
con lo que dijimos,la variable LOCAL es una copia.

Al "pasarle la variable x" como argumento, en realidad le estoy pasando una copia del valor que contiene esta variable. Por lo tanto, dentro de la función se comporta como una variable local y cualquier modificación que se le haga no tiene efecto sobre la variable x.

Nota: Vemos que NO es buena idea llamar a las variables globales y locales por el mismo nombre, puede llevar a confusión.

7. Pasaje por Referencia

Pasaje de Variables a funciones por Referencia

Veamos el siguiente ejemplo:

def agregar(l):#la función recibe la lista l como argumento.
    l.append(int(input("Ingrese un número entero:"))) #l se definió en main script.

#main script o código principal
l=[1,2,3]# esta lista es global
agregar()
print(l)

En el caso de las listas y diccionarios, al pasarlos como argumentos a las funciones, no se crea una copia de los mismos sino que se trabajan como variables globales y cualquier modificación que se les haga dentro de la función, afecta al contenido de la variable. 

Es decir que no se le está pasando los valores a la función, sino una referencia de su dirección en memoria, es por ello que se denomina pasaje por referencia.

Ejemplo con diccionario:

def agregar(d):
    print("el id de d es: ", id(d))
    d[3]="tres"

#main script o código principal
d={1:"uno", 2:"dos"}
print("el id de d es: ", id(d))
agregar(d)
print(d)

La salida de este scritp sería:

el id de d es:  126148792463296
el id de d es:  126148792463296
{1: 'uno', 2: 'dos', 3: 'tres'}

Podemos ver que dentro de la función y fuera de la función el id es el mismo,
por lo que el diccionario ES el mismo, esto es cierto por que se PASA POR REFERENCIA!.


7.1. Más información

Repasemos unos conceptos.

En Python todo es un objeto.


Cada Objeto se almacena en una Dirección que es única para ese objeto ( cada objeto tiene su "casa")

Para facilitar y no tener que recordar una dirección se usa un nombre ( ej: "La_Facultad" ) que para nosotros sería el nombre de la variable, pero en realidad es una referencia a un objeto ( 'Juan Manuel de Rosas 325")

Una declaración típica:

< identifier > = < expression>

Ver que hay un igual este igual NO es simplemente una asignación, implica la creación referencia a un Objeto.

x = 1 # declaro el objeto 1, y la referencia x, señala a objeto 1.

# una o varias sentencias.

x = x + 2 # no es un suma algebraica solamente aunque parece, es una sentencia de asignación => crea una referencia a un nuevo objeto

Esta asignación se lee de derecha a izquiera de la siguiente manera:

La referencia a x nueva, se actualiza para apuntar a una nuevo valor que resulta del valor apuntado anteriormente mas dos.
La dirección nueva de x y la anterior NO son la misma.

El espacio de la x anterior es reclamado por un "Recolector de Basura" que recupera las direcciones sin uso para usar mas tarde.

Veamos como sería de manera Gráfica:

 Figura 1

Es importante entender  que el igual, no es una simple asignación, si no la creación de un Nuevo objeto. 

Si hay un igual => es un nuevo objeto!!

Veamos otro ejemplo:

a=3
print("el id de a: ", id(a))
b=a # a y b son el mismo objeto!!
print("el id de b: ", id(b))# a y b tienen el MISMO id
a=a+2 #esta a ahora tiene otro id , es una variable NUEVA.
print("el id de a: ", id(a))# otro id!!!
print("el id de b: ", id(b))# b mantiene el id anterior , el que tenía a antes de la asiganación a=a+2

La salida de esto sería:

el id de a:  11753960
el id de b:  11753960
el id de a:  11754024
el id de b:  11753960

Con esto en mente es mas fácil entender los que sigue.

Pasaje por valor

Si usamos un parámetro pasado por valor, se creará una copia local de la variable, lo que implica que cualquier modificación sobre la misma no tendrá efecto sobre la original.
Veamos este caso:

def duplicar(n):
print("el id de n dentro de la función, antes del =: ", id(n))
n=n*2 #duplico el valor de n, que es una copia de la n global.
print("el id de n dentro de la función, luego del =: ", id(n))
return(n) # regreso n
#la n local vale 4!

#main script o código principal
n=2 #n global vale 2
print("el id de n fuera de la función: ", id(n))
print(duplicar(n)) # se muestra el retorno
print(n) #la n de main, SIGUE valiendo 2
La salida de este script sería:

el id de n fuera de la función:  11753928
el id de n dentro de la función, antes del =: 11753928
el id de n dentro de la función, luego del =: 11753992
4
2
Aquí se prestaría a confusión, ya que la n definida en la función deja de existir en la línea n=n*2, por que hay un igual.
Es decir se crea un objeto NUEVO, luego del n=n*2 , ese valor duplicado se muestra en main, que es lo que retorna la función duplicar, pero el valor de n de main NO CAMBIO .

Se podría dar otro nombre a la variable n dentro de la función y NO CAMBIARÍA NADA.

def duplicar(x):
    print("el id de x dentro de la función, antes del =: ", id(x))
    x=x*2 #duplico el valor de n, que es una copia de la n global.
    print("el id de x dentro de la función, luego del =: ", id(x))
    return(x) # regreso n
    #la n local vale 4!
    
#main script o código principal
n=2 #n global vale 2
print("el id de n fuera de la función: ", id(n))
print(duplicar(n)) # se muestra el retorno
print(n) #la n de main, SIGUE valiendo 2

La salida sería:

el id de n fuera de la función:  11753928
el id de x dentro de la función, antes del =:  11753928
el id de x dentro de la función, luego del =:  11753992
4
2
Esto se conoce como pasaje por valor.
Se deja al alumno en análisis del siguiente código:

¿Que saldría tendría y por que?

Pasaje por referencia

En Python al pasar una variable como argumento de una función estas se pasan por referencia o por valor.

Con una variable pasada como referencia, se actuará directamente sobre la variable pasada, por lo que las modificaciones afectarán a la variable original.

Vimos en la sección anterior el pasaje por Valor.

  Figura 4

En este scritp el valor de z no se duplica, por mas que se lo duplica en la función, esto no se refleja entre las líneas 11 a 13.

Por otro lado se aconseja NO  declarar las Variables como Globales, recordemos que así si se podían cambiar los valores.

Pero va a ser necesario que la función pueda realizar cambios.

 Así que ¿cual es la solución para que una función pueda alterar un valor y que el mismo sea permanente sin que la variable sea Global?

Respuesta : Pasaje por Referencia!!

En el paso por valor, que vimos en la sección anterior , lo que se pasa como argumento es el valor que contenía la variable, una copia no el valor original (parámetro), por eso las modificaciones hechas en las NO se reflejan fuera de la función, por que es una COPIA.

Si se relaciona con el concepto de Objetos vemos que al poner el = dentro de la función creo OTRO OBJETO. En la figura 4, dentro de la función en la línea 9 hay un igual..

esto hace que se cree un NUEVO OBJETO, pero se referencia a el valor z por 2.. y esta z dentro de la función no es lo mismo que la z fuera de la función, son objetos distintos que tienen igual nombre.. podríamos pensar que son dos alumnos que se llaman Juan y está en distintas aulas .. pero no son la misma persona.

En el paso por  referencia lo que se pasa como argumento es la referencia al objeto o nombre del objeto PERO NO SE PUEDE USAR EL = , POR QUE SE CREA OTRO OBJETO. 

Por eso debo pasar datos que pueda modificar sin usar el =.

Veamos con un ejemplo:

 Figura 5

  • Vemos que el valor de x0 NO se altera, dentro de la función vale 4 y fuera de la función SIEMPRE vale 1. Dentro de la función línea 23 hay un igual => Creo un nuevo objeto!
  • Vemos que el valor de y0, que se llama dentro de la función y1, SI CAMBIA, de hecho se agrega un valor 23 y se mantiene al finalizar la función. Dentro de la función línea 24 NO hay un igual => NO creo otro objeto, es el MISMO.
  • y0 es una LISTA,  x0 es un entero
  • x0 no se puede cambiar, para cambiar uso el = y esto crea otro objeto
  • y0 SI se puede cambiar, no uso el = , si uso un método append.

¿Por que uno  si y0  y otro no?

La respuesta es que las variables de tipo números enteros ( nombre de referencia de los objetos) son inmutables, no ha manera de hacer nada con ellos sin usar el =.

Es decir, una vez creados, su valor no puede ser modificado y si quiero modificar tengo que usar el =

¿Pero cuando hago a = 1 y luego a = 2, si se puede cambiar?

Respuesta:  Claro, pero desde la perspectiva del lenguaje, no estás cambiando el valor de a de 1 a 2 sino quitando la referencia a 1 y poniéndosela a 2. El igual hace eso.

En términos más simples, no «cambias» el valor de un objeto sino que le asignas una nueva referencia.

Objetos Python según su mutabilidad:

MutablesInmutables
dict
list
 bool
 bytes
 complex
 decimal
 int
 float
 str/unicode
 tuple
 range

Podemos ver aquí como Listas y Diccionarios se vuelven mas importantes.

Tradicionalmente:

    Los tipos simples se pasan por valor: Enteros, flotantes, cadenas, lógicos, etc.
    Los tipos compuestos se pasan por referencia: Listas, diccionarios.

En este punto parecería que solo pasando Objetos Mutables ( ej. Lista como y0 )  podemos cambiar un valor.

Bueno no es necesariamente hay una alternativa, se puede devolverlos modificados y reasignarlos, veamos las dos alternativas de modificar valores.

1) Pasando un objeto alterable ( Lista, Diccionario)

2) Pasando un objeto in-alterable pero usando en return para regresar una copia del nuevo objeto

3) Usando una variable Global ( NO USAR ESTE!!)

 Figura 2.

Pasar los argumentos por referencia es pasar tipos de dato mutables y cambiarlos sin usar el igual., y los inmutables por valor.

Vemos un caso en el que uso una lista, pero dentro de la función uso un =, por lo tanto se crea Otro objeto veamos un ejemplo:

 Figura 3

Cuando se pasan por Referencia SI se pueden cambiar si no uso el  , cuando se pasan por valor NO se pueden cambiar!


8. Valores de Retorno

Sentencia return

El uso de la sentencia return permite realizar dos cosas:

  • Salir de la función y transferir la ejecución de vuelta a donde se realizó la llamada.
  • Devolver uno o varios parámetros, resultado de la ejecución de la función.

Siempre se debe colocar al final de la declaración de la función.

Ejemplos:





8.1. Muestra del valor de retorno

Muestra del valor de retorno

Por lo general, siempre que se utiliza la sentencia return es porque queremos utilizar de alguna forma el valor de retorno. Una de las formas de utilizarlo es mostrarlo mediante print().

Veamos el siguiente ejemplo:


En este caso, en la línea 7, primeramente se llama a la función suma() pasándole los valores de x e y como argumentos. La función hace sus operaciones y retorna un valor. El valor que la función retorna se muestra con print.

En el siguiente enlace se puede ver cómo se comportan las variables locales y globales, y el valor de retorno en cada línea de ejecución: ENLACE A PYTHON TUTOR


8.2. Asignación del valor de retorno

Asignación del valor de retorno a una variable

También podemos asignar ese valor de retorno a una variable:


En este caso, en la línea 7 primeramente se llama a la función suma() pasándole los valores de x e y como argumentos. La función ejecuta sus operaciones y retorna un valor. El valor que se retorna se asigna a la variable resultado. Luego en la línea 8 lo mostramos con un print.

En el siguiente enlace se puede ver cómo se comportan las variables locales y globales, y el valor de retorno en cada línea de ejecución: ENLACE A PYTHON TUTOR


8.3. Utilizar el valor de retorno

Utilizar el valor de retorno 

También se puede utilizar el valor de retorno dentro de condiciones de estructuras if o while

Por ejemplo:


Solamente se debe tener en cuenta que cada vez que analice la condición se llamará a la función nuevamente.

Como ejemplo de esto, prueben el siguiente código:


8.4. Múltiples Valores de Retorno


Una función puede retornar más de un valor. Una de las formas es hacerlo mediante una lista, como se muestra en el siguiente ejemplo:



En este caso en la línea 11, asignamos el valor de retorno a la variable valores
En la línea 12, mostramos el tipo de dato que se asignó a la variable y vemos que es de tipo "list".

Otra forma de retornar múltiples valores es con la sentencia return y los valores separados por coma pero encerrados entre [] (corchetes) , tal como se muestra a continuación:



En este caso, vemos que el tipo de dato que retornó la función es una lista.


El siguiente ejemplo es a modo INFORMATIVO, ya que el tipo de datos retornado NO SE VE en esta materia.

Si solo utilizamos la sentencia return y los valores separados por coma, tal como se muestra a continuación: 



En este caso, vemos que el tipo de dato que retornó la función es "tuple". 

Las tuplas son una estructura de datos muy similares a las listas, con la diferencia que son inmutables. Es decir, sus valores no pueden ser modificados.




9. Funciones que llaman a funciones

Una función puede llamar a otras funciones. Por ejemplo:

En este caso, la función promedio() llama a la función suma() para poder realizar el cálculo del promedio.

En el siguiente enlace puede ver la ejecución línea a línea del código y también visualizar qué valores van tomando las variables: ENLACE A PYTHON TUTOR




10. Funciones que se llaman a sí mismas

De la misma forma que una función puede llamar a otra, una función también se puede llamar a sí misma. Esto se conoce como recursividad.

Por ejemplo:



En el siguiente enlace se puede ver cómo se ejecuta el código línea por línea y los valores que van tomando las variables: ENLACE A PYTHON TUTOR


11. Preguntas

Tenemos el siguiente código:

def suma3y3(): 
     print(f'el resultado es {3+3}') 


¿Qué obtenemos en pantalla cuando lo ejecutamos?

  1. Obtenemos 6 en la pantalla.
  2. No aparece nada en la pantalla.
  3. Aparece "el resultado es 6" en la pantalla.
  4. Obtenemos un error.

_____________________________________________________________________________________________________

¿Qué son las variables locales?

  1. Aquellas que están dentro del contexto de la función y podemos acceder a ellas desde cualquier bloque.
  2. Aquellas que están definidas fuera del contexto de las funciones y podemos acceder a ellas desde cualquier bloque.
  3. Aquellas que están dentro del contexto de la función y solo podemos acceder a ellas desde dentro de la función.
  4. Aquellas que están definidas fuera del contexto de las funciones y no podemos acceder a ellas desde cualquier bloque.

_______________________________________________________________________________________________________

¿Cuántos errores hay en el siguiente código?

variable1=10
def mifuncion(parametro) 
    variable2=20 
    print(f"La variable1 tiene valor {variable1}') 
     print(f'La variable2 tiene valor {variable2}') 
    print(f'El parámetro tiene valor {parametro}') 

mifuncion("entrada")
  1. uno
  2. dos
  3. tres
  4. 4 o mas
_________________________________________________________________________________________________________

En la definición de una función, los parámetros a pasarle se separan con:
  1. .
  2. ,
  3. ;
  4. -





12. Ejercicios Propuestos (pasado a libro de ejercicios propuestos)

1) Escribir un programa que pida al usuario un número entero positivo y luego llame a una función que muestre por pantalla todos los números impares desde 1 hasta ese número separados por comas.

________________________________________________________________________________________________________

2) Escribir un programa que permita cargar N datos en una lista. Luego se pide llamar a una función que calcule y muestre el promedio de todos los valores de la lista y la cantidad que superan ese valor promedio.

________________________________________________________________________________________________________

3) Escribir una función que lea 10 números enteros y luego retorne cuántos valores ingresados fueron múltiplos de 3 y cuántos de 5. Tener en cuenta que hay números que son múltiplos de 3 y de 5 a la vez.

________________________________________________________________________________________________________

4) Escribir una función que permita ingresar N valores en una lista y mostrar cual es el elemento menor de la misma y su posición.

________________________________________________________________________________________________________

5) Escribir un programa que solicite un número entero positivo, si se ingresa otra cosa, se deberá mostrar un mensaje indicando un error.

A partir del entero válido, llamar a una función que tenga como argumento ese entero válido y muestre por pantalla sus divisores.

NOTA: si el ingreso es erróneo más de 2 veces, se deberá dar una opción para finalizar el programa.

________________________________________________________________________________________________________

6) Escribir un programa que solicite un número entero mayor que 1, si se ingresa otra cosa, se deberá mostrar un mensaje indicando un error.

A partir del entero válido, llamar a una función que tenga como argumento ese entero válido y, retorne True o False si es o no primo (número natural mayor que 1 que tiene únicamente dos divisores distintos: él mismo y el 1).

NOTA: si el ingreso es erróneo más de 2 veces, se deberá dar una opción para finalizar el programa.

________________________________________________________________________________________________________

7) Escribir un programa que solicite un número entero positivo, si se ingresa otra cosa (letras por ejemplo), no realizar la operación normal del programa.

Luego llamar a una función que tenga como argumento ese entero válido y muestre por pantalla la tabla de multiplicar del mismo, del 1 al 10 como en la escuela.

NOTA: si el ingreso es erróneo, decidir cómo proceder con el programa.

________________________________________________________________________________________________________
8) Escribir una función que permita validar/catalogar una frase ingresada como posible contraseña. De acuerdo al análisis, se devolverá el nivel de seguridad correspondiente.

La función recibe como argumento la contraseña y retorna el nivel de seguridad.

Se considerarán las siguientes pautas:

  • Longitud menor a 6: No válido como clave. Seguridad 0
  • Al menos un carácter en minúscula. Seguridad +1
  • Al menos un carácter en mayúscula. Seguridad +1
  • Al menos un carácter numérico. Seguridad +1
  • Al menos un carácter símbolo. Seguridad +1
  • Longitud mayor a 10. Seguridad +1

Mostrar al finalizar, la clave ingresada seguida del nivel de seguridad (Seguridad 5 es el máximo, se cumplen todos los requisitos).

________________________________________________________________________________________________________
9)  Escribir un programa que solicite un número entero para analizarlo, si se ingresa otra cosa, se deberá mostrar un mensaje indicando un error.

A partir del entero válido, llamar a una función que tenga como argumento ese entero válido y, muestre lo siguiente:

  • Si es par, impar (decidir el caso del 0)
  • Positivo, negativo (decidir el caso del 0)
  • Su factorial, si es posible
  • Si es primo
  • Sus divisores, si no es primo
  • Cantidad de dígitos
________________________________________________________________________________________________________
10)  Realizar una función principal que permita determinar el cómputo y presupuesto de pintura para un edificio:

Se debe permitir que el usuario ingrese por teclado (de a una por vez) las superficies de paredes a pintar. Para el cálculo de consumo de pintura asumir que se utilizan 0.3 litros de pintura por metro cuadrado de pared (0.3 litros/m²). La pintura se adquiere en tachos de 20 litros, con un costo de $6300 cada tacho. La pinturería además ofrece un descuento del 10% al costo total a partir del quinto tacho (por ejemplo, 1 tacho $6300; 5 tachos = 5*$6300=$31500 - 10% = $28350).

En la función principal se debe mostrar un Menú con las siguientes opciones:

    1- Cargar paredes (se deben cargar todas las paredes de una vez)

    2- Mostrar resultados

    f- Finalizar programa

   

Cada punto del menú debe realizarse utilizando otras funciones que realicen lo siguiente:

Si el usuario elige 1 se debe llamar a una función que permita cargar el número de paredes a computar, para luego cargarlas de a una por vez. Se deberán verificar que el dato del número de paredes sea entero y que los datos ingresados de  superficies sean números reales.

 

Si el usuario elige 2 se deberá llamar a una función que permita mostrar por pantalla:

    * Superficie total

    * Cantidad de pintura a utilizar

    * Precio final (mostrar ambos precios, con y sin descuento)

 

Solamente finalizará la función principal al ingresar la letra f.

   

OBSERVACION: Para poder obtener el número de tachos a comprar se debe utilizar la función round(), para conocer cómo funciona: https://www.programiz.com/python-programming/methods/built-in/round


________________________________________________________________________________________________________
11) 

Un aserradero realiza pedidos de cortes de madera, para lo cual, necesita un programa para determinar la cantidad de árboles que se utilizaran.

Primeramente, cargar en un diccionario los 5 tipos de cortes que el aserradero ofrece, con la información de las medidas de los cortes.

Seguidamente, pedir al usuario que ingrese por teclado la cantidad de cada corte que se solicitan en el pedido.

Finalmente, llamar a una función que permita calcular el área total de los cortes solicitados y con esta determinar la cantidad de árboles a talar.

Deberá mostrar por pantalla:

    * Número total de cortes vendidos (todos los tipos)

    * Numero de Arboles a talar

Cortes:


OBSERVACIONES:

    * Asumir que todos los arboles poseen las mismas dimensiones, siendo 20 cm su radio (tomar PI=3,1415)

    * Las medidas de los cortes están en pulgadas, tomar 1 pulgada = 2,54cm

    * Para obtener el número "redondo" de árboles a talar, utilizar la función round(), para saber cómo funciona   https://www.programiz.com/python-programming/methods/built-in/round


________________________________________________________________________________________________________
12) Realizar un programa que permita hacer distintos cálculos básicos, de la misma manera que una calculadora.

Presentar un menú como el siguiente:

    1- Sumar dos números

    2- Restar dos números

    3- Multiplicar dos números

    4- Dividir dos números

    5- Salir

   

Tanto la opción elegida como el par de números a computar deben ser introducidos por teclado.

Luego para cada opción deberá llamar a una función que reciba como argumentos los dos números y retorne el cálculo elegido.

Observaciones: Tener en cuenta que no existe la división por cero (x/0 no existe), si el usuario llegara a ingresar cero para el divisor, se deberá mostrar por pantalla el mensaje "Error, denominador incorrecto" y se deberá pedir el reingreso de dicho valor.


________________________________________________________________________________________________________
13)  Una empresa de transporte de paquetes realiza 10 entregas por día. Cada entrega tiene un costo basado en la distancia de la entrega y el peso del paquete (el costo del envío es el promedio del costo por peso y el costo por distancia).

Realizar un programa que permita almacenar en un diccionario los 10 pares de valores (peso, distancia) y con estos determinar el costo por paquete y el costo diario de la empresa, para esto, basarse en la tabla Nro 1.

La ganancia de la empresa también depende de los envíos, basándose en la tabla Nro 2 para determinar la ganancia diaria de la empresa (la ganancia del envío es la suma de la ganancia por peso y la ganancia por distancia)


Observaciones:

    * Los pesos se deben cargar en kilogramos y las distancias en kilómetros


________________________________________________________________________________________________________
14) Se necesitan cargar datos correspondientes a las ventas realizadas por los vendedores de una farmacia. Los datos necesarios son las ventas correspondientes a los meses del año de cada uno.

Necesitaremos registrar las ventas de esos meses para cada vendedor.

Ejemplo. Enero = 12430, febrero = 23500, marzo = 34550, ...

Las ventas corresponden a valores enteros.

Sugerencia: Utilizar de forma combinada listas, diccionarios y tuplas.

[{'Enero':12430,'Febrero':23500,'Febrero':34550,...},...]

Una vez cargados los datos de las ventas se necesita:

- Ingresar un mes (controlar que sea un valor de mes válido) y llamar a una función que calcule y muestre el promedio de venta para ese mes.

- llamar a una función que calcule y muestre cuantos vendedores lograron una venta promedio mayor a $15000.

- llamar a una función que calcule y muestre cuál fue el mes que más vendió cada vendedor.

- llamar a una función que calcule y muestre cuántos vendedores no registraron ventas en un mes determinado.

________________________________________________________________________________________________________
15) En cierta industria local de procesamiento de papel, se tienen 16 máquinas cortadoras que trabajan con diferentes materiales: material compuesto (papel con capas de film plástico) y papel común. Estas máquinas están divididas por marcas (fabricantes de estas) y cada de estas procesa un tipo de material. La distribución de los equipos es la siguiente:

-8 son de marca Profawa, que trabajan con material compuesto.

-3 son de marca Windmoeller, que usan material común.

-5 son de marca Novaprag y pueden trabajar con material compuesto y común.

Cada equipo procesa como máximo 3000 metros del material que le corresponde durante 8h (1 turno = 8h). La empresa trabaja 3 turnos diarios y por 6 días semanales

Escribir un programa que:

-Cree un diccionario donde se almacene el tipo de máquina y el material que es capaz de procesar.

-Luego llame a una función que permita el ingreso (por parte del supervisor del sector) de cuántos metros enteros logró procesar durante la semana cada máquina (DISCRIMINANDO TIPO DE MÁQUINA Y MATERIAL TRABAJADO). Validar que los datos sean enteros por medio del bloque Try/Except, en caso que el ingreso sea erróneo se deberá pedir reingreso hasta que se ingrese correctamente el campo. 

Una vez cargados estos datos, la función deberá mostrar en pantalla:

-Cantidad de metros de material que se procesó durante la semana (sumando ambos materiales de todas las máquinas).

-Cantidad de metros procesados por cada máquina.

-Promedio de metros procesador por día en los equipos Windmoeller.


________________________________________________________________________________________________________
16)  Se tiene que almacenar el Stock de repuestos de una empresa, los valores a almacenar serán: nombre del repuesto y valores máximo, mínimo y actual del Stock.

El valor máximo y mínimo son parámetros que permiten determinar cuándo debo comprar ese repuesto (si llegué o estoy por debajo del mínimo) y el máximo para saber que tengo stock suficiente.

Definir un diccionario con 3 nombres de claves, para todas las claves (repuestos) con los valores de cada ítem en cero (máx., min, stock)

Luego llamar a una función que permita realizar una carga inicial.

A continuación se presenta un menú permite:

1) Seleccionar y modificar el stock actual (no puede ser negativo)

2) Dar de baja un ítem

3) Dar de alta un ítem (no puede ser negativos los valores de stock)

4) Mostrar quien tiene stock crítico (por debajo del mínimo)

5) Listar los ítems

S o s) Salir.

Para cada ítem del menú llamar a una función que realice lo solicitado.


________________________________________________________________________________________________________
17) Se desea hacer un programa que permita registrar el pesaje de los camiones que ingresan a una planta de Té, para descargar el Té cosechado.

Se propone utilizar un Diccionario que tenga como claves las patentes de los camiones y para cada clave una lista con: Peso al ingresar, Peso al salir, y una variable booleana True/False que indique si el Camión se encuentra adentro del establecimiento o fuera del mismo.

Ver que el peso NO puede ser negativo.

Ver que el peso al Salir DEBE ser menor que al ingresar

Solo se puede cargar el peso al salir si la variable booleana está en el valor adecuado.(que indique que estaba adentro del Establecimiento)

Estas consideraciones mencionadas sirven de control.

Se deberá crear un menú como el siguiente.

1) Ingresar Patente y Peso del Camión al ingresar al Establecimiento

2) Ingresar Peso del Camión al egreso del Establecimiento

3) Lista el Total de Té ingresado.

4) Mostrar la cantidad de camiones.

5) Listar las patentes de los camiones

S o s) Salir.

Para cada ítem del menú llamar a una función que realice lo solicitado.

________________________________________________________________________________________________________
18) Escribir un programa que permita la carga de datos de socios de un club en un diccionario. El diccionario contendrá como clave el número de socio y los demás datos (nombre, DNI, email) en una lista.

La carga se iniciará al correr el programa, cuando cargue los datos, mostrará el diccionario hasta el momento y le preguntará al usuario si desea seguir cargando datos (S/N). El programa finalizará cuando el usuario responda N.

Por cada socio el programa deberá pedir que el usuario ingrese N° de Socio, lo validará con una función y si es válido solicitará el resto de los datos: Apellido, DNI y email.

Utilizará una función para validar DNI y otra para validar email. Si los valores no son válidos pedirá el reingreso del dato incorrecto.

Función para validar N° de Socio: deberá retornar True si es positivo el número ingresado y no está cargado ya en el diccionario.

Sino retornará False.

Función para validar DNI deberá retornar True si es positivo de 7 u 8 dígitos el número ingresado. Sino retornará False.

Función para validar email deberá retornar True si es una cadena de caracteres que contiene el símbolo @. Sino retornará False.

________________________________________________________________________________________________________
19) Un prestamista, quiere llevar un registro de los deudores y de las cuotas de cada uno. Realizar un programa que muestre el siguiente MENU:

1- Cargar Deudor (DNI y Plata prestada)
2- Pagar.
3-Mostrar el total de plata prestada
S o S para Finalizar o Salir del Programa

El programa deberá realizar distintas operaciones según la opción ingresada:

Si ingresa 1:

Deberá cargar en un diccionario el DNI del deudor (clave) asociado al valor de la deuda o préstamo (valor) y lo que va pagando
Tener en cuenta que el DNI puede ser un string y que la deuda es un valor Real positivo. Si el valor de la deuda no es válido , se debe mostrar un mensaje que diga "INGRESO INCORRECTO" y volver pedir ingreso del valor solamente.


Si ingresa 2:

Deberá ingresar un numero de DNI. Si el DNI NO ESTA CARGADO mostrar un mensaje por pantalla que diga "Persona no cargada en el sistema". Si la persona está cargada pedirá ingresar el monto a pagar que no debe ser negativo y no puede ser superior al monto prestado, se debe validar y pedir reingreso en caso de que no cumpla las condiciones. Si ya había efectuado algún pago.. debería acumular este nuevo monto que está pagando. Ejemplo.si ya había pagado 1000 y ahora cargo un pago de 500, debería guardarse en la lista 1500$.

Si ingresa 3:

Deberá mostrar el total de dinero prestado a todos las personas y restar los pagos que efectuaron las personas.

Si ingresa S ó s:

Finalizar el programa con el mensaje "Finalizando..."


Nota: Se recomienda usar un Diccionario que tenga como clave el DNI y como valores una lista con dos valores, el monto prestado y el dinero pagado. Ejemplo:

Clientes={123123:[1200,0], 465876:[1205,289]}

Se debe implementar cada punto del menú con una función y el menú también con una función

________________________________________________________________________________________________________
20)  Una empresa constructora necesita un programa capaz de generar el computo de las mamposterías a realizar en las distintas obras que posee.


Para ello se necesita confeccionar un programa con el siguiente menu:
    1- Cargar obra nueva
    2- Cargar rendimientos por m²
    3- Determinar computo
    F- Salir

Crear previamente una lista vacia llamada "obras", un diccionario vacio llamado "rendimientos" y un diccionario vacio llamado "computo"

Hecho esto, realizar lo siguiente:
Si el usuario ingresa 1: ir cargando en "obras" los metros cuadrados de mamposteria a realizar. La carga finaliza cuando el usuario carga un area=0.

Si el usuario ingresa 2: pedir el rendimiento por metro cuadrado de ARENA, CEMENTO y LADRILLOS. ALmacenar en "rendimientos" como claves los materiales y como valores los
    rendimientos ingresados por teclado.

Si el usuario ingresa 3: determinar la cantidad necesaria de cada material en funcion de los metros cuadrados cargados en "obras". ALmacenar en "computo" como claves los materiales y
    como valores, los obtenidos de cada material, necesarios segun lo calculado. Mostrar por pantalla los consumos de materiales

Si el usuario ingresa F: finalizar el programa

ACLARACIONES:

  • Es necesario ir cargando por pasos: Para poder realizar el paso 3, se debe haber realizado los pasos 1 y 2
  • Es necesario validar los ingresos... si ingresa un valor incorrecto pedir reingresos hasta que se ingrese un valor correcto
  • Considerar el ingreso de F o f para finalizar
  • Realizar el MENU y los puntos 1, 2 y 3 con FUNCIONES.
  • RENDIMIENTOS: 1 m² de mamposteria consume:

             - ARENA -> 0.115 m³ de arena para cada m² de mamposteria
             - CEMENTO -> 15.2 kg de cemento para cada m² de mamposteria
             - LADRILLOS -> 118 ladrillos por cada m² de mamposteria


________________________________________________________________________________________________________
21) 

En una fábrica se registran manualmente ciertos parámetros del entorno de trabajo.
Crear un programa que permita seleccionar desde un menú el parámetro a registrar. Cada parámetro tiene un determinado rango válido, por lo tanto no se deben almacenar ni procesar datos fuera de estos.

MENÚ
1. Ingreso de Temperatura
2. Ingreso de Humedad
3. Ingreso de Presión
4. Ingreso de Operarios (cantidad)
5. Medias
+. Salir


En 1 el rango es de 0 a 60 °C.
En 2 el rango es de 10 a 100%.
En 3 el rango es de 0.8 a 1.2 atm.
En 4 el rango es de 1 a 20.
En 5 se muestra el promedio de cada parámetro, siempre que sea posible.
Con + se sale, otra opción en el menú notifica un error.

Guardar cada dato ingresado en una lista referida a dicho parámetro.

________________________________________________________________________________________________________
22) En una planta potabilizadora de agua se necesita llevar un registro de las dosis de cloro suministradas por empleados en sus respectivos turnos.
Para ello se harán los registros pertinentes en un diccionario que llevará como clave el nombre del empleado.
Los valores del diccionario corresponderán a las distintas dosis de cloro suministradas al agua por cada empleado.
El empleado registrará la cantidad de cloro cada vez que agrege el producto al agua durante su turno (podrá tener varios registros en su turno).
Si no existe registro en el diccionario para un empleado, se creará. En caso de que exista registro para el empleado, se agregará a lo existente.
Los valores serán positivos o cero. Si el empleado no agregó cloro, deberá generar un registro en cero.
Cada empleado podrá tener diferentes cantidades de dosis suministradas.
Menú
1.Registrar dosis
2.Lista de empleados que poseen registros
3.Mostrar el número promedio de dosis suministradas por empleado (número de dosis)
4.Mostrar la cantidad promedio de cloro suministradas por empleado (cantidad de cloro)
9.Sale

Para cada una de las opciones del menú de deberá llamar a la función con el nombre indicado a continuación:
1.carga
2.empleados
3.dosis
4.cloro

El punto 1 deberá solicitar el nombre del empleado y luego registrar la cantidad de cloro dosificada.
El punto 2 mostrará la lista de nombres de empleados que hasta el momento registró dosis
El punto 3 mostrará la cantidad promedio de dosis suministradas por cada empleado
El punto 4 mostrará la cantidad promedio de cloro suministradas por cada empleado
Si no se ha ingresado ningún registro, no se podrá llamar a los puntos 2,3 y 4.
________________________________________________________________________________________________________
23) Se desea gestionar las cuentas de los clientes de un Banco.

Para ello se solicita un programa que deberá crear un diccionario con el número de cliente, (clave) y el Apellido y saldo del mismo.

El programa deberá presentar el siguiente menú:

  1. Cargar cliente
  2. Operación
  3. Registro de operaciones

S-s. Salir

Si elige el punto 1, deberá ingresar por teclado el número de cliente (validar) si existe, deberá mostrar los datos del  mismo. Si no existe se preguntará si se desea agregar. Si la repuesta es si, agregar al diccionario los datos con saldo 0.

Si elige el punto 2 deberá solicitar por teclado un numero de cliente (si existe) y un código de operación. Si es “D” (deposito) permitirá ingresar un valor que es el monto a depositar. Si el código “E” (extracción) permitirá descontar del saldo ese importe. Si se ingresa un nro de cliente no valido mostrar el cartel correspondiente.

Si elige el punto 3 deberá mostrar la cantidad de operaciones D y E que se hicieron y el monto total de las mismas.

El programa finaliza cuando elige s o S. 

Cada uno de los puntos 1,2 y 3 deberá hacerlo con funciones.


________________________________________________________________________________________________________
24)  Generar un código que permita cargar y editar un diccionario con los nombres de los 11 residentes de una vecindad (las claves estarán precargadas).

Los inquilinos estarán precargados, pero podrá editarse uno o todos los nombres de estos. Una vez editado lo solicitado, se mostrará la lista de inquilinos y se consultará si
se quiere seguir editando o si se vuelve al menú
A cada clave le corresponderán 3 servicios: agua, luz e internet. Los 11 inquilinos se distribuyen equitativamente los costos de luz, agua e internet por persona.

Diseñar un código que presente el siguiente menu:

1-Editar lista de inquilinos
2-Ingresar servicios
3-Mostrar montos de cada inquilino
s-Salir


________________________________________________________________________________________________________
25) Se necesita un programa para criptografía básica, debe presentar un menú sencillo:

MENÚ
1. Encriptar
2. Desencriptar
S. Salir

En 1 se pide el ingreso de la frase alfabética a encriptar y luego se muestra el resultado.
En 2 se pide el ingreso de la frase encriptada y luego se muestra la cadena desencriptada.
En S se finaliza el programa. No se deben aceptar otros caracteres en el menú.

Programar una función que recibe 2 argumentos: la cadena a procesar, y un booleano. Si el booleano es True, se encripta; si es False, se desencripta.
El proceso de encriptado consiste en los siguientes reemplazos:

O  ->  0
L  ->  1

Z  ->  2
E  ->  3
A  ->  4
S  ->  5
G  ->  6
T  ->  7
B  ->  8
P  ->  9

El desencriptado corresponde a la operación inversa.

Cómo estándar se encriptan sólo frases alfabéticas en mayúsculas, por lo tanto, si se ingresan letras en minúscula, antes del encriptado las mismas deberán convertirse a mayúsculas. Para ello, programar una función que recibe la cadena fuera del estándar y devuelve la conversión correspondiente.


________________________________________________________________________________________________________
26) Cadena de palabras

Escribir una función que reciba como parámetro una cadena de palabras separadas por espacios y devuelva, como resultado, cuántas palabras de más de cinco letras tiene la cadena dada.

________________________________________________________________________________________________________
27) Procesamiento de telegramas. 

Un oficial de correos decide optimizar el trabajo de su oficina cortando todas las palabras de más de cinco letras a sólo cinco letras (e indicando que una palabra fue cortada con el agregado de una arroba). Además elimina todos los espacios en blanco de más.

Por ejemplo, al texto " Llego mañana alrededor del mediodía " se transcribe como "Llego mañan@ alred@ del medio@".

Por otro lado cobra un valor para las palabras cortas y otro valor para las palabras largas (que deben ser cortadas).

  1. Escribir una función que reciba un texto, la longitud máxima de las palabras, el costo de cada palabra corta, el costo de cada palabra larga, y devuelva como resultado el texto del telegrama y el costo del mismo.
  2. Los puntos se reemplazan por la palabra especial "STOP", y el punto final (que puede faltar en el texto original) se indica como "STOPSTOP".

Al texto:

" Llego mañana alrededor del mediodía. Voy a almorzar "

Se lo transcribe como:

"Llego mañan@ alred@ del medio@ STOP Voy a almor@ STOPSTOP".

Extender la función anterior para agregar el tratamiento de los puntos.


________________________________________________________________________________________________________
28) Vectores
a. Escribir una función que reciba dos vectores y devuelva su producto escalar.
b. Escribir una función que reciba dos vectores y devuelva si son o no ortogonales.
c. Escribir una función que reciba dos vectores y devuelva si son paralelos o no.
d. Escribir una función que reciba un vector y devuelva su norma.

________________________________________________________________________________________________________
29) Dada una lista de números enteros, escribir una función que:
  1. Devuelva una lista con todos los que sean primos. Esta función debe invocar a otra función que reciba cada número y retorne True o False para indicar si es primo o no.
  2. Devuelva la sumatoria y el promedio de los valores.
  3. Devuelva una lista con el factorial de cada uno de esos números.
________________________________________________________________________________________________________
30) Matrices.
  1. Escribir una función que reciba dos matrices y devuelva la suma.
  2. Escribir una función que reciba dos matrices y devuelva el producto.
  3. Escribir una función que opere sobre una matriz y mediante eliminación gaussiana devuelva una matriz triangular superior.
  4. Escribir una función que indique si un grupo de vectores, recibidos mediante una lista, son linealmente independientes o no.
________________________________________________________________________________________________________








13. Ejercicios Resueltos

En muchos de los ejercicios resueltos, se muestra el código sin Funciones, la idea es que el alumno interprete y luego pueda plantear una solución CON funciones.

14. Ejercicio tipo final



14.1. Ordenar una lista. Método Burbuja

Cargar por teclado una lista de números reales, luego ordenar  de menor a a mayor comparando UNO contra TODOS utilizando una función (esto se conoce como método de la burbuja).

Googlear en internet buscar información sobre el método.

Una propuesta de solución sería.



14.2. Ordenar Listas. Varios Métodos

Este método ordena la lista en su lugar, utilizando solo "comparando entre elementos".

No se suprimen las excepciones: si falla alguna operación de comparación, fallará toda la operación de clasificación (y la lista probablemente quedará en un estado parcialmente modificado).

sort () acepta dos argumentos: key y reverse.

El valor posible para reverse es True.

Para key hay varias alternativas, veremos algunas mas adelante.

Veremos como usar métodos para ordenar listas. El método sort está documentado en:

https://docs.python.org/3.7/library/stdtypes.html?highlight=sort#list.sort

En la documentación sobre el uso para ordenar está en : https://docs.python.org/3/howto/sorting.html , podemos ver que existen dos métodos que permiten ordenar listas. Ellos son.

  1. sort ( cambia el orden de la lista  original)
  2. sorted (regresa otra lista, sin modificar la original)

Consigna:

Cargar por teclado una lista de números reales, luego ordenar  de  mayor a menor utilizando el método sort.

Una propuesta de solución sería.



14.3. Carga de Matrices

Cargar una una matriz con números reales definiendo las dimensiones.

Luego de cargada la matriz, mostrar los valores de la misma de manera estética ( una fila por línea).

Este ejercicio demuestra que la forma de visualizar una matriz no es lo mismo que una lista, es por eso que requiere de crear una lista para cada fila.

Recordemos que el método append, inserta un elemento al final de una lista. Una propuesta de solución sería.

14.4. Diccionario de Pacientes

"""
ESCRIBIR UN CODIGO QUE PERMITA:

MOSTRAR UN MENU CON LAS SIGUIENTES OPCIONES:
    1-CARGA DE DATOS DE PACIENTES
    2-MOSTRAR DATOS DE PACIENTE
    F-FINALIZAR EL PROGRAMA
    
PARA MOSTRAR EL MENU SE UTILIZARA UNA FUNCION LLAMADA mostrar_menu.

SI SE INGRESA 1 SE DEBERA LLAMAR A LA FUNCION carga, QUE CARGARA
UN DICCIONARIO QUE TENGA COMO CLAVES NUMEROS DE DNI, Y COMO VALORES
LISTAS QUE A SU VEZ CONTENGAN LA EDAD DEL PACIENTE Y SU ALTURA.

SI SE INGRESA 2 SE DEBERA INGRESAR POR TECLADO EL DNI DE UN
PACIENTE Y PASARSELO COMO ARGUMENTO A LA FUNCION
mostrar_paciente, BUSCARA EL DNI DENTRO DEL DICCIONARIO Y SI
HAY COINCIDENCIA RETORNARA LOS DATOS DEL PACIENTE PARA QUE
SEAN MOSTRADOS POR PANTALLA. SI NO HAY COINCIDENCIA SE DEBERA
MOSTRAR EL MENSAJE "PACIENTE INEXISTENTE".

SI SE INGRESA F O f SE DEBERA FINALIZAR EL PROGRAMA.

Una propuesta de solución sería.


14.5. Lista de Pares e Impares

CONSIGNA

Realizar un programa que permita:

a) Llamar a una función que muestre un menú como el siguiente y retorne solo opciones 1, 2, 3 o F

1.- Cargar listas

2.- Buscar valor en la lista

F.- Finalizar

c) Si elige 1.  debe llamar a una función que debe ir ingresando valores hasta que ingrese el cero. Por cada valor que ingresa lo debe cargar a la lista pares o impares según corresponda.  Al final mostrar ambas listas.

d) Si elige 2. llamar a una función que pida que ingrese un número y la función lo busque en la lista que corresponda.  Si es par debe buscarlo en la lista pares o si es impar buscarlo en la lista impares.  Mostrar si se encuentra o no y si estuviera, en qué posición de la lista.

f) El programa solo termina con F para finalizar.

Una propuesta de solución sería.


14.6. Manejo de Matrices

A continuación se presenta la consigna y la solución desarrollada por los alumnos en clase. Para cada función se presentaron códigos de lo más variado. No existió un criterio para definir el código de quién se subía al aula. En parte, sirve para ver la variedad de formas de pensar que existen.

"""
CONSIGNA:
Dada una matriz cuadrada, se requieren determinadas funciones para conformar un
programa más complejo.
Las funciones requeridas son las siguientes:
    
    media: Recibe como argumento la matriz bajo análisis. Devuelve el promedio
    de todos los valores de la matriz.
    
    buscaPositivo: Recibe como argumento la matriz bajo análisis. Si existe un
    número positivo devuelve True, caso contrario, False. Además, admite el 
    parámetro reverse=True, con el cual, realiza lo propio pero con valores
    negativos.
    
    buscaMayor: Recibe como argumento la matriz bajo análisis. Devuelve el
    mayor número de la matriz. Además, admite el parámetro reverse=True,
    con el cual, realiza lo propio pero con el menor valor.
    
    mayoresQue: Recibe como argumento la matriz bajo análisis y un valor.  
    Devuelve la cantidad de elementos que son mayores que el valor recibido
    como parámetro. Además, admite el parámetro reverse=True, con el cual, 
    realiza lo propio pero con los elementos menores al valor recibido.
    
    --DESAFIO--
    moda: Recibe como argumento la matriz bajo análisis. Retorna el valor que
    más se repite. Si hay más de un valor con la misma cantidad de
    repeticiones, se retorna cualquiera de ellos.
    
El programa presentará un informe, a raíz de analizar una matriz dada, con cada 
una de las opciones ofrecidas por las funciones. Ej:
    - La media de los valores de la Matriz es: ...
    - Existen ... valores Mayores que la media
    - Existen ... valores Menores que la media
    - La Matriz tiene valores Positivos
    - La Matriz No tiene valores Negativos
    - El Mayor valor encontrado es: ...
    - El Menor valor encontrado es: ...

Una propuesta de solución sería.

14.7. Diccionarios de Facturas

Crear un diccionario que permita almacenar N facturas. La es clave el numero de factura y el valor el importe de la misma.

El número de factura debe estar entre 1 y 100000 y no se puede repetir.  La carga finaliza cuando el usuario contesta que no desea cargar mas datos.

Luego, realizar las funciones necesarias para:

1) Mostrar todo el diccionario

2) Imprimir solo los facturas con importe superior a 1000

3) consultar la factura ingresando el nro de factura

Una solución propuesta sería:


14.8. Valor dentro de un intervalo

Se desea saber si un número se encuentra dentro de un segmento, fuera del segmento por encima o debajo.

Crear una función que regresa True o False. Recibe como argumento 3 números Reales: min,max,x.

y verifica si min<=x<=max, en ese caso regresa True. Caso contrario False.

Observación: Ver que sucede si no se puede garantizar que min<=max?  . Plantee el mismo ejercicio pero asumiendo que se pueden ingresar máximo y mínimo en distinto orden. El Programa deberá detectar el mayor y menor de manera de lograr el intervalo (mínino, máximo)

Una propuesta de solución sería:



14.9. Diccionario Banderas de Países

Banderas de países

Realizar un programa con menú para cargar banderas de países con bandas tricolores.

El país sería la clave y los colores van en una lista. Cada opción llama a una función:
    Menú:
    A- cargar una bandera de país
    B- buscar por país
    C- buscar por color
    S- salir

* Cuando el usuario ingresa una opción del menú incorrecta, mostrar un mensaje
 * El programa finaliza cuando presiona la "S", considerar también las minúsculas

* A la carga, se le pasa como parámetro el nombre del pais y retorna True cuando finaliza la carga.

* Considerar antes de cargar un pais si éste ya no fue cargado, en ese caso emitir un mensaje
y permitir el reingreso de otro nombre de pais.
* Permitir la carga de más de un pais, preguntando luego de la carga del primero si quiere ingresar otro, si presiona el usuario "S" permitirá ingresar un segundo, en caso que presione cualquier otra tecla, volverá al menú principal.

 * Permitir al usuario ingresar el color que busca, si está que muestre el país, pero si no está retorne False y emita un mensaje en el programa principal.

Si el usuario elige la opcion A debe llamar a la funcion carga con argumento el nombre del pais, retorna un booleano.

Si el usuario elige la opción B debe llamar a la función buscapais que recibe como argumento el país a buscar y en la función muestra si encontró el nombre del país y los colores. Retorna un booleano que se evalúa en el programa principal por el False indicando que no se encontró el país.

Si el usuario elige la opción C debe llamar a la función buscacolor recibe como argumento el color a buscar. En la función, si encuentra, indica qué país tiene ese color caso contrario, emite un mensaje de "no encontrado". No retorna nada. 

Controlar que para realizar la opcion B o C antes debe haber cargado por lo menos un país.

Una propuesta de solución sería.

# DEFINICIÓN DE LAS FUNCIONES       
def carga(clave):
    lista=[]
    for i in range(3): #bucle para cargar los tres colores
        color=input("ingrese color: ")
        lista.append(color)        
        bande[clave]=lista
    print (bande)
    return True
def buscapais(p): # el parámetro es el nombre del pais   
    if p in bande:
        print("Está el pais", p, "sus colores son :", bande[p])
        return True        
    else:
        return False
        
def buscacolor(c):
    encuentra=False  # variable para saber si encuentra el color
    for k in bande:
        for l in range(len(bande)):
            if bande[k][l]==c:
                print("tiene el color ", c, " la bandera de ", k)
                encuentra= True   # cambia de valor cuando encuentra el color         
       
    if not(encuentra): # si terminaron los bucles y no cambió el valor 
        print("ninguna bandera cargada tiene el color ", c)  
        
# PROGRAMA PRINCIPAL    
bande={}  # defino un diccionario vacío en el programa principal
cargado=False #variable para saber si se cargó un país, se ocupará en B y C
opc="X"
while opc != "S" and opc != "s":
    print ("Menú")
    print ("A- cargar una bandera ")    # carga(p) retorna True
    print ("B- buscar por país ")       # buscapais(p) retorna True o False si encuentra el pais
    print ("C- buscar por color ")      # buscacolor(c) retorna True o False si encuentra el color
    print ("S- salir ")
    opc=input("elija una opción del menú:")
    if opc =="S" or opc=="s":
        print("Salió del programa")
        break
    elif opc =="A" or opc=="a":
        repe="S"
        while repe =="S":
            pais=input("ingrese el pais: ")
            cargado=carga(pais)
            repe=input("Presione S si desea cargar otro país o N si no:")
    elif opc =="B" or opc=="b":
        if cargado ==False: 
            print ("No puede buscar un pais porque no se cargó ninguno, elija la opción A")
        else:
            pais=input("ingrese el pais a buscar: ")
            if not(buscapais(pais)):
                print("no se encuentra el pais ", pais)
    elif opc =="C" or opc=="c":
        if cargado==False:
            print ("No puede buscar un color porque no se cargó banderas, elija la opción A")
        else:
            color=input("ingrese el color a buscar: ")
            buscacolor(color)
    else:
        print("Opción incorrecta, por favor reintente")


14.10. Ejercicio Funciones Diccionarios con Listas

Consigna 16) de Ejercicios propuestos

Se tiene que almacenar el Stock de repuestos de una empresa, los valores a almacenar serán: nombre del repuesto y valores máximo, mínimo y actual del Stock.

El valor máximo y mínimo son parámetros que permiten determinar cuándo debo comprar ese repuesto (si llegué o estoy por debajo del mínimo) y el máximo para saber que tengo stock suficiente.

Definir un diccionario con 3 nombres de claves, para todas las claves (repuestos) con los valores de cada ítem en cero (máx., min, stock)

Luego llamar a una función que permita realizar una carga inicial.

A continuación se presenta un menú permite:

1) Seleccionar y modificar el stock actual (no puede ser negativo)

2) Dar de baja un ítem

3) Dar de alta un ítem (no puede ser negativos los valores de stock)

4) Mostrar quien tiene stock crítico (por debajo del mínimo)

5) Listar los ítems

S o s) Salir.

Para cada ítem del menú llamar a una función que realice lo solicitado.


RESOLUCION


def cargaini():
    print("\n Cargando el diccionario...\n")
    for i in st:
        l=[]
        
        max1=int(input("Ingrese stock maximo"))
        while max1<0:
            max1=int(input("Error. ReIngrese stock maximo"))
        min1=int(input("ingrese stock minimo"))
        while min1<0:
            min1=int(input("Error. ReIngrese stock minimo"))
        act=int(input("ingrese stock actual"))
        while act<0:
            act=int(input("Error. ReIngrese stock actual"))
        l.append(max1)
        l.append(min1)
        l.append(act)
        st[i]=l

def modificar(clave):
    act=int(input("Ingrese nuevo stock actual"))
    while act<0:
            act=int(input("Error. ReIngrese stock actual"))
    st[clave][2]=act

def baja():
    cl=input("ingrese el item a da de baja :")
    if cl in st:
        st.pop(cl)
        return True
    else:
        return False
    
def alta(clave):
    l=[]
    max1=int(input("Ingrese stock maximo"))
    while max1<0:
            max1=int(input("Error. ReIngrese stock maximo"))
    min1=int(input("ingrese stock minimo"))
    while min1<0:
            min1=int(input("Error. ReIngrese stock minimo"))
    act=int(input("ingrese stock actual"))
    while act<0:
            act=int(input("Error. ReIngrese stock actual"))
    l.append(max1)
    l.append(min1)
    l.append(act)
    st[clave]=l

def control():
    band=False
    for i in st:
        if st[i][2]<st[i][1]:
            print("item con stock insuficiente: ",i)
            band=True
    if not band:
        print("no hubo items a mostrar")

def menu():
   print("\n1. Modificar st actual \n2. Baja \n3. Alta \n4. Control stock actual \n5. Mostrar dicc \ns. Salir \n")
   op=input("ingrese opcion: ")
   while op!='s' and op!='S':
    if op=='1':
        cl=input("ingrese el item a modificar :")
        if cl in st:
            modificar(cl)
        else:
            print("no existe ese item")
    elif op=='2':
            if baja():
                print("elemento borrado con exito")
            else:
                print("No se pudo borrar el item")
    elif op=='3':
        cl=input("ingrese el item a da de alta :")
        if cl in st:
            print("YA existe ese item")
        else:
            alta(cl)
    elif op=='4':
        control()
    elif op=='5':
        print("\nDiccionario cargado: ")
        for i in st:
            print(i, ": ", st[i])
    elif op=='S' or op=='s':
        print("chau")
    else:
        print("error opcion incorrecta!")
    
    print("\n1. Modificar st actual \n2. Baja \n3. Alta \n4. Control stock actual \n5. Mostrar dicc \ns. Salir \n")
    op=input("Ingrese opcion: ")
    
st={'rep1':[0,0,0],'rep2':[0,0,0],'rep3':[0,0,0]}

cargaini()

menu()




14.11. Ejercicio Contraseñas

Consigna

Escribir una función que permita validar/catalogar una frase ingresada como posible contraseña. De acuerdo al análisis, se devolverá el nivel de seguridad correspondiente.
La función recibe como argumento la contraseña y retorna el nivel de seguridad.

Se considerarán las siguientes pautas:

* Longitud menor a 6: No válido como clave. Seguridad 0
* Al menos un carácter en minúscula. Seguridad +1
* Al menos un carácter en mayúscula. Seguridad +1
* Al menos un carácter numérico. Seguridad +1
* Al menos un carácter símbolo. Seguridad +1
* Longitud mayor a 10. Seguridad +1

Mostrar al finalizar, la clave ingresada seguida del nivel de seguridad (Seguridad 5 es el máximo, se cumplen todos los requisitos).

Resolución Propuesta





14.12. Lista con Diccionarios.

Se debe carga una  lista con diccionarios. Los datos para almacenar del diccionario son dni y nombre. Una función carga debe regresar un diccionario que se va agregando a la lista.

def menu():
    print("1- cargar")
    print("2- mostrar")
    print("3- salir")
    opc=input("Ingrese una opción:")
    return opc

def cargar():
    d={}
    dni=int(input("Ingrese su DNI:"))
    nombre=input("Ingrese su nombre: ")
    d[dni]=nombre
    return(d)

#-------------Codigo Principal o main script--------------
lista=[]
ejecutando=True
while ejecutando:
    x=menu()
    if x=='1':
        SoN=input("Desea agregar un elemento a la lista S o N?").upper()
        if SoN=='S':
            lista.append(cargar())
        else:
            print("continuamos..")
    elif x=='2':
        print(lista)
    elif x=='3':
        print("Fin del programa..")
        ejecutando=False
    else:
        print("Opción no válida...reingrese..")