Funciones como objetos

20/31

Lectura

Una de las características más poderosas de Python es que todo es un objeto, incluyendo las funciones. Las funciones en Python son "ciudadanos de primera clase".

...

Regístrate o inicia sesión para leer el resto del contenido.

Aportes 233

Preguntas 6

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

¿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:

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.

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?

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

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 “callback” 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))

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))

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()

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 “operacion(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.

Pregunta, ¿para que sirve el .append?

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

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:

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?

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.

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.

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.

Perdón, qué quiere decir resultado = [] ??

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!")

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 “Argumentos 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")```

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

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

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()

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.

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.

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))

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.

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))

¿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.*

Facilita la conversion de unidades:

Se hacen muy legibles los códigos además de que se optimiza muchísimo espacio.

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

En el ejemplo de “Argumentos 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

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.

muy interesante este feature de python muy valioso

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

  • Nos ayudan con el principio DRY (Don’t Repeat Yourself).

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

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: '))))

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

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.

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

Muy clara esta explicación.

excelente, vamos con videitos es mejor jjajaa

Me esta gustando este acercamiento a python y como permite escribir código que se entiende rápidamente, pero me queda una duda con el tema de las funciones ¿cuándo declaro una función en un programa y no la llamo se ejecuta o no se ejecuta esa parte del código? Es que en todos los ejemplos anteriores las funciones se van llamando entre ellas y me queda la duda de si siempre debe ser así. Gracias de antemano por cualquier claridad brindada al respecto.

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.

Mi comparación:

#My comparison
addition = lambda x, y: x + y
print(addition(int(input("\tType a number: ")),int(input("\n\tType a number: "))))
#------
def addition2():
	x, y = int(input("Type a number: ")), int(input("Type a number: "))
	return x + y

print(addition2())
Type a number: 4

	Type a number: 5
9
Type a number: 2
Type a number: 3
5

Excelente

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

#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)

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.

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.

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

No repetir código

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.

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!

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

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

Es un tema muy interesante, me gusto mucho.
Muy bien explicado, esto abre las puertas a muchas posibilidades, intentare aplicarlo de ahora en adelante a mis
programas.

Es increíble la gran cantidad de aplicaciones que esta herramienta puede realizar, el ultimo ejemplo me voló la cabeza.

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.

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

funciones como argumento de otras funciones… mi cerebro empieza a tener un lapsus mensus 😃

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

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!

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.

Hola, tengo una inquietud con el funcionamiento del .append y de como se puede reconocer “operacion” (último ejemplo) si no se definió en otra parte, o es ahí donde se define? agradezco a quien me pueda ilustrar por favor.

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.

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

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.

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.

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

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(' ')

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 “Divide y vencerás”, haciendo mas estético, fácil y más entendible el código establecido.

Espero los siguientes cursos para aplicar todo lo aprendido!

Antes no entendia bien lo de la función lambda, pero ya me ha quedado mucho más claro. Grande el profe David

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

Es muy aprecido a las arrow functions

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.

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

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.

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!

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

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 😆

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 “banco” de funciones de propósito general y con esto se ahorra tiempo en desarrollo.

Por ejemplo, a mí esta capacidad de Python en mi carrera de data science, me sirve para crear funciones generales para dataframes y no tener que reescribir todo el código y compartirlo más fácil.

Como dice el profe lo importante es el concepto 🐧 practicando es como se entiende mejor.

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 gustó mucho esta info, ya que amplia, aún más, las posibilidades que tienen las funciones.
:3

Tengo una duda: ¿Por qué al realizar los programas aquí propuestos en mi editor de texto, no me arroja los resultados?. ¿Cuál es la diferencia entre el IDLE de Python y un editor de texto?.¿Por qué el profesor algunas cosas las hace enel IDLE y otras en el editor?. Gracias, agradezco su colaboración

Esto es la caja de pandora, empieza a haber combinaciones y ya todo es tu creatividad en resolver el problema que te enfrentas

este método de codigo es mas compacto por lo que se pueden generar mas funciones en un espacio reducido haciendo más legible y entendible el código, además que se puede generarilzar en una función encapsulando muchas operaciones accediendo de acuerdo al índice de acuerdo a las necesidades del algoritmo

concepto muy poderoso. En javascript yo lo habia visto como callbacks y son bastante utilizados.

Me ayudo a poder hacer esta función para los números de fibonacci junto con listas:

def fibonacci(i):
    if i <= 0:
        return 'Error, ingresa un número mayor a 0'
    elif i == 1:
        return 0
    fibNum = [0, 1]
    for number in range(2,i):
        fibNum.append(fibNum[number-1]+fibNum[number-2])
    return fibNum[-1]

De requerir la lista en su totalidad, borrar el [-1] final que nos permite visualizar solamente el ultimo elemento de la lista.