Funciones como objetos

20/31

Lectura

Funciones como objetos

Una de las caracter铆sticas m谩s poderosas de Python es que todo es un objeto, incluyendo las funciones. Las funciones en Python son 鈥渃iudadanos de primera clase鈥.

Esto, en sentido amplio, significa que en Python las funciones:

  • Tienen un tipo
  • Se pueden pasar como argumentos de otras funciones
  • Se pueden utilizar en expresiones
  • Se pueden incluir en varias estructuras de datos (como listas, tuplas,
    diccionarios, etc.)

Argumentos de otras funciones

Hasta ahora hemos visto que las funciones pueden recibir par谩metros para realizar los c贸mputos que definen. Algunos de los tipos que hemos pasado son tipos simples como cadenas, n煤meros, listas, etc. Sin embargo, tambi茅n pueden recibir funciones para crear abstracciones m谩s poderosas. Veamos un ejemplo:

def multiplicar_por_dos(n):
    return n * 2

def sumar_dos(n):
    return n + 2

def aplicar_operacion(f, numeros):
    resultados = []
    for numero in numeros:
        resultado = f(numero)
        resultados.append(resultado)

>>> nums = [1, 2, 3]
>>> aplicar_operacion(multiplicar_por_dos, nums)
[2, 4, 6]

>>> aplicar_operacion(sumar_dos, nums)
[3, 4, 5]

Funciones en expresiones

Una forma de definir una funci贸n en una expresi贸n es utilizando el keyword lambda. lambda tiene la siguiente sintaxis: lambda <vars>: <expresion>.

Otro ejemplo interesante es que las funciones se pueden utilizar en una expresi贸n directamente. Esto es posible ya que como lo hemos platicado con anterioridad, en Python las variables son simplemente nombres que apuntan a un objeto (en este caso a una funci贸n). Por ejemplo:

sumar = lambda x, y: x + y

>>> sumar(2, 3)
5

Funciones en estructuras de datos

Las funciones tambi茅n se pueden incluir en diversas estructuras que las permiten almacenar. Por ejemplo, una lista puede guardar diversas funciones a aplicar o un diccionario las puede almacenar como valores.

def aplicar_operaciones(num):
    operaciones = [abs, float]

    resultado = []
    for operacion in operaciones:
        resultado.append(operacion(num))

    return resultado

>>> aplicar_operaciones(-2)
[2, -2.0]

Como pudimos ver, las funciones son objetos muy vers谩tiles que nos permiten tratarlas de diversas maneras y que nos permiten a帽adir capas adicionales de abstracci贸n a nuestro programa.

Comp谩rtenos c贸mo te imaginas que estas capacidades de Python te pueden ayudar a escribir mejores programas.

Aportes 247

Preguntas 3

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

La mejor forma de entender las funciones, usando el ejemplo de David com lambda:

Las funciones lambda est谩n pensadas para desarrollar funciones simples (no pueden tener un c贸digo extenso como una funci贸n declarada con def). Otra cosa que me gustar铆a agregar es que son una suerte de funciones an贸nimas que si uno presta atenci贸n, no son declaradas con un nombre. Aqu铆 les dejo un link interesante al respecto:

https://docs.hektorprofe.net/python/funcionalidades-avanzadas/funciones-lambda/

Socratica (YouTube) tiene varios videos de python, y wow, que interesante esta el uso de LAMBDA, creo que me desvie mucho con este tema hehe https://www.youtube.com/watch?v=25ovCm9jKfA por si quieren checarlo.

驴C贸mo definir una funci贸n en Python?

Encontr茅 esta informaci贸n acerca de la funci贸n lambda :
Funciones lambda
Si empiezo diciendo que las funciones o expresiones lambda sirven para crear funciones an贸nimas, posiblemente me dir茅is 驴qu茅 me est谩s contando?, as铆 que vamos a tomarlo con calma, pues estamos ante unas de las funcionalidades m谩s potentes de Python a la vez que m谩s confusas para los principiantes.

Una funci贸n an贸nima, como su nombre indica es una funci贸n sin nombre. 驴Es posible ejecutar una funci贸n sin referenciar un nombre? Pues s铆, en Python podemos ejecutar una funci贸n sin definirla con def. De hecho son similares pero con una diferencia fundamental:

El contenido de una funci贸n lambda debe ser una 煤nica expresi贸n en lugar de un bloque de acciones.

