0% encontró este documento útil (0 votos)
162 vistas

1 Python Control Bucles Funciones

Este documento describe diferentes tipos de sentencias condicionales y bucles en Python. Explica el uso de if, else, elif para ejecutar código condicionalmente dependiendo de si una condición es verdadera o falsa. También describe los bucles while y for, incluyendo cómo usar break y continue para controlar la ejecución del bucle.

Cargado por

Felipe Matus
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
162 vistas

1 Python Control Bucles Funciones

Este documento describe diferentes tipos de sentencias condicionales y bucles en Python. Explica el uso de if, else, elif para ejecutar código condicionalmente dependiendo de si una condición es verdadera o falsa. También describe los bucles while y for, incluyendo cómo usar break y continue para controlar la ejecución del bucle.

Cargado por

Felipe Matus
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 13

Control de flujo

En esta lección vamos a ver los condicionales y los bucles.

Sentencias condicionales
Si un programa no fuera más que una lista de órdenes a ejecutar de
forma secuencial, una por una, no tendría mucha utilidad. Los con-
dicionales nos permiten comprobar condiciones y hacer que nuestro
programa se comporte de una forma u otra, que ejecute un fragmento
de código u otro, dependiendo de esta condición.

Aquí es donde cobran su importancia el tipo booleano y los operadores


lógicos y relacionales que aprendimos en el capítulo sobre los tipos
básicos de Python.

if
La forma más simple de un estamento condicional es un if (del inglés
si) seguido de la condición a evaluar, dos puntos (:) y en la siguiente
línea e indentado, el código a ejecutar en caso de que se cumpla dicha
condición.

fav = “mundogeek.net”
# si (if) fav es igual a “mundogeek.net”
if fav == “mundogeek.net”:
print “Tienes buen gusto!”
print “Gracias”

Como veis es bastante sencillo.

Eso si, aseguraros de que indentáis el código tal cual se ha hecho en el


ejemplo, es decir, aseguraros de pulsar Tabulación antes de las dos ór-
denes print, dado que esta es la forma de Python de saber que vuestra
intención es la de que los dos print se ejecuten sólo en el caso de que
29
Python para todos

se cumpla la condición, y no la de que se imprima la primera cadena si


se cumple la condición y la otra siempre, cosa que se expresaría así:

if fav == “mundogeek.net”:
print “Tienes buen gusto!”
print “Gracias”

En otros lenguajes de programación los bloques de código se determi-


nan encerrándolos entre llaves, y el indentarlos no se trata más que de
una buena práctica para que sea más sencillo seguir el flujo del progra-
ma con un solo golpe de vista. Por ejemplo, el código anterior expresa-
do en Java sería algo así:

String fav = “mundogeek.net”;


if (fav.equals(“mundogeek.net”)){
System.out.println(“Tienes buen gusto!”);
System.out.println(“Gracias”);
}

Sin embargo, como ya hemos comentado, en Python se trata de una


obligación, y no de una elección. De esta forma se obliga a los progra-
madores a indentar su código para que sea más sencillo de leer :)

if … else
Vamos a ver ahora un condicional algo más complicado. ¿Qué haría-
mos si quisiéramos que se ejecutaran unas ciertas órdenes en el caso de
que la condición no se cumpliera? Sin duda podríamos añadir otro if
que tuviera como condición la negación del primero:

if fav == “mundogeek.net”:
print “Tienes buen gusto!”
print “Gracias”

if fav != “mundogeek.net”:
print “Vaya, que lástima”

pero el condicional tiene una segunda construcción mucho más útil:

if fav == “mundogeek.net”:
print “Tienes buen gusto!”
print “Gracias”
else:
print “Vaya, que lástima”

30
Control de flujo

Vemos que la segunda condición se puede sustituir con un else (del


inglés: si no, en caso contrario). Si leemos el código vemos que tiene
bastante sentido: “si fav es igual a mundogeek.net, imprime esto y esto,
si no, imprime esto otro”.

if … elif … elif … else


Todavía queda una construcción más que ver, que es la que hace uso
del elif.

if numero < 0:
print “Negativo”
elif numero > 0:
print “Positivo”
else:
print “Cero”

elif es una contracción de else if, por lo tanto elif numero > 0 puede
leerse como “si no, si numero es mayor que 0”. Es decir, primero se
evalúa la condición del if. Si es cierta, se ejecuta su código y se con-
tinúa ejecutando el código posterior al condicional; si no se cumple,
se evalúa la condición del elif. Si se cumple la condición del elif
se ejecuta su código y se continua ejecutando el código posterior al
condicional; si no se cumple y hay más de un elif se continúa con el
siguiente en orden de aparición. Si no se cumple la condición del if ni
de ninguno de los elif, se ejecuta el código del else.

A if C else B

También existe una construcción similar al operador ? de otros lengua-


