Data Science para marketing

Creado por Nicolás Labbé

Funciones de Python

Una función es un bloque de código que solo se ejecuta cuando se lo llama. Puede pasar datos, conocidos como parámetros, a una función. Una función puede devolver datos como resultado.

En Python, una función se define utilizando la palabra clave def:

						
							def my_function():
							  print("Hello from a function")
						
					

Para llamar a una función, utilice el nombre de la función seguido de paréntesis:

						
							>>> def my_function():
							...   print("Hello from a function")
							... 
							>>> my_function()
							Hello from a function
						
					

Argumentos

La información se puede pasar a las funciones como argumentos.

Los argumentos se especifican después del nombre de la función, entre paréntesis. Puedes agregar tantos argumentos como quieras, simplemente separándolos con una coma.

El siguiente ejemplo tiene una función con un argumento (fname). Al llamar a la función, se pasa un nombre, que se usa dentro de la función para imprimir el nombre completo:

						
							>>> def my_function(fname):
							...   print(fname + " Refsnes")
							... 
							>>> my_function("Emil")
							Emil Refsnes
							>>> my_function("Tobias")
							Tobias Refsnes
							>>> my_function("Linus")
							Linus Refsnes
						
					
¿Parámetros o argumentos?

Los términos parámetro y argumento se pueden usar para lo mismo: información que se pasa a una función.

Desde la perspectiva de una función:

  • Un parámetro es la variable que aparece dentro de los paréntesis en la definición de la función.
  • Un argumento es el valor que se envía a la función cuando se llama.

Por defecto, una función debe llamarse con el número correcto de argumentos. Esto significa que, si la función espera dos argumentos, debe llamarse con dos argumentos, ni más ni menos.

						
							>>> def my_function(fname, lname):
							...   print(fname + " " + lname)
							... 
							>>> my_function("Emil", "Refsnes")
							Emil Refsnes
						
					

Si intenta llamar a la función con 1 o 3 argumentos, obtendrá un error:

						
							>>> def my_function(fname, lname):
							...   print(fname + " " + lname)
							... 
							>>> my_function("Emil")
							Traceback (most recent call last):
							  File "", line 1, in 
							TypeError: my_function() missing 1 required positional argument: 'lname'
						
					

Si no sabe cuántos argumentos se pasarán a su función, agregue un *antes del nombre del parámetro en la definición de la función.

De esta manera, la función recibirá una tupla de argumentos y podrá acceder a los elementos en consecuencia:

						
							def my_function(*kids):
							  print("The youngest child is " + kids[2])

							my_function("Emil", "Tobias", "Linus")
						
					

También puedes enviar argumentos con la sintaxis clave = valor.

De esta manera el orden de los argumentos no importa.

						
							>>> def my_function(child3, child2, child1):
							...   print("The youngest child is " + child3)
							... 
							>>> my_function(child1 = "Emil", child2 = "Tobias", child3 = "Linus")
							The youngest child is Linus
						
					

Si no sabe cuántos argumentos de palabras clave se pasarán a su función, agregue dos asteriscos: **antes del nombre del parámetro en la definición de la función.

De esta manera, la función recibirá un diccionario de argumentos y podrá acceder a los elementos en consecuencia:

						
							>>> def my_function(**kid):
							...   print("His last name is " + kid["lname"])
							... 
							>>> my_function(fname = "Tobias", lname = "Refsnes")
							His last name is Refsnes
						
					

El siguiente ejemplo muestra cómo utilizar un valor de parámetro predeterminado.

Si llamamos a la función sin argumentos, utiliza el valor predeterminado:

						
							>>> def my_function(country = "Norway"):
							...   print("I am from " + country)
							... 
							>>> my_function("Sweden")
							I am from Sweden
							>>> my_function("India")
							I am from India
							>>> my_function()
							I am from Norway
							>>> my_function("Brazil")
							I am from Brazil
						
					

Puede enviar cualquier tipo de datos de argumento a una función (cadena, número, lista, diccionario, etc.) y se tratará como el mismo tipo de datos dentro de la función.

