Defining Functions
Hasta ahora, hemos estado viendo técnicas comunes para controlar el flujo del código, lo que nos permite construir herramientas simples, por ejemplo, contadores o incluso un enriquecedor de wordlists. Por ejemplo: para cada palabra en la wordlist, primero establece el counter en 0, mientras el counter sea menor que 100, imprime la palabra y el counter e incrementa el counter en 1. Como referencia, esto podría verse algo así:
Password Generator Example
wordlist = ['password', 'john', 'qwerty', 'admin']
for word in wordlist:
counter = 0
while counter < 100:
print(f'{word}{counter}')
counter = counter + 1
En este caso, el for-loop repite el loop hasta que haya procesado todas las entradas de la lista. Como se muestra, incluso con bloques de construcción simples, podemos lograr mucho. Hablemos sobre el siguiente bloque de construcción importante en el software: Functions
Functions
Las functions nos permiten definir bloques de código que realizan una variedad de acciones, producen una variedad de valores y opcionalmente devuelven uno o más de estos valores. Al igual que en matemáticas, donde f(x)
es una function f de x
y produce el mismo resultado cuando se le da la misma entrada. Por ejemplo, f(x) = x + 1
es una función f
de x
que devuelve x + 1
. Así, f(2)
sería 3
, porque f(2) = 2 + 1
, lo que es 3
.
De manera similar, en Python, podemos definir y llamar functions para reutilizar código y trabajar con nuestros datos de manera más eficiente, ya que no necesitamos reinventar la rueda todo el tiempo. Podemos definir functions en Python en su forma más simple muy fácilmente.
Aquí hay un ejemplo de definición de f(x) = 2 * x + 5
como una función en Python:
First Function
def f(x):
return 2 * x + 5
Además de la sintaxis (esencial) con indentación en el inner scope
de la función - el código dentro de la función - lo importante aquí es notar las palabras clave def
y return
. La palabra clave def
es cómo definimos functions en Python. Después de def
viene el nombre de la función (escrito en snake_case), los parámetros de entrada dentro de los paréntesis y dos puntos. Esta primera línea de una función se llama el signature
de la función. Después de haber escrito un par de funciones diferentes, podemos diferenciarlas simplemente mirando sus nombres y los argumentos que aceptan. Podemos diferenciarlas comparando sus function signatures.
Creemos una función para calcular y devolver un valor elevado a la potencia de otro valor:
Power_Of Function
def power_of(x, exponent):
return x ** exponent
En Python, los símbolos **
significan "potencia de". Si llamamos a power_of(4, 2)
, obtendremos cuatro elevado a la potencia de dos o simplemente cuatro al cuadrado. Ahora, ¿dónde termina este resultado? Terminará en uno de dos lugares, dependiendo de lo que hagamos: 1) el vacío de la nada, 2) una variable. Considera este ejemplo:
Function Call
def power_of(x, exponent):
return x ** exponent
power_of(4, 2) # La función se ejecutó, pero nadie capturó el valor devuelto.
ocho = power_of(2, 3) # La variable "ocho" ahora es igual a dos elevado a la potencia de tres.
¿Entonces la primera forma es inútil? No. Al igual que con la entrada/salida de un terminal, podemos "canalizar" la salida de la función como entrada para otra. Podemos usar el resultado de llamar a una función como entrada para otra. Por ejemplo:
print('My favourite number is:')
print(power_of(4, 2))
Aquí estamos llamando a la función print
y dándole primero una cadena como entrada, y luego, le estamos dando el resultado
de otra llamada a función. En el runtime
, durante la ejecución real del script, Python primero ejecutará la primera línea y luego irá a la segunda línea y ejecutará los comandos desde adentro hacia afuera. En otras palabras, comenzará calculando power_of(4, 2)
y luego usará este resultado como entrada para la función print
.
Ahora que conocemos los conceptos básicos de la definición y uso de functions, agreguemos más bloques de construcción a nuestro arsenal de herramientas de código: Classes