jes, que no es más que una forma compacta de expresar un if else. En
esta construcción se evalúa el predicado C y se devuelve A si se cumple
o B si no se cumple: A if C else B. Veamos un ejemplo:

var = “par” if (num % 2 == 0) else “impar”

Y eso es todo. Si conocéis otros lenguajes de programación puede que


esperarais que os hablara ahora del switch, pero en Python no existe
esta construcción, que podría emularse con un simple diccionario, así
que pasemos directamente a los bucles.
31
Python para todos

Bucles
Mientras que los condicionales nos permiten ejecutar distintos frag-
mentos de código dependiendo de ciertas condiciones, los bucles nos
permiten ejecutar un mismo fragmento de código un cierto número de
veces, mientras se cumpla una determinada condición.

while
El bucle while (mientras) ejecuta un fragmento de código mientras se
cumpla una condición.

edad = 0
while edad < 18:
edad = edad + 1
print “Felicidades, tienes “ + str(edad)

La variable edad comienza valiendo 0. Como la condición de que edad


es menor que 18 es cierta (0 es menor que 18), se entra en el bucle.
Se aumenta edad en 1 y se imprime el mensaje informando de que
el usuario ha cumplido un año. Recordad que el operador + para las
cadenas funciona concatenando ambas cadenas. Es necesario utilizar
la función str (de string, cadena) para crear una cadena a partir del
número, dado que no podemos concatenar números y cadenas, pero ya
comentaremos esto y mucho más en próximos capítulos.

Ahora se vuelve a evaluar la condición, y 1 sigue siendo menor que 18,


por lo que se vuelve a ejecutar el código que aumenta la edad en un
año e imprime la edad en la pantalla. El bucle continuará ejecutándose
hasta que edad sea igual a 18, momento en el cual la condición dejará
de cumplirse y el programa continuaría ejecutando las instrucciones
siguientes al bucle.

Ahora imaginemos que se nos olvidara escribir la instrucción que


aumenta la edad. En ese caso nunca se llegaría a la condición de que
edad fuese igual o mayor que 18, siempre sería 0, y el bucle continuaría
indefinidamente escribiendo en pantalla Has cumplido 0.

Esto es lo que se conoce como un bucle infinito.

32
Control de flujo

Sin embargo hay situaciones en las que un bucle infinito es útil. Por
ejemplo, veamos un pequeño programa que repite todo lo que el usua-
rio diga hasta que escriba adios.

while True:
entrada = raw_input(“> “)
if entrada == “adios”:
break
else:
print entrada

Para obtener lo que el usuario escriba en pantalla utilizamos la función


raw_input. No es necesario que sepais qué es una función ni cómo
funciona exactamente, simplemente aceptad por ahora que en cada
iteración del bucle la variable entrada contendrá lo que el usuario
escribió hasta pulsar Enter.

Comprobamos entonces si lo que escribió el usuario fue adios, en cuyo


caso se ejecuta la orden break o si era cualquier otra cosa, en cuyo caso
se imprime en pantalla lo que el usuario escribió.

La palabra clave break (romper) sale del bucle en el que estamos.

Este bucle se podría haber escrito también, no obstante, de la siguiente


forma:

salir = False
while not salir:
entrada = raw_input()
if entrada == “adios”:
salir = True
else:
print entrada

pero nos ha servido para ver cómo funciona break.

Otra palabra clave que nos podemos encontrar dentro de los bucles es
continue (continuar). Como habréis adivinado no hace otra cosa que
pasar directamente a la siguiente iteración del bucle.

edad = 0
while edad < 18:

33
Python para todos

edad = edad + 1
if edad % 2 == 0:
continue
print “Felicidades, tienes “ + str(edad)

Como veis esta es una pequeña modificación de nuestro programa de


felicitaciones. En esta ocasión hemos añadido un if que comprueba si
la edad es par, en cuyo caso saltamos a la próxima iteración en lugar de
imprimir el mensaje. Es decir, con esta modificación el programa sólo
imprimiría felicitaciones cuando la edad fuera impar.

for … in
A los que hayáis tenido experiencia previa con según que lenguajes este
bucle os va a sorprender gratamente. En Python for se utiliza como
una forma genérica de iterar sobre una secuencia. Y como tal intenta
facilitar su uso para este fin.

Este es el aspecto de un bucle for en Python:

secuencia = [“uno”, “dos”, “tres”]


for elemento in secuencia:
print elemento

Como hemos dicho los for se utilizan en Python para recorrer secuen-
cias, por lo que vamos a utilizar un tipo secuencia, como es la lista, para
nuestro ejemplo.

Leamos la cabecera del bucle como si de lenguaje natural se tratara:


“para cada elemento en secuencia”. Y esto es exactamente lo que hace
el bucle: para cada elemento que tengamos en la secuencia, ejecuta
estas líneas de código.