Y es que m谩s all谩 del sentido de funci贸n que tenemos, con su nombre y sus acciones internas, una funci贸n en su sentido m谩s trivial significa realizar algo sobre algo. Por tanto podr铆amos decir que, mientras las funciones an贸nimas lambda sirven para realizar funciones simples, las funciones definidas con def sirven para manejar tareas m谩s extensas.

Si deconstruimos una funci贸n sencilla, podemos llegar a una funci贸n lambda. Por ejemplo tomad la siguiente funci贸n para doblar un valor:

En el ejemplo de Argumento de otras funciones hizo falta establecer return, al menos a mi no me mostro nada si no se ten铆a, 驴alguien tuvo la misma situaci贸n?

Lo importante de las funciones lambda -que creo que falt贸 mencionar- es que ellas deben ser funciones que son ejecutadas en una l铆nea de c贸digo, es decir, funciones r谩pidas, sencillas, cortas. La ventaja de su uso es que el c贸digo se ejecutaria m谩s r谩pido, ya que no se definiria una funcion con def, que trae consigo m谩s abstracci贸n.

Esto de leer los comentarios esta aumentando mi capacidad de aprendizaje!! Dios bendiga la comunidad Platzi

Al c贸digo de 鈥淎rgumento de otras funciones鈥 le hace falta un 鈥渞eturn resultados鈥 para que funcione como debe ser, quedar铆a algo as铆:

def multiplicar_por_dos(n):
    return n * 2

def sumar_dos(n):
    return n + 2

def operacion(f, numeros):
    resultados = []
    for numero in numeros:
        resultado = f(numero)
        resultados.append(resultado)
    return resultados

nums = [1, 2, 3]   

print(operacion(sumar_dos, nums))

Otra cosa es que hay que tener cuidado al llamar o imprimir la funci贸n lambda, de lo contrario arrojar铆a algo como <function <lambda> at 0x000001CD88B56F78>,

sumar = lambda x, y: x + y
resultados = sumar(int(input('ingrese primer valor:')),int(input('ingrese segundo valor:')))
print(resultados)

Dejo un enlace con una explicaci贸n m谩s a fondo de lambdas:

https://www.youtube.com/watch?v=cJ9zcR1uTt8

A continuaci贸n un ejemplo de funciones como par谩metros a otras fuciones

def suma(a,b):
    return a + b

def resta(a,b):
    return a - b

def multiplica(a,b):
    return a * b

def divide(a,b):
    return a / b

def operacion(v1, v2, funcion):
    return funcion(v1,v2)

def error():
    print("No ha seleccionado una operacion correcta")

def inicio():
    a = int(input("Escoge un entero: "))
    b = int(input("Escoge otro entero: "))

    tipo = int(input("Ingrese el tipo de operacion a utilizar \n 1. Suma \n 2. Resta \n 3. Multiplicacion \n 4. Division \n ==> "))
    if tipo == 1:
        respuesta = operacion(a,b, suma)
    elif tipo == 2:
        respuesta =  operacion(a,b, resta)
    elif tipo == 3:
        respuesta = operacion(a,b, multiplica)
    elif tipo == 4:
        respuesta = operacion(a,b, divide)    
    else:
        error()
    
    print(f'La respuesta es {respuesta}')

inicio()

Lambda esta genial, calculo de factorial en una sola linea. 馃く

factorial = lambda x : 1 if x == 1 else x * factorial(x - 1)
print(factorial(7))

no se vosotros pero en este curso no me estoy enterando de nada

Alguien me puede hacer el favor de explicar la l铆nea que hay dentro del for? En especial la funci贸n 鈥渙peracion(num)鈥. No entiendo muy bien de donde sale.

Gracias a que en Python las funciones son tan vers谩tiles se pueden crear programas realmente modulares permitiendo reutilizar una gran cantidad de c贸digo de manera sencilla.

lambda en python es similar a las arrow function en javascript aqui les comparto la comparacion

Realmente es un tema en el que debo profundizar mas porque no es tan simple a la hora de irlo usarlo, veo que es bastante amplio me gusta mucho cuando dejan retos porque me obliga a usarlo pero revisare de nuevo la clase gracias

Ohh las funciones lambda son como las arrow functions de JavaScript! Y lo de pasar como par谩metro una funci贸n es como pasar un 鈥渃allback鈥 en JavaScript (o Closure en PHP), por comparar:
.
Python:

