Continuando con el tema de las funciones en Python, voy a mostrarte hoy una técnica interesante que permite facilitar argumentos por defecto a una función. Veamos qué significa esto.
En capítulos anteriores vimos el uso de argumentos en las funciones. Recuerda la función praderazo(), que mostraba un texto detérminado repetidas veces y enmarcado por un símbolo a elegir.
Su definición era la siguiente:
def praderazo(veces,simbolo):
print(simbolo*42)
for n in range(veces):
print(simbolo,'La casa de la pradera, pedazo serie...',simbolo)
print(simbolo*42)
veces y simbolo son los argumentos de la función. Ejemplos de invocación posibles podrían ser:
>>>praderazo(5,'+')
o
>>>praderazo(100,'&')
La función, para ser invocada correctamente, necesita forzosamente dos argumentos. Decimos que veces y simbolo son argumentos requeridos.
Esta llamada generaría un error, como podemos comprobar:
>>> praderazo(5)
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
praderazo(5)
TypeError: praderazo() takes exactly 2 arguments (1 given)
Lo que nos dice el mensaje de error es que praderazo() requiere exactamente dos argumentos y sólo uno ha sido facilitado.
Observa ahora esta nueva definición de praderazo():
def praderazo(veces,simbolo='+'):
print(simbolo*42)
for n in range(veces):
print(simbolo,'La casa de la pradera, pedazo serie...',simbolo)
print(simbolo*42)
Fíjate en como está descrito el argumento simbolo, especificando directamente un valor.
Decimos que simbolo es un argumento por defecto y el valor especificado es el valor que tomará por defecto en caso de que no se facilite uno concreto.
Ya no es necesario especificar el segundo argumento, si no queremos. En caso de que no lo hagamos, simbolo tomará el valor por defecto (el signo ‘+’).
>>> praderazo(5)
++++++++++++++++++++++++++++++++++++++++++
+ La casa de la pradera, pedazo serie... +
+ La casa de la pradera, pedazo serie... +
+ La casa de la pradera, pedazo serie... +
+ La casa de la pradera, pedazo serie... +
+ La casa de la pradera, pedazo serie... +
++++++++++++++++++++++++++++++++++++++++++
Si no queremos usar el valor por defecto, hay que recurrir a la especificación completa:
>>> praderazo(3,'%')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% La casa de la pradera, pedazo serie... %
% La casa de la pradera, pedazo serie... %
% La casa de la pradera, pedazo serie... %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Es importante tener en cuenta que los argumentos por defecto deben figurar siempre después de los requeridos, y nunca antes. Supongamos que hubiéramos querido dejar por defecto veces y requerido simbolo:
>>> def praderazo(veces=5,simbolo):
print(simbolo*42)
for n in range(veces):
print(simbolo,'La casa de la pradera, pedazo serie...',simbolo)
print(simbolo*42)
SyntaxError: non-default argument follows default argument
Obtendríamos un error sintáctico reflejando que hay argumentos que no son por defecto después de los que sí lo son. Si no fuera así Python podría liarse a la hora de saber qué argumentos son unos u otros.
La definición correcta habría sido:
>>> def praderazo(simbolo,veces=5):
print(simbolo*42)
for n in range(veces):
print(simbolo,'La casa de la pradera, pedazo serie...',simbolo)
print(simbolo*42)
Veamos un nuevo ejemplo:
>>> def mifuncion(a,b=2,c=3):
print(a+b+c)
Toma tres parámetros y calcula la suma de ellos. Si no especificamos ni b ni c tomará sus valores por defecto.
Invoquemos a la función de diversas maneras:
>>> mifuncion(4,5,6)
15
>>> mifuncion(6,4)
13
En este segundo ejemplo, los dos primeros argumentos corresponden a a y a b. Como no hemos especificado c, toma su valor por defecto.
>>> mifuncion(5)
10
Aquí hemos indicado sólo a, el único que es requerido. Los demás argumentos toman sus valores por defecto.
Para concluir, te propongo un ejercicio: adapta la función praderazo() para que el texto a enmarcar sea elegible por el usuario como argumento.
Pista: recuerda la función len(), que determina la longitud de una cadena.
Javier Montero
El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)
El Club del Autodidacta
Buenas,
Realizando el ejercicio, me ha parecido sencillo o es que estoy equivocado. Lo que he hecho insertar una variable para el texto, el cual recibirá como parámetro, se multiplica el símbolo con len(variable), y al final el usuario tiene que insertar dos argumentos, el segundo será el string a repetir.
Esto es correcto? Hice otro pero con un input dentro de la función, pero no cumple los requerisitos.
Saludos.
Exacto, eso es…
El input debe quedar fuera de la función y recoger el string que luego será pasado como parámetro a la función.
Ok, entonces ahora si todo esta correcto.
Saludos.
Muchas gracias por el reporte muy buen explicado
Estoy escribiendo desde PYthon capítulo 27. Yo también soy novato. La pregunta es : ¿por qué hay que poner print (símbolo*42) en la definición y por qué dos veces?. Gracias
Qué tal:
Esos print son simplemente para definir un marco estético que contenga las frases repetidas. Hay uno arriba y otro debajo. Entre medias quedan las frases.
Saludos
Lo hice así, ¿esta bien?, apenas estoy empezando y me considero bastante novato:
textoenmarco=input(‘Introduce el texto a enmarcar: ‘)
def praderazo(veces,simbolo):
print(simbolo*42)
for n in range(veces):
print(simbolo,textoenmarco ,simbolo)
print(simbolo*42)
praderazo(5,’+’)
var = input(‘inserte su frase: ‘)
def praderazo(simbolo,veces):
print(simbolo*42)
for n in range(veces):
print(simbolo,var,simbolo)
print(simbolo*42)
Para qué serviría la pista sobre la función len()? No me quedó claro cómo se usaría en el ejercicio.