Lo que hace la cabecera del bucle es obtener el siguiente elemento de


la secuencia secuencia y almacenarlo en una variable de nombre ele-
mento. Por esta razón en la primera iteración del bucle elemento valdrá
“uno”, en la segunda “dos”, y en la tercera “tres”.

Fácil y sencillo.

En C o C++, por ejemplo, lo que habríamos hecho sería iterar sobre las
34
Control de flujo

posiciones, y no sobre los elementos:

int mi_array[] = {1, 2, 3, 4, 5};


int i;
for(i = 0; i < 5; i++) {
printf(“%d\n”, mi_array[i]);
}

Es decir, tendríamos un bucle for que fuera aumentando una variable


i en cada iteración, desde 0 al tamaño de la secuencia, y utilizaríamos
esta variable a modo de índice para obtener cada elemento e imprimir-
lo.

Como veis el enfoque de Python es más natural e intuitivo.

Pero, ¿qué ocurre si quisiéramos utilizar el for como si estuviéramos en


C o en Java, por ejemplo, para imprimir los números de 30 a 50? No os
preocupéis, porque no necesitaríais crear una lista y añadir uno a uno
los números del 30 al 50. Python proporciona una función llamada
range (rango) que permite generar una lista que vaya desde el primer
número que le indiquemos al segundo. Lo veremos después de ver al
fin a qué se refiere ese término tan recurrente: las funciones.

35
Funciones

Una función es un fragmento de código con un nombre asociado que


realiza una serie de tareas y devuelve un valor. A los fragmentos de
código que tienen un nombre asociado y no devuelven valores se les
suele llamar procedimientos. En Python no existen los procedimien-
tos, ya que cuando el programador no especifica un valor de retorno la
función devuelve el valor None (nada), equivalente al null de Java.

Además de ayudarnos a programar y depurar dividiendo el programa


en partes las funciones también permiten reutilizar código.

En Python las funciones se declaran de la siguiente forma:

def mi_funcion(param1, param2):


print param1
print param2

Es decir, la palabra clave def seguida del nombre de la función y entre


paréntesis los argumentos separados por comas. A continuación, en
otra línea, indentado y después de los dos puntos tendríamos las líneas
de código que conforman el código a ejecutar por la función.

También podemos encontrarnos con una cadena de texto como


primera línea del cuerpo de la función. Estas cadenas se conocen con
el nombre de docstring (cadena de documentación) y sirven, como su
nombre indica, a modo de documentación de la función.

def mi_funcion(param1, param2):


“““Esta funcion imprime los dos valores pasados
como parametros”””
print param1
print param2

Esto es lo que imprime el opeardor ? de iPython o la función help


36
Funciones

del lenguaje para proporcionar una ayuda sobre el uso y utilidad de


las funciones. Todos los objetos pueden tener docstrings, no solo las
funciones, como veremos más adelante.

Volviendo a la declaración de funciones, es importante aclarar que


al declarar la función lo único que hacemos es asociar un nombre al
fragmento de código que conforma la función, de forma que podamos
ejecutar dicho código más tarde referenciándolo por su nombre. Es
decir, a la hora de escribir estas líneas no se ejecuta la función. Para
llamar a la función (ejecutar su código) se escribiría:

mi_funcion(“hola”, 2)

Es decir, el nombre de la función a la que queremos llamar seguido de


los valores que queramos pasar como parámetros entre paréntesis. La
asociación de los parámetros y los valores pasados a la función se hace
normalmente de izquierda a derecha: como a param1 le hemos dado un
valor “hola” y param2 vale 2, mi_funcion imprimiría hola en una línea,
y a continuación 2.

Sin embargo también es posible modificar el orden de los parámetros


si indicamos el nombre del parámetro al que asociar el valor a la hora
de llamar a la función:

mi_funcion(param2 = 2, param1 = “hola”)

El número de valores que se pasan como parámetro al llamar a la fun-


ción tiene que coincidir con el número de parámetros que la función
acepta según la declaración de la función. En caso contrario Python se
quejará:

>>> mi_funcion(“hola”)
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
TypeError: mi_funcion() takes exactly 2 arguments (1 given)

También es posible, no obstante, definir funciones con un número va-


riable de argumentos, o bien asignar valores por defecto a los paráme-
tros para el caso de que no se indique ningún valor para ese parámetro
al llamar a la función.

37
Python para todos

Los valores por defecto para los parámetros se definen situando un


signo igual después del nombre del parámetro y a continuación el valor
por defecto:

def imprimir(texto, veces = 1):


print veces * texto

En el ejemplo anterior si no indicamos un valor para el segundo


parámetro se imprimirá una sola vez la cadena que le pasamos como
primer parámetro:

>>> imprimir(“hola”)
hola

