<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Funciones
Las funciones es una fragmento de código que recibe parámetros, ejecuta instrucciones y regresa resultados. Y nos permiten reutilizar código llamandola cuantas veces sea necesario.
``` python
    def función(parámetros)
Step1:  Modo correcto de definir una función
Step2:  Ejemplo de uso de funciónes
Suponiendo que se tienen las siguientes listas que representan las calificaciones de 3 alumnos
Step3:  y se desa calcular el promedio para cada uno, una forma de hacerlo seria la siguiente, calculando individualmente el promedio para cada uno e imprimiendo los resultados por pantalla
Step4:  Pero como se puede apreciar eso complica el código haciendolo repetitivo y largo, la manera mas optima para hacer esto seria creando una función que calculara el promedio, para eso se utiliza la sintaxis
Step5:  Ahora con la función promedio definida el código se puede simplificar de la siguiente manera
Step6:  Parametros opcionales
En este caso se pude definir una función sin necesidad de pasar parámetros
Step7:  Parametros predefinidos
En estos casos se le asigna un valor al predeterminado al párametro con el cual se ejecutara la función en caso de que no se le asigne algun otro valor.
<ASSISTANT_TASK:>
Python Code:
printfunc(3)
def func(num):
    return(num**num+num)
Explanation: Funciones
Las funciones es una fragmento de código que recibe parámetros, ejecuta instrucciones y regresa resultados. Y nos permiten reutilizar código llamandola cuantas veces sea necesario.
``` python
    def función(parámetros):
        instrucciones
        return(resultado)
        ```
Si una función es definida pero no invocada no se ejecutara en el código
Parámetros
Son elementos que recibe una función, para luego trabajar con ellos. Pueden ser:
Variables, que se utilizan dentro del código de la función
Constantes, valores predefinidos dentro de la función
Nulos
Se le entregan a la función al momento de llamarla. Se especifican al momento de definir la función
Valor de retorno
Es el valor que entrega la función una vez que ha terminado de ejecutarse, este se puede igualar a una variable dentro del programa
``` python
    var = función(parámetro_1,parámetro_2)
        ```
Invocación
La invocación es el llamado de la función y se realiza cuando se quiere ejecutar la función definida. 
Para realizar una invocación es necesiario primero definir la función o importar el módulo que la contiene y luego llamarla.
Si se intenta primero llamar a la función y luego definirla python regresara un error por definición.
Modo incorrecto de invocar una función
End of explanation
def func(num):
    return(num**num+num)
    
func(3)
Explanation: Modo correcto de definir una función
End of explanation
alex=[90,70,80,60,90]
kate=[60,70,90,70,90]
david=[90,60,80,90,80]
Explanation: Ejemplo de uso de funciónes
Suponiendo que se tienen las siguientes listas que representan las calificaciones de 3 alumnos:
End of explanation
#Promedio para Alex
i=0
sumatoria = 0
while i < len(alex):
    sumatoria += alex[i]
    i += 1
promedio=sumatoria/len(alex)
print(promedio)
#Promedio para Kate
i=0
sumatoria = 0
while i < len(kate):
    sumatoria += kate[i]
    i += 1
promedio=sumatoria/len(kate)
print(promedio)
#Promedio para David
i=0
sumatoria = 0
while i < len(david):
    sumatoria += david[i]
    i += 1
promedio=sumatoria/len(david)
print(promedio)
Explanation: y se desa calcular el promedio para cada uno, una forma de hacerlo seria la siguiente, calculando individualmente el promedio para cada uno e imprimiendo los resultados por pantalla:
End of explanation
def promedio(alumno):
    n = len(alumno) 
    i = 0
    sumatoria = 0
    while i < n:
        sumatoria += alumno[i]
        i += 1
    resultado= sumatoria/n
    print(resultado)
        
Explanation: Pero como se puede apreciar eso complica el código haciendolo repetitivo y largo, la manera mas optima para hacer esto seria creando una función que calculara el promedio, para eso se utiliza la sintaxis:
``` python
    def función(parámetros):
        instrucciones
        return(resultado)
        ```
End of explanation
promedio(alex)
promedio(kate)
promedio(david)
Explanation: Ahora con la función promedio definida el código se puede simplificar de la siguiente manera
End of explanation
def saludo():
    print("Hola!!!")
saludo()
Explanation: Parametros opcionales
En este caso se pude definir una función sin necesidad de pasar parámetros
End of explanation
# Definicion de la función con el parámetro hora predeterminado como True
def saludo(hora=True):
    if hora==True:
        print("Hola, buen día!")
    else:
        print("Hola, buenas noches")
# Se ejecuta la función sin asignación de párametro
saludo()
# Se ejecuta la funcion con asignación de parámetro
t=False
saludo(t)
Explanation: Parametros predefinidos
En estos casos se le asigna un valor al predeterminado al párametro con el cual se ejecutara la función en caso de que no se le asigne algun otro valor.
End of explanation
<END_TASK>