Funciones en Python

Iniciado por Sajuuk, Mayo 19, 2015, 02:55:19 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Mayo 19, 2015, 02:55:19 PM Ultima modificación: Mayo 19, 2015, 10:24:00 PM por Barlan





CitarEn programación, una función es un grupo de instrucciones con un objetivo en particular y que se ejecuta al ser llamada desde otra función o procedimiento.




Comenzamos escribiendo la palabra clave def, seguido de un nombre descriptivo (que al momento de leerlo, sepas qué es lo que hará). Luego, se abren y cierran paréntesis, y dentro de ellas podemos colocar parámetros (variables) que el algoritmo (el bloque de código que contendrá la función) usará. Si la función no requiere que se le pasen variables, se puede dejar vacio.
Al final, escribimos los dos puntos ( : )

Código: python

def nombre(parametro1, parametro2, ..., parametron):
algoritmo(s)





La función creada no servirá de nada hasta que se le llame. Para esto, simplemente escribimos su nombre:
Código: python

def nombre():
print("Hola")

nombre() #Llamamos la función escribiendo su nombre





Una función puede retornar datos, para esto, se usa la palabra return, seguido de lo que se desea retornar. Además, podemos designar el retorno de datos a una variable:
Código: python

def funcion():
    return "Hola Mundo"

frase = funcion()
print(frase)





Podemos esperar un numero desconocido de variables en una función (como muchos nombres, por ejemplo), así que al momento de pasar esos datos a la función, hacemos lo siguiente:
Código: python

def recorrer_parametros_arbitrarios(parametro_fijo, *arbitrarios):
    print(parametro_fijo)

    # Los parámetros arbitrarios se recorren como tuplas
    for argumento in arbitrarios:
        print(argumento)

recorrer_parametros_arbitrarios('Fijo', 'arbitrario 1', 'arbitrario 2', 'arbitrario 3')


Como podemos ver, tenemos una variable fija (de la cual sabemos de antemano que será enviada), pero también tenemos algo entre los paréntesis: *arbitrarios.
Ella nos dice que se están esperando un numero desconocido de variables, y al momento de recibirlas, podemos recorrerlas como si fueran una tupla, imprimiendo cada valor.




Siempre deben de pasarse variables en el orden que la función lo requiera.
Por ejemplo, una función requiere 2 variables tipo string, pero cada una será usada en una operación de condicional.
Código: python

def saludo(idioma, saludo):
    if idioma == "es":
        print("Idioma: Espanol\nSaludo: %s" % saludo)
    if idioma == "en":
        print("Languaje: English\nRegard: %s" % saludo)

saludo("es", "Hola!")


Primero pasamos el tipo de idioma a usar. Si el idioma que seleccionamos es "es" (Español), nos mostrará un output en Español saludandonos.
Pero si le pasabamos un "en" (Inglés) nos mostrará un output en Inglés.

Si nosotros pasaramos el saludo primero en lugar del idioma que queremos... osea:
Código: python

saludo("Hola", "es")


No nos mostraría nada, ya que en la función, establecimos que la primera variable sería el idioma, y no el saludo. Así que las condicionales serían falsas.



Podemos definir parametros en los mismos paréntesis, reduciendo la cantidad de variables que se esperan
OJO: Siempre deben de colocarse primero las variables que serán enviadas a la función, seguidas de las variables que definiremos en el mismo paréntesis:
Código: python

def saludo(saludo, idioma="Espanol"):
    print("Un saludo en el idioma %s: %s" % (idioma, saludo))

saludo("Hola amigos!")

CitarUn saludo en el idioma Espanol: Hola amigos!




De igual manera, podemos definir las variables al momento de pasarlas a la función:
Código: python

def hola(saludo):
    print(saludo)

hola(saludo="Hola amigos!")





Tenemos la opción de definir varios parametros al momento de enviarlas a la función (como los arbitrarios). Para esto, necesitamos colocar **kwords en los paréntesis (en lugar de un solo asterisco, ahora usamos 2 asteriscos para diferenciar entre "tuplas", y "diccionarios".
kwords = Keywords (clave=valor)
Código: python

def idiomas(**kwords):
    for idioma in kwords:
        print(idioma + " : " + kwords[idioma]) # Como podemos ver, concatenamos cada idioma con su valor.

idiomas(espanol="Hola", ingles="Hi!", japones="Konnichiwa")


Citar
espanol : Hola
ingles : Hi!
japones : Konnichiwa




Habrá ocasiones en las que una función espere una cantidad fija de variables, pero nosotros queremos enviar una tupla que contiene datos para el algoritmo de la función.
Para ello, se toma la variable a enviar, y se le envía usando un asterisco. La función sabrá que queremos enviarle una tupla, y dividirá los datos para asignarselos a cada variable.
Código: python

def calcular(base, altura):
    return base * altura

datos = [35, 10]
print(calcular(*datos))   # Nos dará como resultado 35*10, osea: 350





También, puede que en lugar de tupla, querramos enviar un diccionario con los datos a utilizar. Para esto, en lugar de *, usaremos **:
Código: python

def calcular(base, altura):
    return base * altura

datos = {
    "base": 50,
    "altura": 17
}
print(calcular(**datos))


Citar850




Llamadas recursivas

Las llamadas recursivas ocurren cuando dentro de una función llamamos a la misma funcion, haciendo que esta se vuelva a ejecutar.
Esto es útil cuando, por ejemplo, hacemos un juego donde tengamos n intentos, y si nos equivocamos, volver a comenzar.

El problema con estas llamadas, es que son fáciles de caer en bucles infinitos, por lo que solo se recomienda su uso cuando ya no hay alguna otra alternativa.

Ejemplo de una llamada:
Código: python

def jugar(intento=1):
    respuesta = str(input("¿De qué color es una naranja? "))
    if respuesta != "naranja":
        if intento < 3:
            print ("\nFallaste! Inténtalo de nuevo")
            intento += 1
            jugar(intento) # Llamada recursiva
        else:
            print ("\nPerdiste!")
    else:
        print ("\nGanaste!")
jugar()




Algunos otros ejemplos de funciones:



Código: python

def escaner(*ports):
    for valor in ports:   # Leemos los valores de la tupla ports
        for port in valor:   # Por cada valor encontrado...
            print("[*] Scanning port: " + str(port))

ports = [22, 23, 999, 1024, 9999, 10234, 20302]
escaner(ports)


Resultado:
Citar
  • Scanning port: 22
  • Scanning port: 23
  • Scanning port: 999
  • Scanning port: 1024
  • Scanning port: 9999
  • Scanning port: 10234
  • Scanning port: 20302



Código: python

def diccionario(**kwords):
    for servicio in kwords:
        print("Escaneando " + servicio + " en puerto: " + kwords[servicio])
servicios = {
    "SSH": "22",
    "Telnet": "23",
    "SMTP": "25",
    "HTTP": "80",
    "IMAP": "143"
}
diccionario(**servicios)


Resultado:
Citar
Escaneando IMAP en puerto: 143
Escaneando SMTP en puerto: 25
Escaneando Telnet en puerto: 23
Escaneando SSH en puerto: 22
Escaneando HTTP en puerto: 80



Ya saben, si encuentran un error, o desean criticar el post abajo en los comentarios pueden hacerlo.
Saludos!


Muy bueno Barlan! Me parece genial que colabores con estos aportes.
+1. Seguí así!

Saludos!
WhiZ



Muy bien detallado! Me sirvió mucho, gracias!