sumar = lambda x, y: x + y
print(sumar(2, 3))

.
JavaScript:

const sumar = (x, y) => x + y
console.log(sumar(2, 3))

La expresi贸n lambda me sorprende.
Simplifica mucho escribir funciones simples que devuelven alguna operaci贸n matem谩tica, evit谩ndose la complejidad de la sintaxis tradicional de funciones.

Por si quieren correrlo en StudioCode 馃悕

def multiplicar_por_dos(n):
    return n*2

def sumar_dos(n):
    return n+2

def aplicar_operacion(f, numeros):
    resultados = []
    for numero in numeros:
        resultado = f(numero)
        resultados.append(resultado)
    return resultados
def run():
    print('hola')
    nums = [1,2,3]
    res = aplicar_operacion(multiplicar_por_dos, nums)
    print(res)

if __name__ == '__main__':
    run()

lambda es como las arrow function de javascript???

Amigos,
驴A qu茅 se refiere el profesor cuando dice que en Python las funciones tiene un tipo?

Gracias a esto es que se pueden crear los decoradores, que en pocas palabras es una funci贸n que recibe otra funci贸n como par谩metro, ejecuta algo antes o despu茅s de la funci贸n.

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@my_decorator
def say_whee():
    print("Whee!")

Una explicaci贸n adicional muy sencilla de la funciones lambda:
https://docs.hektorprofe.net/python/funcionalidades-avanzadas/funciones-lambda/

Creo que puede ayudar mucho a crear c贸digo altamente reutilizable y limpio. Por ejemplo las funciones anidadas permiten crear closures, las funciones lambda permiten crear funciones en una sola l铆nea, y el que se puedan almacenar funciones en arreglos permite implementar el patr贸n Chain of responsability(cadena de responsabilidades). Adem谩s que se puede hacer una composici贸n de funciones muy similar a la forma en que se puede hacer en javascript. Habr铆a estado muy bien un video con ejemplos de esto.

