# vamos a crear una función a la que le pasamos una cantidad variable # de números y nos dice cuantos pares hay # contarPares(1,2,3)->1 contarPares(1,2,4,6)-> 3 # documentadla # Vamos a crear una función a la que le pasemos una cantidad variable de números # y nos diga la cantidad de aprobados (valor>=5) # aprobados(3,6,7,5)->3 aprobados(7,1,2,9)->2 #documentadla
Autor: Juan Pablo Fuentes
Formador de programación y bases de datos
Recursión en Python
Enlaces de más sencillo a más complicado:
https://www.programiz.com/python-programming/recursion
Recursividad y funciones de orden superior
# función recursiva: una función que se llama a sí misma # factorial de un número: 5!=5*4*3*2*1 multiplicación de todos los números hasta el 1 # factorial de un número: 5! = 5*4! multiplicación del número por el factorial de ese número -1 # Si yo quiero haccer una función recursiva: # identificar el caso base: Siempre hay un final donde devolvemos un valor y no otra llamada # if numero<2 devuelvo 1 # poner nuestra función como una llama a ella misma # numero*factorial(numero-1) # En esta llamada de alguna manera nos acercamos al caso base def factorialRecursivo(numero): if numero < 2: return 1 else: return numero * factorialRecursivo(numero - 1) print(factorialRecursivo(5)) # 120 # funciones de orden superior # utilizar funciones como parámetros # yo tengo una función procesar que tiene dos parámetros # una función y un número def procesar(funcion, numero): return funcion(numero) def cuadrado(numero): return numero**2 def doble(numero): return numero*2 print(procesar(cuadrado,3)) # cuadrado es un parámetro print(procesar(doble,3)) # doble es un parámetro
Más cosas de funciones
# valores predeterminador # valores por defecto def saludo(nombre="sin nombre"): return "Hola "+nombre print(saludo("Juan")) print(saludo()) def pvp(precio,iva=.21): return precio*(1+iva) print(pvp(100,.21)) print(pvp(100)) print(pvp(100,.04)) # parámetros arbitrarios def suma(a,b): return a+b print(suma(8,5)) # al poner *args en args se guarda una lista con todos los parámetros que le pasemos def sumaVariable(*args): suma=0 for valor in args: suma+=valor return suma print(sumaVariable(1,2,3)) print(sumaVariable(1,2,3,4,5,6,7)) print(sumaVariable()) # crear una función mayorNumero a la que le pasemos un número variable de argumentos # y nos devuelva el mayor de todos ellos def mayorNumero(*args): mayor=args[0] # recorriendo la lista for valor in args: # y si el elemento que estoy mirando es mayor que el que tengo me quedo con el if valor>mayor: mayor=valor return mayor print(mayorNumero(1,6,4,3)) #6 print(mayorNumero(-1,-6,-4,-3)) #-1 print(mayorNumero(1,6,4,30,100,20,1000,59,1)) #1000
Soluciones ejercicios
# Quiero una función menor a la que le pasamos dos números y nos devuelve el más pequeño # menor(1,8)-> 1 menor(10,2)->2 menor(8,8)->8 def menor1version(num1, num2): # si el numero 1 es menor que el numero 2 devuelvo el numero 1 if num1 < num2: return num1 # si el numero 2 es menor que el numero 1 devuelvo el numero 2 if num2 < num1: return num2 # si son iguales da igual cual devolvamos porque son iguales return num1 # refactorizar: mejorar el código def menor(num1, num2): if num1 < num2: return num1 else: return num2 print(menor(1, 8)) # 1 print(menor(10, 2)) # 2 print(menor(8, 8)) # 8 # Quiero una función a la que le paso una cadena y un numero y nos devuelve la cadena # repetida tantas veces como el número # repetirCadena("Ana",3)->"AnaAnaAna" repetirCadena("qw",5)->"qwqwqwqwqw" def repetirCadena(cadena, numero): res = "" for i in range(numero): res += cadena return res print(repetirCadena("Ana", 3)) # "AnaAnaAna" print(repetirCadena("qw", 5)) # "qwqwqwqwqw"
Y todavía más ejemplos
# calcular el factorial de un número # numero!= 1*2*3...*numero # nombre de la función y parámetros def factorial(numero) # que devuelvo: calcular el factorial # casos de prueba. factorial(3)--> 6 factorial(5)--->120 def factorial(numero): resultado=1 # codigo que me calculará el factorial todavía no sé como for i in range(1,numero+1): resultado*=i return resultado print(factorial(3)) # imprimir 6 print(factorial(5)) # imprimir 120 # quiero una función que me cuente en una cadena las veces que aparece una letra # contarLetra("hola que tal","l")--->2 contarLetra("patata","a")--->3 def contarLetra(cadena,letra): apariciones=0 # calcularé las veces que aparece la letra for caracter in cadena: if caracter==letra: apariciones+=1 return apariciones print(contarLetra("hola que tal","l")) # 2 print(contarLetra("patata","a")) # 3
Más ejemplos funciones
# funciones puras: no dependen del entorno para funcionar # Son como una caja negra que procesan los datos que le pasamos # y devuelven un resultado import math def entrarNoPura(): if edad >= 18: return True else: return False edad = 19 print(entrarNoPura()) edad = 9 print(entrarNoPura()) def entrarPura(edad): if edad >= 18: return True else: return False print(entrarPura(20)) def suma(a, b, c, d): return a + b + c + d print(suma(1, 2, 3, 4)) def saludo(nombre): return "Hola " + nombre cadena = saludo("Ana") print(cadena) print(saludo("Eva")) def nombreCompleto(nombre, apellido): return nombre + " " + apellido print(nombreCompleto("Ana", "Pi")) def contarVocales(cadena): vocales = 0 for letra in cadena: # comprobaré si es vocal for vocal in "aeiouáéíóúàèìòùü": if letra == vocal: vocales += 1 return vocales def esPrimo(numero): for i in range(2,numero): if numero % i == 0: return False return True print(contarVocales("Hola que tal")) print(contarVocales("él es un pingüino matón")) print(esPrimo(17)) print(esPrimo(18))
Ejemplos funciones
# dentro de un programa tengo muchos códigos que hacen diferentes cosas # contarvocales # La idea de una función es: # 1) Poder reutilizar un código en diferentes sitios sin tener que repetirlo # 2) Hacer que nuestro código sea modular y flexible # 3) Costruir funciones puras (ya veremos lo que es) # defino una función saludo def saludo(nombre): print("Hola", nombre, " que tal estás?") print("Hace tiempo que no nos vemos") print("Ya te lamaré", nombre) saludo("Ana") # Llamo a la función con el valor de "Ana" y se ejecutará con este valor saludo("Pep") saludo("Juan") # sintaxis de una función # def nombre_de_la_funcion(parametro1,parametro2,parametro3...): # Un código a ejecutar # return valor # Sin parámetros y sin devolver valor def hola(): print("hola") hola() # No tiene parámetros pero devuelve un valor def numeroPI(): return 3.141592653 pi = numeroPI() print(pi) # Tiene parámetros y devuelve un valor def doble(numero): return numero * 2 a = doble(8) print(a) a = doble(90) print(a) # Tiene un parámetro pero no devuelve ningún valor def despedida(nombre): print("Adios", nombre) despedida("Ana") # función con 3 parámetros que devuelve un resultado def mayor(a, b, c): if b > a: a = b if c > a: a = c return a print(mayor(1, 8, 2)) print(mayor(10, 8, 2))
Solución contar vocales
# pedir una cadena al usuario # y decir cuantas vocales tiene # pido una cadena al usuario cadena = input("Dame una cadena ") totalVocales = 0 # Recorreré la cadena for letra in cadena: # comprobaré si es vocal if letra == "a" or letra == "e" or letra == "i" or letra == "o" or letra == "u": totalVocales += 1 # imprimo el resultado print("vocales",totalVocales) vocalesSin=0 vocalescon=0 for letra in cadena: # comprobaré si es vocal for vocal in "aeiou": if letra == vocal: vocalesSin += 1 for vocal in "áéíóúàèìòùü": if letra == vocal: vocalescon += 1 # imprimo el resultado print("vocales sin acentos",vocalesSin) print("vocales con acentos",vocalescon)
useContext
crear Contexto: (Contexto.js)
import { createContext } from "react"; const Contexto=createContext("valor por defecto"); export default Contexto;
Proveer de contexto: (App.js)
import './App.css'; import React from 'react'; import ComPadre from './componentes/ComPadre'; import Contexto from './componentes/Contexto'; function App() { return ( <div className="App"> <Contexto.Provider value="Hola contexto"> <ComPadre texto="Hola" /> </Contexto.Provider> </div> ); } export default App;
Arbol de componentes: (Compadre,comhijo1,comhijo2)
import ComHijo1 from "./ComHijo1"; function ComPadre({ texto }) { return <ComHijo1 texto={texto}/>; } export default ComPadre;
import ComHijo2 from "./ComHijo2"; function ComHijo1({ texto }) { return <ComHijo2 texto={texto}/>; } export default ComHijo1;
import ComHijo3 from "./ComHijo3"; function ComHijo2({ texto }) { return <ComHijo3 texto={texto}/>; } export default ComHijo2;
Consumir el contexo (ComHijo3)
import { useContext } from "react"; import Contexto from "./Contexto"; function ComHijo3({ texto }) { const textoContexto = useContext(Contexto); console.log(textoContexto) return (<> <h1>{texto}</h1> <p> Esto viene desde las propiedades por goteo</p> <h1>{textoContexto}</h1><p> Esto viene del contexto</p> </>) } export default ComHijo3;