Mas sobre parametros
Contents
Las funciones pueden o no recibir parámetros, ya dijimos que los parámetros pueden tener cualquier tipo, que pasa sí tenemos una función que podría aceptar parámetros opcionales?. Los parámetros opcionales son parámetros que tienen un valor “predefinido” en caso de que el usuario no los introduzca se usa el valor por defecto.
def registra_envio(nombre, dirección, telefono, correoe=""): # Realiza proceso de registro de datos if correoe: # Registra el correo electrónico # Envia correo de confirmación
Como podemos ver, correoe
es un parámetro opcional, el cual es revisado en la función y si tiene valor entonces se usa para el registro y envío de correo de confirmación.
Aceptando un numero infinito de parametros
Algunas funciones pueden aceptar un numero “infinito” de parámetros. Aunque en realidad tendrán un numero finito porque.. vaya, el chiste es que el código sea legible, pero en Python se puede.
Para estro haremos uso de un par de operadores en parámetros, el operador *
y **
.
El primero (*
) nos permite aceptar una cantidad infinita de parámetros por posición, por ejemplo:
def sum(*prods): result = 0 for i in prods: result += i return result
En esta función aceptamos N numero de argumentos por posición y luego los sumamos, mandar llamar la función seria algo asi:
>>> print sum(1,2,3,4,5,6,7,8,9) 45
prods
en la función ser vería así: [1,2,3,4,5,6,7,8,9]. Esto se me hace conocido… es la misma sintaxis de una lista. Entonces *prods
es una lista!, por eso es que puedo iterar en la lista de parámetros (for i in prods
), esto nos permite también operar en los parámetros como lo haríamos con una lista, podemos agregar, quitar o modificar los valores.
Nota, por convención el nombre de la variable que va despues de ” *
” se denomina args
El segundo operador (**
) es técnicamente lo mismo, pero, para parámetros por nombre.
>>> def por_nombre(**items): ... print items ... >>> por_nombre(nombre="Marco", apellido="Islas", lenguaje="Python") {'nombre': 'Marco', 'lenguaje': 'Python', 'apellido': 'Islas'}
Como podemos ver, items
es un diccionario, entonces, esto porque las variables van por nombre y nos interesa saber el nombre de cada variable. Así como con *args
podemos modificarlo a gusto.
Usando ambos
Nada nos impide que en una función tengamos parámetros por posición y por nombre. Podemos tener algo asi:
def mifuncion(*args, **kwargs):
Dentro de la función trataremos a *args
y **kwargs
como queramos. Ojo, hay un protocolo para llamar una función y pasar parámetros por posición y por nombre.
You must be logged in to take the quiz.