Ir al contenido
wannacode

Funciones

En resumen: Una función es un bloque de código con nombre que hace un solo trabajo: la escribes una vez y la llamas por su nombre tantas veces como necesites.

Problema

Un cambio, tres lugares

Estás escribiendo el programa de la caja de una tienda pequeña. Cada recibo empieza con el nombre de la tienda y su teléfono. Por eso has copiado esas dos líneas en todos los lugares donde se imprime un recibo.

La tienda cambia de teléfono. Lo corriges en dos lugares y se te pasa el tercero:

print("Tienda del barrio")
print("tel. 02 123 4567")
print("Pan 1,20 €")
print("Tienda del barrio")
print("tel. 02 123 4567")
print("Leche 2,10 €")
print("Tienda del barrio")
print("tel. 02 765 4321")
print("Café 3,50 €")
Salida
Tienda del barrio
tel. 02 123 4567
Pan 1,20 €
Tienda del barrio
tel. 02 123 4567
Leche 2,10 €
Tienda del barrio
tel. 02 765 4321
Café 3,50 €

El tercer cliente recibe un recibo con el número viejo. Cuantas más copias hay, más fácil es que se te pase una.

La idea

Escríbelo una vez, llámalo por su nombre

Pon la parte que se repite en un solo lugar y dale un nombre. Eso es una función: un bloque de código con nombre que hace un solo trabajo.

Escribes la función una vez. Después, donde la necesites, escribes solo su nombre con paréntesis: print_header(). Esto se llama llamar a la función.

Si la tienda vuelve a cambiar de teléfono, corriges una línea en la función, y todos los recibos quedan bien.

Míralo

Qué pasa en una llamada

El programa avanza línea por línea. Cuando llega a una llamada, entra en la función, ejecuta su cuerpo y vuelve justo después de la llamada. Sigue la bolita: es el punto al que ha llegado el programa.

def print_header():
print("Tienda del barrio")
print("tel. 02 123 4567")
print_header()
print("Pan 1,20 €")
print_header()
print("Leche 2,10 €")
Paso a paso, en palabras
  1. def solo guarda la función. La primera línea que hace algo es print_header().
  2. Una llamada: la ejecución entra en la función.
  3. La función imprime la parte de arriba del recibo.
  4. Las líneas con sangría se acabaron, así que la función ha terminado: la ejecución vuelve justo después de la llamada.
  5. El programa sigue: imprime el pan.
  6. Una segunda llamada: el mismo código, sin escribirlo otra vez.
  7. La parte de arriba se imprime otra vez.
  8. De vuelta en el programa, a la línea siguiente.

La segunda vez no escribes otra vez la parte de arriba. Llamas a la misma función, y esta imprime las mismas dos líneas.

La idea

Cómo se escribe una función

Aquí está el programa entero, para que veas dónde va la función:

shop.py
def print_header():
print("Tienda del barrio")
print("tel. 02 123 4567")
print_header()
print("Pan 1,20 €")
Salida
Tienda del barrio
tel. 02 123 4567
Pan 1,20 €
def«aquí hay una función»print_headernombre()no recibe nada:sigue el cuerpo
  • def (de define, «definir») dice que sigue una función. La línea solo la guarda con un nombre; no la ejecuta.
  • El nombre dice qué hace la función. Por eso es un verbo: print_header, print_footer. En Python los nombres van en minúsculas, y las palabras se unen con guion bajo.
  • Los paréntesis vacíos significan que la función no recibe nada de fuera. Los llenaremos en la próxima lección.
  • El cuerpo son las líneas con sangría de 4 espacios después de los dos puntos. La primera línea sin sangría ya no forma parte de la función.
  • La función va encima de las líneas que la llaman. Python lee el archivo de arriba abajo y tiene que haberla visto ya.
  • Alrededor de la función hay dos líneas en blanco. El programa funciona sin ellas, pero así se escribe Python (la guía de estilo PEP 8).

Pruébalo

¿En qué orden?

¿Qué imprimirá el programa?

def print_thanks():
print("¡Gracias!")
print("Pedido n.º 1024")
print_thanks()
print("Pedido n.º 1025")
print_thanks()
Respuesta

Pruébalo

¿Qué falta?

Esta función imprime la parte de abajo del recibo. ¿Qué va en el hueco?

 print_footer():
    print("Esperamos verte pronto de nuevo.")

Pruébalo

Encuentra el error

El programa arranca, pero imprime solo «Pedido n.º 1024», sin «¡Gracias!». ¿En qué línea está el error?

Elige la línea con el error.

Ejercicio

El recibo y el triángulo

Resuelve estas tareas en tu editor. Cada una tiene una salida de ejemplo para comparar con la tuya.

1. Recibo. Escribe tres funciones:

  • print_line() imprime una línea de 20 guiones con un bucle;
  • print_header() imprime el nombre de la tienda, el teléfono y la línea;
  • print_footer() imprime la línea y «¡Gracias!».

Debajo de ellas, imprime dos recibos: la parte de arriba, una línea con una compra y la parte de abajo.

Salida de ejemplo
Tienda del barrio
tel. 02 123 4567
--------------------
Pan 1,20 €
--------------------
¡Gracias!
Tienda del barrio
tel. 02 123 4567
--------------------
Leche 2,10 €
--------------------
¡Gracias!

2. Triángulo. Escribe una función print_triangle() que, con bucles anidados, imprima un triángulo de asteriscos de 4 filas de alto:

Salida de ejemplo
*
***
*****
*******

En la próxima lección la altura será un parámetro: una sola función para un triángulo de la altura que quieras.

Test

Ponte a prueba

1. ¿Cuándo se ejecuta el código del cuerpo de una función?
2. ¿Qué hace la línea def print_thanks():?
3. Una función se llama en tres lugares. ¿Cuántas veces está escrito su código?
4. ¿Dónde tiene que estar def print_thanks(): respecto a print_thanks()?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·