Por si alguien lo entiende mejor lo de funciones como parametros (ademas en el ejemplo hay un error la lista no se puede llamar nums se ha de llamar numeros.

# -*- coding: utf-8 -*-
"""
Created on Sat Apr 25 18:43:28 2020

@author: xavik
"""

def multiplicar_por_dos(n):
    return n*2

def sumar_dos(n):
    return n+2

def aplicar_operacion(f, numeros): # f representa la funcion parametro
    resultados = []
    for numero in numeros:
        resultado = f(numero) # se escogera entre las dos primeras funciones
        resultados.append(resultado)
    return resultados

numeros = [1, 2, 3]

# sumar_dos() dentro de aplicar_operacion() dentro de print()
print(aplicar_operacion(sumar_dos, numeros))
print(aplicar_operacion(multiplicar_por_dos, numeros))

S煤per mal 茅sto, para una lectura como 茅sta m谩s bien hubiera buscado por internet y no haber pagado una membres铆a.
No es la primera vez que ponen texto, el video ayuda a entender, no todos somos programadores con una basta experiencia en desarrollo.

Perd贸n, qu茅 quiere decir resultado = [] ??

Estas aplicaciones me pueden ayudar a eliminar procesos repetitivos desarrollando la integraci贸n de diferentes funciones. Por ejemplo, si necesito determinar una serie de par谩metros estad铆sticos y determinar la normalizaci贸n de los datos. los datos de entrada los puedo meter un una funci贸n que saque las caracter铆sticas b谩sicas como la media, std y otros. Con ellos puedo meter esa funci贸n dentro de otras funciones que hagan procesos de normalizaci贸n para definir el mas optimo.

Un ejemplo mas del cotidiano. Una empresa que vende pinturas determina ciertos colores primarios usando una formula. Con esos colores se pueden volver a usar para obtener mas variaciones de colores usando la formula principal dentro de las formulas secundarias para los otros colore. Pasar de un verde b谩sico usando una formula a un verde perlado.

Si me equivoco me corrigen porfa.

Pregunta, 驴para que sirve el .append?

Un caso especifico que se me viene a la mente es la manipulaci贸n de archivos.
En Python hay funciones que nos permiten manipular archivos, abrirlos, escribir, cerrarlos, eliminarlos, etc.
Entonces imagina que tenemos 3 funciones para aplicarle a una lista de 100 archivos, podrias modificar esos 100 archivos de 3 maneras diferentes, todo eso dentro de un bucle for.

ESTE CURSO INTRODUCCION AL PENSAMIENTO COMPUTACIONAL CON PYTHON DEBERIA DE SER EL PRIMERO QUE VEAMOS ANTES DE EMPEZAR EL CURSO DE PYTHON, YA QUE ASI ENTRAMOS CON CONOCIMIENTOS MAS DEFINIDOS Y AVANZARIAMOS MAS RAPIDO

Les comparto mi codigo para 鈥淎rgumentos de otra funcion鈥

def multiplicar_por_dos(n):
    return n * 2

def sumar_dos(n):
    return n + 2

def aplicar_operacion(funcion, numeros):
    resultados = []
    for numero in numeros:
        resultado = funcion(numero)
        resultados.append(resultado)
    print(resultados)

numeros = []
elementos = int(input('Ingrese el numero de elementos: '))	
for i in range(0, elementos):
	elemento = int(input())

	numeros.append(elemento)

print(numeros)
funciones = int(input("""\nSeleccione la funcion que desea ejecutar:
    		1.- Multiplicar por dos
    		2.- Sumar dos
    		"""))	
if funciones == 1:
	aplicar_operacion(multiplicar_por_dos, numeros)
elif funciones ==2:
	aplicar_operacion(sumar_dos, numeros)
else:
	print("La funcion no existe")```

En este ejercicio se provee una lista de n煤meros separados por comas que es guardada como string, despu茅s se convierte el string en una lista de enteros. Por 煤ltimo las funciones para duplicar y sumar 2 unidades se ponen dentro de una estructura de lista y se aplican a cada n煤mero de la lista prove铆da por el usuario:

Si he entendido bien, las funciones en expresiones 驴seria como crear una funci贸n de forma r谩pida?
O sea, esto:

sumar = lambda x,y: x + y

驴seria lo mismo que esto?

def sumar2(x,y):
return x+y

Las funciones en estructura de datos nunca se me hab铆a ocurrido, sin embargo, tiene sentido tomando en cuenta la estructura del c贸digo y la forma en que funciona el ciclo for.

Una aplicaci贸n que se me ocurre es en el caso de que a un n煤mero le tengas que hacer varias operaciones, una tras otra

Para comprobar que en python todo es un objeto, usaremos la funcion isinstance().
La聽isinstance() funci贸n devuelve聽True si el objeto especificado es del tipo especificado, en caso contrario聽False.
Ejemplo.

La isinstance() nos pedir谩 2 argumentos, el valor a analizar y el tipo de dato

num = 5

print(isinstance(num, int))

Da como salida:

True

Si cambiamos la variable num a 5.5, nos dar铆a False por ser ahora un flotante.Ahora, cambiemos a cualquier valor y el tipo de dato le decimos que sea object.

num= 5
num2 = 5.5
palabra = 'Hola mundo'

def saluda(nombre):
    return f'Hola {nombre}'

print(saluda('Platzinautas'))

print(isinstance(num,object))
print(isinstance(num2,object))
print(isinstance(palabra,object))
print(isinstance(saluda(''),object))
Hola Platzinautas
True
True
True
True

un poco sobre lamda lamda

Incredible jamas imagine que python fuera tan potente siempre utilice otros lenguajes por que nunca me intereso aprender este lenguaje ahora veo que estuve muy mal por mucho tiempo.

En el ejemplo de 鈥淎rgumentos de otras funciones鈥 le falta return resultados.
El c贸digo quedar铆a as铆:

def aplicar_operacion(f, numeros):
    resultados = []
    for numero in numeros:
        resultado = f(numero)
        resultados.append(resultado)
    return resultados
  • Nos ayudan con el principio DRY (Don鈥檛 Repeat Yourself).

En Python todo es un objeto, incluyendo las funciones,

  1. Funciones recibiendo par谩metros.
  2. Funciones pasadas como par谩metros a otras funciones.
  3. Funciones siendo Objetos dentro de una lista (Nuevo para mi).
  4. Funciones est谩ticas.
  5. Para entender lo anterior hay que echar mano de la Abstracci贸n.

En resumen si lo imaginas lo puedes aplicar, los limites est谩n en tu mente.

Se hacen muy legibles los c贸digos adem谩s de que se optimiza much铆simo espacio.

驴Funciones lambda?
Son funciones an贸nimas es decir que se llaman, regresan algo y despu茅s desaparecen.
.
Su sintaxis empieza con la palabra reservada lambda seguidamente un espacio y luego los par谩metros separados por coma que queremos enviar a la funci贸n despu茅s del 煤ltimo par谩metro escribimos dos puntos en se帽al de que vamos a escribir el c贸digo que queremos que la funci贸n ejecute, es importante saber que este c贸digo debe ser de una l铆nea, no podemos usar por ejemplo condicionales if o loops.
Ejemplo:

lista = [10, 11, 9, 8, 17, 19]

var = (reduce(lambda a,b: a+b, notas))

print (var)

>>> 79

La funci贸n reduce() utiliza una funci贸n que le pasamos como par谩metro y la aplica de forma recursiva sobre los elementos de un objeto iterable para devolver un 煤nico valor, por ejemplo en el c贸digo de arriba sumamos cada uno de los n煤meros de la lista utilizando la funci贸n lambda y despu茅s imprimimos el resultado. Este es uno de los puntos donde es 煤til la funci贸n lambda ya que no es necesario hacer una definici贸n con la palabra def si no que se define en una l铆nea, se ejecuta y muere. Es importante aclarar que la funci贸n reduce no esta disponible en las versiones de python 3.*

Me parece interesante como tienen este curso, hay cosas que los otros dos cursos no tienen, pero siguen explicando lo mismo de Python, por eso recomiendo, que se vean los otros 2 cursos de Python para entender todo bien.

en esta funcion falto colocar el return resultado

def aplicar_operacion(f, numeros):
    resultados = []
    for numero in numeros:
        resultado = f(numero)
        resultados.append(resultado)
    
    return resultados

muy interesante este feature de python muy valioso

Comparto este blog que nos ayuda a comprender un poco mas la utilizaci贸n del string f鈥

le quiero dar las gracias al equipo de platzi estoy entendiendo muy rapido lo que explican han hecho un gran trabajo, personalmente mi maestra de programaci贸n en la uni me humillo mucho pens茅 que programaci贸n era algo inalcanzable y de la publicaci贸n se me ocurre un modelo predictivo para alg煤n hospital basado en la secuenciaci贸n del perfil gen茅tico de una persona y tener diagn贸sticos mas certeros

https://realpython.com/python-lambda/#first-example
Les comparto un link que me ayudo m谩s a entender lambda

Se puede alterar una lista sin necesidad de crear una funci贸n, Python ya nos da esta herramienta (la funci贸n map):

nums = [1, 2, 3, 4, 5]
print(list(map(lambda x: x*2, nums)))

Pru茅benlo uds mismos 馃槃

Abren la posibilidad a realizar cosas loquis铆mas. Qu茅 interesante!!

Por ah铆 encontr茅 una manera de aplicar fibonacci usando lambda y recursividad 馃憖:

fibonacci = lambda x: 1 if x <= 2 else fibonacci(x-1) + fibonacci(x-2)
print(fibonacci(int(input('Ingrese un numero: '))))

No se cuantos niveles permite Python para anidar funciones (llamar una dentro de otra) pero sin duda es una caracter铆stica que lo hace muy poderoso y flexible. Se puede tener un 鈥渂anco鈥 de funciones de prop贸sito general y con esto se ahorra tiempo en desarrollo.

Hasta donde he visto las funciones no solo ayudan a ahorrar l铆neas de c贸digo, tambi茅n ayudan a hacer la abstracci贸n de un problema y con ello facilitan la soluci贸n. Son una herramienta poderosa pero que hay que utilizar muy bien.

La definici贸n y utilizaci贸n de funciones (incluidas las externas de un paquete o las que vienen incluidas en Python) es una de las partes mas importantes para lograr implementar c贸digos grandes y complicados. No me imagino implementando algo grande con solo la completes de Turing 馃槅

Basicamente estas capacidades nos permiten a reutilizar, m谩s f谩cil, crear programas m谩s din谩micos, y modulares.

Modulares porque creamos soluciones que encapsulamos en una funcion
Dinamicos porque usamos el input de una funcion como input de otra complementadose
Reutilizables porque esa es la esencia de las funciones.

Estas capacidades ayudan a que pueda escribir menos l铆neas de c贸digo, tal vez mejorar la eficiencia de los algoritmos y de nuevo es un lenguaje que ayuda bastante al programador permitiendole este tipo de acciones!

Las ventajas que yo aprecio es que te permite simplificar el c贸digo, escribir menos l铆neas y hacer reutilizable.

Muy 煤til esta 煤ltima parte, no ten铆a idea que las funciones se pueden aplicar con un bucle for al estar almacenadas en una lista. Excelente dato!

excelente, vamos con videitos es mejor jjajaa

No se si sea el 煤nico pero, yo aprend铆 a programar en Netbeans y de repente al ver los codigos en python siento que le hace falta sitaxis. jaja.

Hola!, alguno puede explicarme que es lo que hace operacion(num)?, gracias

me parecio interesante lo de las funciones en estructuras de datos , no lo habia visto antes

Es muy aprecido a las arrow functions

No repetir c贸digo

funciones como argumento de otras funciones鈥 mi cerebro empieza a tener un lapsus mensus 馃槂

El comando lambda me pareci贸 muy interesante, me dio a entender que es como una funci贸n pero para una sola operaci贸n

Las estructuras de datos si que parece un poco lioso. Tal vez si pueden poner otro ejemplo

Excelente

Me surge una duda, si todo en Python son objetos, entonces al utilizar las funciones como par谩metro es como estar haciendo inyecci贸n de dependencias?

Me resulta muy interesante sobre la aplicaci贸n de funciones.

Me gust贸 mucho esta info, ya que amplia, a煤n m谩s, las posibilidades que tienen las funciones.
:3

La funci贸n Lambda tiene bastante potencial, por ejemplo en la creaci贸n de funciones an贸nimas, les dejo el link de una buena explicaci贸n
https://www.w3schools.com/python/python_lambda.asp

En el apartado de Argumentos de otras funciones falta agregarle un return resultados para que se ejecute de la misma forma en que se visualiza lineas abajo.

Muy clara esta explicaci贸n.

Importante incluir el return para los que lo realizan en vsc (ya que el primer ejemplo lo omite)

Facilita la conversion de unidades:

Excelente aporte. Esto facilita demasiado la resoluci贸n de problema, simplificar el codigo y hacer m谩s cosas.

Es evidente que la capacidad de Python de contar con funciones tan vers谩tiles, ayuda a poder tenerlas en librer铆as y solo invocarlas de acuerdo a los argumentos que cada una requiera. De esta manera el c贸digo que se escribe es m谩s corto, m谩s claro. Si a esto, se documenta clara y concretamente, cualquier programador puede dar mantenimiento al programa.

Vengo de estudiar esto en C, en python es relativamente mas facil, aunque nada comparado a poder entender como es que funciona por debajo todo esto, quitandole la abstraccion

Otra cosa, el primer ejemplo no retorna, y magicamente al final entrega el resultado cuando se le solicita

Hola, tengo una inquietud con el funcionamiento del .append y de como se puede reconocer 鈥渙peracion鈥 (煤ltimo ejemplo) si no se defini贸 en otra parte, o es ah铆 donde se define? agradezco a quien me pueda ilustrar por favor.

La capacidad de utilizar funciones como objetos, nos puede permitir una mejor estructuraci贸n y modulaci贸n de los programas, permitiendo esto una mayor eficiencia al momento de escribir c贸digo.

Imagino que los programas ser铆an mas escalables, de f谩cil mantenimiento, evitaria la repetici贸n de c贸digo, nos permitir铆a aplicar estandares de codificaci贸n y facilitaria la aplicaci贸n de Arquitecturas de Software.

Este tipo de abstracciones pueden ayudar a reducir l铆neas de c贸digo. Me imagino por ejemplo la soluci贸n de una regresi贸n lineal por el m茅todo de M铆nimos Cuadrados Ordinarios. En la soluci贸n del problema de optimizaci贸n se dan dos funciones: una calcula la inversa de una matriz y otra puede hacer la multiplicaci贸n de esa inversa con las otras matrices que hacen parte de la ecuaci贸n para obtener el vector de coeficientes. Todo esto en pocos pasos.

Esta lecci贸n me ayudo mucho a comprender mejor las funciones, algo que no hab铆a comprendido era la parte del return, pero leyendo esta informaci贸n y practicando con el c贸digo he logrado comprenderlo mejor y entender el uso de las funciones como objetos, esto abre muchas posibilidades a la hora de programar.

Estos tipos de funciones que tiene Python son muy buenos, ya que ayudan bastante a reducir las lineas de codigo de nuestro programa. Por ejemplo la funcion lambda ayuda bastante.

La pr谩ctica har谩 al maestro, talvez por ahora no podremos leer bien el codigo como quisieramos, pero siento que con el paso a paso se logr谩 una mayor comprensi贸n. Muy buenas clases, me gustaria que el maestro adjuntara algunos ejemplos m谩s que seg煤n su criterio nos puedan ayudar a seguir entendiendo.

Sin conocer otros lenguajes, si consideramos estas opciones, podriamos probar nuestros codigos ya creados con mas agilidad, ayudandonos a determinar cual capa descartar o cual mejorar.

Me sorprendi贸 saber que las funciones puden ser almacenadas en las estructuras de datos ya estudiadas. muchas gracias por compartirlo, esto fue muy enriquecedor.

Las funciones son tan vers谩tiles y dan un mont贸n de ideas para mejorar y simplificar el c贸digo, estoy muy emocionado por comenzar a practicar y usarlas!

Por lo visto hasta ahora y por lo que vamos a ver鈥
.

#En el primer ejemplo falt贸 la l铆nea " return resultados"

def multiplicar_por_dos(n):
return n*2
def sumar_dos(n):
return n+2
def aplicar_operacion (funcion,numeros):
resultados=[]
for numero in numeros:
resultado=funcion(numero)
resultados.append(resultado)
return resultados

arreglo=[1,2,3]
numero= aplicar_operacion (sumar_dos,arreglo)
print(numero)

Viniendo de un mundo Java, Python es como un jard铆n de juegos sin reglas. Creo que me divertir茅 mucho con este lenguaje.

_Por cierto. _
abs() funci贸n interna de Python que retorna el valor absoluto

Interesante el keyword lambda

Puedo tener esto:

x = lambda a,n : a * n

print(x(2,11))
print(x(3,11))

Pero tambi茅n puedo tener:

def genera_lambda(n):
  return lambda a : a * n


duplicar = genera_lambda(2)
tiplicar = genera_lambda(3)

print(duplicar(11))
print(tiplicar(11))

I want to share this blog with the same definition of function as objects but in english.

One of the most powerful features of Python is that everything is an object, including functions. Functions in Python are first-class objects.
https://medium.com/python-pandemonium/function-as-objects-in-python-d5215e6d1b0d

Palabra reservada **Lambda**: Sirve para crear funciones an贸nimas, como su nombre indica es una funci贸n sin nombre.
En Python podemos ejecutar una funci贸n sin definirla con la palabra reservada **def**. Son similares pero con una diferencia fundamental:
El contenido de una funci贸n **lambda** debe ser una 煤nica expresi贸n en lugar de un bloque de acciones.

Que lenguaje tan poderoso. Esa funcion lambda es genial.

def multiplicar_por_dos(n):
    return n * 2

def sumar_dos(n):
    return n + 2

def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)    

def aplicar_operacion(f, numeros):
    resultados = []
    for numero in numeros:
        resultado = f(numero)
        resultados.append(resultado)
    return resultados

nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]

print('multiplicar por 2')
print(nums)
print(aplicar_operacion(multiplicar_por_dos, nums))
print(' ')

print('sumar 2')
print(nums)
print(aplicar_operacion(sumar_dos, nums))
print(' ')

print('factorial')
print(nums)
print(aplicar_operacion(factorial, nums))
print(' ')



print('funcion como expresion')
sumar = lambda x, y: x + y
print(sumar(2, 3))
print(' ')




def aplicar_operaciones(num):
    operaciones = [abs, float, factorial]

    resultado = []
    for operacion in operaciones:
        resultado.append(operacion(num))

    return resultado

print('funcion como parte de una estructura de datos: abs, float, factorial')
print(aplicar_operaciones(7))
print(' ')

Podemos reducir el tiempo de computo y obtner resultados de manera mas agil y rapida.

Cu谩ndo entendemos el objetivo que queremos lograr con el programa, e identificamos todos los objetos que intervienen en el sistema, podremos definirlos y utilizar este c贸digo en m谩s partes del sistema. De esta manera ponemos en pr谩ctica 鈥淒ivide y vencer谩s鈥, haciendo mas est茅tico, f谩cil y m谩s entendible el c贸digo establecido.