¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Python
  3. Funciones
Extrait - Python Aprenda a programar proyectos lúdicos
Extractos del libro
Python Aprenda a programar proyectos lúdicos Volver a la página de compra del libro

Funciones

Introducción

En este capítulo, le presentamos las funciones, una noción esencial de la programación. Para utilizar las funciones con calma, es necesario dominar el uso de argumentos, que se basa en la gestión de asociaciones entre variables. La mecánica de las asociaciones a menudo se descuida durante el aprendizaje del lenguaje Python porque se considera demasiado técnica y su utilidad no es realmente evidente. Sin embargo, sin conocer este mecanismo, se dirige directamente hacia el error. El lenguaje Python tiene la reputación de ser un lenguaje fácil. Sin embargo, no lo es. Su sintaxis es sencilla, sin duda, lo que permite un aprendizaje rápido. Esto puede dar la impresión de que escribir un programa se ha convertido en algo fácil. Al principio, todo va bien. Sin embargo, rápidamente, se producirá un comportamiento extraño y el problema aparecerá el 99 % de las veces después del uso de una lista:

  • La lista mostrada no contiene los elementos correctos. Sin embargo, ¡se ha modificado! Un punto de interrupción en el modo de depuración confirma que el intérprete ha ejecutado correctamente las líneas responsables de modificarla. Sin embargo, más tarde, durante la ejecución, los nuevos valores han desaparecido y los valores anteriores han recuperado su lugar.

  • Una lista que nunca ha editado ve como sus elementos...

Asociación entre variables

1. El mecanismo de las asociaciones

Recordemos en primer lugar el mecanismo de asociación de listas:

L = [ 4,5,6] 
K = L 
L[1] = 9 

Las variables K y L están asociadas al mismo objeto de lista, por lo que están vinculadas. Si modificamos el elemento L[1], también modificamos K[1]:

images/05RI01.png
images/05RI02.png

Pero ¿qué sucede con las variables enteras? Al ejecutar un programa Python, cualquier variable está asociada a una cosa. Técnicamente, estamos hablando de un objeto. Un objeto puede ser un número, una cadena, un archivo o una imagen. Entonces, cuando escribimos:

a = 3 
b = a 

las variables a y b, aunque tengan nombres diferentes, están asociadas al mismo objeto 3. La función built in id(), que proporciona el número de identificación del objeto asociado a una variable, confirma esta afirmación:

print(id(a)) 
print(id(b)) 
>> 140710295855824 
>> 140710295855824 

Veremos lo que sucede paso a paso. La primera línea crea la variable a y la asocia con el número 3. La segunda fila crea la variable b y la asocia con el objeto 3 ya asociado a la variable a. En este momento, y solo en este momento, las dos variables están vinculadas. Por lo tanto, en memoria hay:

images/05RI03.png

Ahora, hagamos lo siguiente:

b = 2 + b 

Es obvio que b es 5 al final de esta línea. Pero como a y b estaban relacionados, ¿qué vale a: 5 o 3? Si pensamos en el mecanismo de las listas, tendríamos la tentación de decir 5. Sin embargo, el sentido común nos llevaría a decir 3... Echemos un vistazo paso a paso a lo que está sucediendo en esta línea. Cuando escribimos 2+b, debemos evaluar una expresión cuyo resultado da un nuevo valor de 5. Ahora, queda realizar la asignación b = 5. Esta acción asocia la variable b con un valor...

Interés de las funciones

1. Roles y definición

Las funciones permiten crear código reutilizable, lo que representa un enfoque interesante. Además, permiten asociar un nombre a una parte del código, un nombre que idealmente debería describir de la mejor manera posible el procesamiento realizado.

Siempre podemos intentar escribir un programa sin usar funciones, es posible... Pero si el programa se hace largo, la administración del código se volverá extenuante. Sin embargo, incluso cuando tenga la necesidad de escribir una función, ¡será tentado por el lado oscuro! El cual le empujará a copiar y pegar para evitar escribir una función adicional. ¡Es tan fácil y rápido hacer un copiar y pegar! Además, la mayoría de las veces funcionará a la primera. ¡Cómo resistirse! Tome como ejemplo el siguiente código:

