Funciones de usuario

Es un conjunto de lineas de código que esta agrupado, que funciona como una unidad y que responde a un nombre.

1. Crear funciones de usuario

La principal utilidad de una función es rehusar código. También llamados métodos cuando se encuentren definidos dentro de una clase.

def nombre():
   #código
def uno():
   print('Uno')
   print('Dos')
   print('Tres')

Tenga en cuenta el indentado que es lo que determina hasta donde va la función.

2. Usar funciones de usuario

Para usar una función de usuario basta llamarla por su nombre.

nombre()

Tenga en cuenta que la función no se ejecutara con su creación, es necesario llamarla expresamente.

3. Pasar parámetros o argumentos

Se puede recibir parámetros o argumentos que serán usados en la función. Python siempre pasa los parámetros como referencia y no como valor.

def nombre(par1,par2...,parN):
   #código
def suma(a,b):
   print(a + b)

suma(3,5)   #Respuesta = 8
suma(10,2)  #Respuesta = 12

4. Devolver parámetros

Se puede devolver valores.

def nombre():
   #código
   return val1,val2...valN
def suma(a,b):
   return a + b

print(suma(3,5))   #Respuesta = 8
c = suma(10,2)     #Acabamos de guardar en una variable 12
print(c)

5. Importar funcion

Las funciones en Python se pueden guardar en archivos aparte y luego añadir la función desde el scrip con la extensión .py

import script.py

Aqui definimos una funcion dentro de ua libreria y luego importamos la libreria y llamamos a la funcion.

-->libreria.py      #Crear script con funcion
def hola():
   print('Te saludos desde la funcion hola() en libreria.py')
---

import libreria     #Invocar libreria
libreria.hola()     #Usar funcion

También podemos importar funciones directamente, de esta forma ahorraríamos memoria si la libreria es muy grande.

from libreria import funcion

6. Generadores

Puedes generar elementos poco a poco cada vez que lo solicitas. Puede generar caracteres, listas, tuplas, diccionarios, objetos, etc. La palabra clave yield en Python se usa dentro de una función para transformarla en un generador.

A diferencia de return, que termina la función por completo y devuelve un valor, yield pausa la ejecución de la función, devuelve un valor al flujo principal y recuerda su estado para continuar exactamente donde se quedó la próxima vez que se le llame.

def nombre():
   yield numero

La función next() se usa en Python para extraer el siguiente elemento de un objeto iterador o generador (como los creados con yield).

next(iterador, valor_por_defecto)
def pares(lim):
   n = 1
   while n < lim:
      yield 2*n
      n += 1
   
objeto = pares(10)  #Objeto iterable

#Imprimir la lista completa
for i in objeto:
   print(i)

print(next(objeto))   #2
#Mas código
print(next(objeto))   #4
frutas = iter(['manzana','banana'])
print(next(frutas, 'No hay más'))  #Imprime: manzana
print(next(frutas, 'No hay más'))  #Imprime: banana
print(next(frutas, 'No hay más'))  #Imprime: No hay más

Mientras for consume automaticamnete todo el iterable next() te da el control manual por elemento pausando la ejecucion.

7. Ejemplos

Algunos ejercios para que practique...

Las 4 operaciones basicas.

def suma(a,b):
   return a+b
def resta(a,b):
   return a-b
def multiplicion(a,b):
   return a*b
def division(a,b):
   return a/b

n1 = int(input('Primer numero ='))
n2 = int(input('Segundo numero ='))
op = input('operacion =')
match op:
   case 'suma':
      print(suma(n1,n2))
   case 'resta':
      print(resta(n1,n2))
   case 'multiplica':
      print(multiplicacion(n1,n2))
   case 'divide':
      print(division(n1,n2))
   case _:
      print('Operacion no existe')
print('Operacion ejecutada')

Genera números pares hasta un limite max

def pares(lim):
   n = 1
   miLista = []
   while n < lim:
      miLista.append(2*n)
      n += 1
   return miLista

#Ejecutamos
print(pares(10))

Genera números pares hasta un limite max

def pares(lim):
   n = 1
   while n < lim:
      yield 2*n
      n += 1
   
objeto = pares(10)  #Objeto iterable

#Imprimir la lista completa
for i in objeto:
   print(i)

print(next(objeto))   #2
#Mas código
print(next(objeto))   #4

Devuelve ciudades de una lista

def devuelve_ciudades(*ciudades):
   for elemento in ciudades:
      yield elemento

ciudades_devueltas = devuelve_ciudades('Lima','Madrid','Barcelona','Lisboa')

print(next(ciudades_devueltas))   #Lima
print(next(ciudades_devueltas))   #Madrid
print(next(ciudades_devueltas))   #Barcelona
print(next(ciudades_devueltas))   #Lisboa

Devuelte deletreo de cada ciudad (from)

def devuelve_ciudades(*ciudades):
   for elemento in ciudades:
      yield from elemento

ciudades_devueltas = devuelve_ciudades('Lima','Madrid','Barcelona','Lisboa')

print(next(ciudades_devueltas))   #L
print(next(ciudades_devueltas))   #i
print(next(ciudades_devueltas))   #m
print(next(ciudades_devueltas))   #a