si se le indica otro valor, será este el que se utilice:

>>> imprimir(“hola”, 2)
holahola

Para definir funciones con un número variable de argumentos coloca-


mos un último parámetro para la función cuyo nombre debe preceder-
se de un signo *:

def varios(param1, param2, *otros):


for val in otros:
print val

varios(1, 2)
varios(1, 2, 3)
varios(1, 2, 3, 4)

Esta sintaxis funciona creando una tupla (de nombre otros en el


ejemplo) en la que se almacenan los valores de todos los parámetros
extra pasados como argumento. Para la primera llamada, varios(1, 2),
la tupla otros estaría vacía dado que no se han pasado más parámetros
que los dos definidos por defecto, por lo tanto no se imprimiría nada.
En la segunda llamada otros valdría (3, ), y en la tercera (3, 4).

También se puede preceder el nombre del último parámetro con **, en


cuyo caso en lugar de una tupla se utilizaría un diccionario. Las claves
de este diccionario serían los nombres de los parámetros indicados al

38
Funciones

llamar a la función y los valores del diccionario, los valores asociados a


estos parámetros.

En el siguiente ejemplo se utiliza la función items de los diccionarios,


que devuelve una lista con sus elementos, para imprimir los parámetros
que contiene el diccionario.

def varios(param1, param2, **otros):


for i in otros.items():
print i

varios(1, 2, tercero = 3)

Los que conozcáis algún otro lenguaje de programación os estaréis


preguntando si en Python al pasar una variable como argumento de
una función estas se pasan por referencia o por valor. En el paso por
referencia lo que se pasa como argumento es una referencia o puntero
a la variable, es decir, la dirección de memoria en la que se encuentra el
contenido de la variable, y no el contenido en si. En el paso por valor,
por el contrario, lo que se pasa como argumento es el valor que conte-
nía la variable.

La diferencia entre ambos estriba en que en el paso por valor los


cambios que se hagan sobre el parámetro no se ven fuera de la fun-
ción, dado que los argumentos de la función son variables locales a la
función que contienen los valores indicados por las variables que se
pasaron como argumento. Es decir, en realidad lo que se le pasa a la
función son copias de los valores y no las variables en si.

Si quisiéramos modificar el valor de uno de los argumentos y que estos


cambios se reflejaran fuera de la función tendríamos que pasar el pará-
metro por referencia.

En C los argumentos de las funciones se pasan por valor, aunque se


puede simular el paso por referencia usando punteros. En Java también
se usa paso por valor, aunque para las variables que son objetos lo que
se hace es pasar por valor la referencia al objeto, por lo que en realidad
parece paso por referencia.

En Python también se utiliza el paso por valor de referencias a objetos,


39
Python para todos

como en Java, aunque en el caso de Python, a diferencia de Java, todo


es un objeto (para ser exactos lo que ocurre en realidad es que al objeto
se le asigna otra etiqueta o nombre en el espacio de nombres local de la
función).

Sin embargo no todos los cambios que hagamos a los parámetros


dentro de una función Python se reflejarán fuera de esta, ya que hay
que tener en cuenta que en Python existen objetos inmutables, como
las tuplas, por lo que si intentáramos modificar una tupla pasada como
parámetro lo que ocurriría en realidad es que se crearía una nueva ins-
tancia, por lo que los cambios no se verían fuera de la función.

Veamos un pequeño programa para demostrarlo. En este ejemplo


se hace uso del método append de las listas. Un método no es más
que una función que pertenece a un objeto, en este caso a una lista; y
append, en concreto, sirve para añadir un elemento a una lista.

def f(x, y):


x = x + 3
y.append(23)
print x, y

x = 22
y = [22]
f(x, y)
print x, y

El resultado de la ejecución de este programa sería

25 [22, 23]
22 [22, 23]

Como vemos la variable x no conserva los cambios una vez salimos de


la función porque los enteros son inmutables en Python. Sin embargo
la variable y si los conserva, porque las listas son mutables.

En resumen: los valores mutables se comportan como paso por refe-


rencia, y los inmutables como paso por valor.

Con esto terminamos todo lo relacionado con los parámetros de las


funciones. Veamos por último cómo devolver valores, para lo que se
utiliza la palabra clave return:
40
Funciones

def sumar(x, y):


return x + y

print sumar(3, 2)

Como vemos esta función tan sencilla no hace otra cosa que sumar los
valores pasados como parámetro y devolver el resultado como valor de
retorno.

También podríamos pasar varios valores que retornar a return.

def f(x, y):


return x * 2, y * 2

a, b = f(1, 2)

Sin embargo esto no quiere decir que las funciones Python puedan de-
volver varios valores, lo que ocurre en realidad es que Python crea una
tupla al vuelo cuyos elementos son los valores a retornar, y esta única
variable es la que se devuelve.

41

También podría gustarte