Por ejemplo, si envías una lista como argumento, seguirá siendo una lista cuando llegue a la función:

						
							>>> def my_function(food):
							...   for x in food:
							...     print(x)
							... 
							>>> fruits = ["apple", "banana", "cherry"]
							>>> 
							>>> my_function(fruits)
							apple
							banana
							cherry
						
					

Para permitir que una función devuelva un valor, utilice la return declaración:

						
							>>> def my_function(x):
							...   return 5 * x
							... 
							>>> print(my_function(3))
							15
							>>> print(my_function(5))
							25
							>>> print(my_function(9))
							45
						
					

Las definiciones function no pueden estar vacías, pero si por alguna razón tienes una definición function sin contenido, ponla en la passdeclaración para evitar obtener un error.

						
							def myfunction():
							  pass
						
					

Puede especificar que una función puede tener SÓLO argumentos posicionales o SÓLO argumentos de palabras clave.

Para especificar que una función solo puede tener argumentos posicionales, agregue , / después de los argumentos:

						
							>>> def my_function(x, /):
							...   print(x)
							... 
							>>> my_function(3)
							3
						
					

Sin embargo, , /en realidad se permite usar argumentos de palabras clave incluso si la función espera argumentos posicionales:

						
							>>> def my_function(x):
							...   print(x)
							... 
							>>> my_function(x = 3)
							3
						
					

Pero al agregarlo, , / obtendrás un error si intenta enviar un argumento de palabra clave:

						
							>>> def my_function(x):
							...   print(x)
							... 
							>>> my_function(x = 3)
							3
						
					

Para especificar que una función solo puedes tener argumentos de palabras clave, agregue *, antes de los argumentos:

						
							>>> def my_function(*, x):
							...   print(x)
							... 
							>>> my_function(x = 3)
							3
						
					

Sin el, *, se permite usar argumentos posicionales incluso si la función espera argumentos de palabras clave:

						
							>>> def my_function(x):
							...   print(x)
							... 
							>>> my_function(3)
							3
						
					

Pero con esto *, obtendrás un error si intentas enviar un argumento posicional:

						
							>>> def my_function(*, x):
							...   print(x)
							... 
							>>> my_function(3)
							Traceback (most recent call last):
							  File "", line 1, in 
							TypeError: my_function() takes 0 positional arguments but 1 was given
						
					

Cualquier argumento antes de / , son solo posicionales, y cualquier argumento después de *, son solo de palabras clave.

						
							>>> def my_function(a, b, /, *, c, d):
							...   print(a + b + c + d)
							... 
							>>> my_function(5, 6, c = 7, d = 8)
							26
						
					

Python Lambda

Una función lambda es una pequeña función anónima.

Una función lambda puede tomar cualquier número de argumentos, pero solo puede tener una expresión.

Sintáxis

lambda arguments : expression

Se ejecuta la expresión y se devuelve el resultado:

						
							>>> x = lambda a : a + 10
							>>> print(x(5))
							15
						
					

Las funciones lambda pueden tomar cualquier número de argumentos:

						
							>>> x = lambda a, b : a * b
							>>> print(x(5, 6))
							30
						
					
						
							x = lambda a, b, c : a + b + c
							print(x(5, 6, 2))
						
					
¿Por qué utilizar funciones Lambda?

El poder de lambda se muestra mejor cuando se utiliza como una función anónima dentro de otra función.

Digamos que tienes una definición de función que toma un argumento y ese argumento se multiplicará por un número desconocido:

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

Utilicemos esa definición de función para crear una función que siempre duplique el número que envíe:

						
							>>> def myfunc(n):
							...   return lambda a : a * n
							... 
							>>> mydoubler = myfunc(2)
							>>> 
							>>> print(mydoubler(11))
							22
						
					

O bien, utilice la misma definición de función para crear una función que siempre triplique el número que envíe:

						
							>>> def myfunc(n):
							...   return lambda a : a * n
							... 
							>>> mytripler = myfunc(3)
							>>> 
							>>> print(mytripler(11))
							33