TotalIvaIncluido = 0 
Precio1SinIva = 18 
IVA = 0.21 
Precio1IvaIncluido = Precio1SinIva*(1+IVA) 
TotalIvaIncluido = TotalIvaIncluido + Precio1IvaIncluido 
Precio2SinIva = 21 
Precio2IvaIncluido = Precio2SinIva*(1+IVA) 
TotalIvaIncluido = TotalIvaIncluido + Precio2IvaIncluido 
print(TotalIvaIncluido) 

El código es legible. Las variables tienen un nombre correcto. Sin embargo, para saber qué hace este fragmento de código, hay que centrarse un poco para comprobar las acciones realizadas en cada línea. Parece que calculamos un precio con IVA incluido dos veces a partir de un precio sin IVA. Mejoraremos la estructura de nuestro código creando una función para esta tarea:

def PrecioIvaIncluido(precioSinIVA): 
 IVA = 0.21 
 return Precio1SinIva * (1 + IVA) 
 
Precio1SinIva = 18 
Precio2SinIva = 21 
 
TotalIvaIncluido = 0 
TotalIvaIncluido = TotalIvaIncluido + PrecioIvaIncluido(Precio1SinIva) 
TotalIvaIncluido = TotalIvaIncluido + PrecioIvaIncluido(Precio2SinIva) 
 
print(TotalIvaIncluido) 

La declaración o definición de una función se realiza mediante el uso de la palabra clave def. La sintaxis de una declaración tiene que respetar el orden siguiente:

  • Palabra clave def

  • Nombre de la función: PrecioIvaIncluido

  • paréntesis de apertura: (

  • nombres de los parámetros separados por comas si hay más de uno

  • paréntesis...

Gestión de las variables

1. Variables globales

Una variable global es una variable definida en el bloque principal del programa. Una variable global solo se puede utilizar después de haber sido creada. Cualquier tentativa de usarla antes de que se defina dará como resultado un mensaje de error. A continuación, le presentamos un ejemplo. En la primera fila, creamos la variable a y le damos el valor 1. En todas las líneas que siguen, por lo tanto, podemos usar el nombre de esta variable sin que se produzca ningún un error. Por ejemplo, en la línea 2, la instrucción print(a) mostrará el valor 1. En la tercera línea, hallamos la instrucción print(b). El nombre b es desconocido porque la variable b aún no existe.

El programa se detiene y muestra un mensaje de error que indica que el nombre b no ha sido definido: «name ’b’ is not defined». La variable b se crea en la siguiente línea, todavía no es utilizable en este nivel. La última instrucción print(b) muestra el valor de b, es decir, 2.

a = 1 
print(a) # 1 
print(b) # error : NameError: name 'b' is not defined 
b = 2 
print(b) # 2 
Los resultados de sus programas pueden ser distintos si trabaja en modo Python interactivo. De hecho, en este modo las variables se mantienen entre las ejecuciones de los programas. Por lo tanto, es posible que no obtenga ningún mensaje de error porque la variable b proviene de un ejercicio anterior. Para probar este ejemplo, puede reiniciar el entorno de Python para «limpiar» todas las variables. Si está trabajando con Pyzo, considere hacer clic en el icono images/05RI15.png para recargar el entorno de Python.

2. Variables locales

Una variable local es una variable creada dentro de una función. Decimos que es local a esta función, ya que solo se puede usar dentro del bloque de funciones. Cuando se completa la función, el nombre de esta variable desaparece. Esto implica que no se puede utilizar en otro lugar del programa. Las variables locales, como las variables globales, solo se pueden usar después de que hayan sido definidas. Consideremos ahora el siguiente caso.

a = 1 
 
def test(b): 
  print(b) 
  print(c) # error, se tiene que suprimir esta línea 
  c = 3 
  print(c) 
  print(b) ...

Ejercicios de aplicación

1. Copias y modificaciones de listas

Muestre el estado de la memoria después de ejecutar el siguiente programa:

a = [ 1,2,3] 
b = a.copy() 
c = b 
a[0] = 10 
b[1] = 11 
c[2] = 12 

Corrección guiada:

La primera línea crea una lista inicializada con valores 1, 2 y 3. La segunda inicializa la variable b con una copia de la lista a. Gracias a la función copy(), las dos listas son idénticas, pero independientes en memoria:

images/05RI20.png

La asignación c = b tiene el efecto de asociar la variable c con la misma lista que la variable b. En este nivel, las variables b y c están vinculadas, designan la misma lista:

images/05RI21.png

Al escribir a[0] = 10, colocamos el primer elemento de la lista asociado con la variable a en el valor 10. Las dos entradas b[1] = 11 y c[2] = 12 modifican las dos últimas casillas de la lista inferior:

images/05RI22.png

En este nivel, si ejecutamos print (a,b,c), obtendremos:

>> [10,2,3] [1,11,12] [1,11,12] 

2. Creación de lista de listas I

Muestre el estado de la memoria y las visualizaciones después de ejecutar el programa:

R = [0,0,0] 
L = [ R,R,R] 
L[0][1] = 5 
 
S = [ [0,0,0], [0,0,0], [0,0,0] ] 
S[0][1] = 5 
 
print(L) 
print(S)  

Corrección guiada:

La primera línea crea una lista con tres veces el valor 0. La segunda línea inicializa la lista L, que contiene tres veces la variable R. Como R designa una asociación a la lista [0,0,0], los elementos de la lista L representan tres asociaciones a la lista R:

images/05RI23.png

Al realizar L[0][1] = 5, primero buscamos el significado de L[0]. Como L[0] designa la lista R, esta escritura es equivalente a: R[1] =5.

images/05RI24.png

En este nivel, usando la instrucción print(L), obtendremos:

>> [[0, 5, 0], [0, 5, 0], [0, 5, 0]] 

La visualización de la variable L da su contenido, es decir, todas las asociaciones se sustituyen para mostrar solo los valores. Tenemos la impresión de que finalmente L corresponde a una lista de tres listas de tres elementos. Esto es cierto, pero también falso. Porque si mostramos:

print(id(L[0])) 
>> 77187232 
print(id(L[1])) 
>> 77187232 
print(id(L[2])) 
>> 77187232 

veremos que estas tres listas son, de hecho, la misma y única lista, llamada R en el ejercicio.

La creación de la lista de listas S esta vez utiliza tres listas independientes:

images/05RI25.png

Así...

Preparación para los ejercicios

Para hacer ejercicios de entrenamiento más variados, le vamos a presentar un nuevo concepto.

1. Una ventana de visualización gráfica images/etoile.png

La corrección de este ejercicio se puede descargar desde la página web de la editorial. Para complementar algunos de nuestros ejercicios, haremos pantallas gráficas. Para ello, utilizamos la librería Tkinter, que gestiona aplicaciones con venta-nas. Esta librería se instala por defecto con Python.

Todos los programas que hemos realizado hasta ahora se hicieron en modo consola, es decir, teníamos una interfaz de texto: podíamos introducir datos en el teclado y las visualizaciones eran en formato de texto. Hay otra categoría de aplicaciones en el mundo de la informática: aplicaciones con ventanas. Estas aplicaciones abren una ventana en el escritorio, como Word, Photoshop, Chrome, Calculadora... y muestran su espacio de trabajo dentro de esa ventana. Se puede usar el ratón para interactuar con estas aplicaciones, lo que no sucede con las aplicaciones de consola. Pero, sobre todo, se pueden mostrar gráficos en pantalla.

He aquí una base para una aplicación de dibujo:

from tkinter import Tk, Canvas 
 
TAMANO = 500 
 
# su programa viene aquí 
 
def PROG(): 
 r = TAMANO-1 
 canvas.create_line(0,0,r,0 ) 
 canvas.create_line(0,r,r,r ) ...

Ejercicios de entrenamiento

1. Calcular el mínimo de una lista images/etoile.png

La corrección de este ejercicio se puede descargar desde la página web de la editorial. Escriba una función que reciba una lista de cualquier tamaño y devuelva el número más pequeño contenido en esa lista. Pruebe su programa con un ejemplo. Se supone que la lista no está vacía. Aquí hay algunos consejos:

  • Se debe utilizar un bucle for para examinar los elementos de la lista.

  • Hay una trampa que no es evidente en este ejercicio. De hecho, la lógica del bucle principal es simple: recorremos cada elemento; si el elemento actual es más pequeño que el mínimo conocido, remplazamos el mínimo conocido con el nuevo valor. Sin embargo, queda un misterio por resolver: ¿con qué valor debemos inicializar la variable correspondiente al mínimo actual? De hecho, dada la prueba realizada, requeriría un valor muy grande: por ejemplo, 1000. Pero si nuestra lista contiene solo números mayores de 1000, el resultado será incorrecto. Entonces, podemos poner un número aún mayor, como 1 000 000.

    Sí, pero no, porque basta con que todos los números de la lista sean mayores que este valor para que tengamos un problema. Si es así, ¡podemos poner +! Ya es una mejor idea. Le ofreceremos una opción más simple donde, para inicializar el valor del mínimo actual, tomaremos el valor del primer elemento de la lista.

2. Dibujar en modo texto images/etoile.png

La corrección de este ejercicio se puede descargar desde la página web de la editorial. Le proponemos realizar funciones de dibujo en modo texto. Utilizará la consola como área de visualización. He aquí hay algunos consejos:

  • Cree una lista de listas de tamaño 31x31 rellenas con el carácter punto «.». Puede utilizar la sintaxis siguiente: ["."]*31 para crear treinta y un elementos rápidamente.

  • Cree una función Vista() para mostrar la cuadrícula de dibujo línea por línea. Cada carácter se mostrará dos veces en sentido horizontal para corregir las proporciones porque un carácter es dos veces más alto que ancho. Utilice el parámetro end="" de la función print para evitar un salto de línea.

  • Cree una función...

Proyectos

Los proyectos de este capítulo son muy interesantes, pero también bastante largos, es decir: entre 80 y 100 líneas cada uno. Para hacerlos asequibles, los hemos dividido en etapas de dificultad creciente. Por lo tanto, cada paso es de unas treinta líneas, lo que hace que el objetivo sea alcanzable. Al final de cada paso, le damos una corrección para permitirle encontrar las soluciones de los puntos que le han causado problemas o ver un enfoque diferente al suyo.

1. El juego del tres en raya - Etapa 1 images/etoile.png

El «tres en raya» se juega en una cuadrícula de 3x3 para dos jugadores. Un jugador hace círculos y el otro hace cruces en las casillas, cada uno en su turno. Quien logre hacer una alineación vertical, horizontal o diagonal habrá ganado. Describiremos cómo construir este juego en tres etapas.

Etapa 1: Creación de la cuadrícula del juego

La corrección de esta primera parte del proyecto está disponible para su descarga en el sitio web de la editorial.

  • Use la plantilla habitual para crear la ventana de Tkinter; debe tener 300 píxeles de ancho:

# Tres en raya 
de tkinter import Tk, Canvas 
import random 
 
 TAMANO = 300 
 
 ... 
 
 # Creación de la ventana gráfica 
Miventana = Tk() 
Miventana.geometry(str(TAMANO) +"x"+str(TAMANO)) 
canvas = Canvas(Miventana,width=TAMANO, height=TAMANO, 
borderwidth=0, highlightthickness=0,bg="lightgray") 
canvas.pack() 
Miventana.after(100,PROG) 
Miventana.mainloop() 
  • Cree una lista de listas para modelar la cuadrícula. Inicialice sus valores a 0 para la primera fila, 1 para la segunda y 2 para la última.

  • Escribe una función MostrarCuadricula() (c="black") que dibuje dos líneas verticales y dos líneas horizontales para crear las 9 casillas del juego. Utilice la función canvas.create_line(x1,y1),(x2,y2)) para dibujar un segmento entre dos puntos. El parámetro width debe tener el valor 3 para que los segmentos sean gruesos. El parámetro fill le permitirá elegir el color de la línea, de modo que el color esté dado por el parámetro c de la función MostrarCuadricula().

  • Cree una función MostrarFichas() que rellene la cuadrícula de acuerdo con los movimientos hechos...