Download Introducción a algoritmos con python

Document related concepts
no text concepts found
Transcript
Universidad de Oviedo
Departamento de Fı́sica
Grado en Fı́sica
Curso 2016–17
Introducción a la Fı́sica Computacional
Introducción a algoritmos con python
Resolución de problemas en un ordenador
Algoritmos
Lenguajes de programación
Bases de la programación imperativa
Resolución de problemas en un ordenador
Proceso en varios pasos
Se necesitan resolver varios sub-problemas:
Modelo fı́sico
Modelo matemático
Modelo informático (algoritmo)
Programa de ordenador
Modelo fı́sico
Se plantea el problema desde el punto de vista fı́sico
(o quı́mico, biológico, sociológico, etc., dependiendo
de la disciplina de que se trate).
Se aplica la teorı́a correspondiente, teniendo
en cuenta sus limitaciones y realizando las
simplificaciones pertinentes.
Modelo matemático
Se describen las fórmulas algebraicas necesarias,
si hay que resolver sistemas de ecuaciones, si se
necesitan integrales, etc.
Se debe plantear el problema usando la matemática
adecuada.
Por ejemplo, la fı́sica cuántica necesita el uso de
números complejos, pero la dinámica clásica usa
números reales.
Modelo informático
Los ordenadores no pueden (de momento) codificar
directamente el modelo matemático.
Se necesita desarrollar un algoritmo, que consiste
en una descripción de las instrucciones necesarias
para luego codificar la resolución del problema en un
ordenador.
Un algoritmo es básicamente una ‘receta’.
Programa informático
Consiste en la traducción del algoritmo a un lenguaje
concreto de programación, que realiza realmente la
computación.
La computación puede ser algo matemático
(solucionar un sistema de ecuaciones), pero también
puede ser una computación simbólica (buscar y
reemplazar el texto de un documento, o realizar una
traducción de una lengua a otra).
Problema ejemplo
Se deja caer una piedra desde el brocal de un pozo y
queremos conocer la distancia al brocal de la piedra
según cae para diferentes instantes de tiempo.
(Aunque de momento algunas partes en la resolución
de este ejemplo no las hemos visto, no es difı́cil
entender el método. Ya volveremos sobre ellas luego.)
Modelo fı́sico
La piedra sufre una caı́da libre (aproximadamente).
La caı́da libre es el movimiento de un cuerpo bajo
la acción de la gravedad.
Existen simplificaciones fı́sicas:
• en las cercanı́as de la superficie terrestre
se puede suponer la intensidad del campo
gravitatorio, g, constante;
• se desprecia el rozamiento del aire;
• se supone el cuerpo puntual.
Modelo matemático
Definición de algunas variables:
profundidad respecto a la superficie terrestre, y;
tiempo, t;
intensidad del campo gravitatorio (aceleración de
la gravedad), g.
Tomando y = 0, cuando t = 0, se tiene y = 12 gt2 .
Algoritmo informático
Instante inicial ti = 0, instante final tf, con n pasos temporales.
definición de datos:
g, tf, t : número real
n, i : número entero
parte ejecutable:
leer g, tf, n
asignar t = 0, dt = tf/n
para i = 1 hasta n hacer
asignar t = t + dt
asignar y = 0.5gt2
imprimir t, y
fin para
Programa de ordenador (en python)
g = input("g ? ")
tf = input("tf ? ")
n = input("n ? ")
dt = tf/float(n)
t = 0
for i in range(n):
t = t+dt
y = 0.5*g*t**2
print("t = %10.5f y = %10.5f" % (t, y))
Salida del programa (por pantalla)
g ? 9.8
tf ? 2
n ? 10
t = 0.20000
t = 0.40000
t = 0.60000
t = 0.80000
t = 1.00000
t = 1.20000
t = 1.40000
t = 1.60000
t = 1.80000
t = 2.00000
y
y
y
y
y
y
y
y
y
y
=
=
=
=
=
=
=
=
=
=
0.19600
0.78400
1.76400
3.13600
4.90000
7.05600
9.60400
12.54400
15.87600
19.60000
Algoritmos
Qué es un algoritmo
Es un conjunto de instrucciones a aplicar a unos datos
de entrada, y que termina en un número finito de
pasos, proporcionándonos resultados.
Los algoritmos resuelven clases de problemas, o sea,
problemas generales.
Ejemplo: diseñe un algoritmo para calcular el área de
un cı́rculo de radio cualquiera.
Algoritmo para calcular el área de un cı́rculo
Se debe conocer el radio r del cı́rculo. Tendrı́amos,
por ejemplo:
definición de datos:
r, a : número real
π : número real, constante : 3.1415926535897932
parte ejecutable:
leer r
asignar a = πr2
imprimir a
Ejercicio A1 (para resolver en clase)
Describa un algoritmo para pasar de coordenadas
polares (r, θ) a coordenadas cartesianas (x, y).
r
θ
y
x
Nota: suponga que el
cálculo de las funciones
matemáticas clásicas es
conocido y que su uso es
el habitual.
Solución al ejercicio A1
definición de datos:
r, θ : número real
x, y : número real
parte ejecutable:
leer r, θ
asignar x = r cos θ
asignar y = r sin θ
imprimir x, y
Ejercicio propuesto A2
Prepare un algoritmo para calcular el área de una
corona circular a partir del radio interno, r, y del
radio externo, R.
Ejercicio propuesto A3
Para la ecuación ax2 + bx + c = 0 de segundo
grado, prepare un algoritmo en el que dados los
tres parámetros a, b y c nos determine el signo
del discriminante ∆ = b2 − 4ac y según el mismo
calcule las raı́ces reales o complejas conjugadas de la
ecuación y las imprima.
Lenguajes de programación
Qué es un lenguaje de programación
Es un lenguaje formal diseñado para expresar procesos
que pueden ser llevados a cabo por máquinas como
las computadoras.
Está formado por un conjunto de sı́mbolos y reglas
sintácticas y semánticas que definen su estructura y
el significado de sus elementos y expresiones.
Qué es un lenguaje informático
Es un término que engloba a los lenguajes de
programación y a otros más, como por ejemplo
HTML (lenguaje para el marcado de páginas web
que no es propiamente un lenguaje de programación,
sino un conjunto de instrucciones que permiten
estructurar el contenido de los documentos).
Qué es código fuente
El código fuente de un programa informático (o
software) es un conjunto de lı́neas de texto que son
las instrucciones que debe seguir la computadora para
ejecutar dicho programa.
Por tanto, en el código fuente de un programa
está escrito por completo su funcionamiento.
Qué es código máquina
El código máquina consiste en instrucciones
ejecutables, conocidas por el procesador sobre el que
está diseñado el ordenador.
Cada procesador conoce sólo su lenguaje propio, por
lo que el código máquina debe ser preparado para su
funcionamiento en cada ordenador concreto.
La traducción del código fuente a código máquina
se realiza mediante ciertos programas denominados
compiladores e intérpretes.
Compiladores e intérpretes
Los compiladores traducen de una vez el código
fuente a lenguaje de máquina. Esto da rapidez de
ejecución pero el desarrollo del programa es lento.
Los intérpretes traducen el código fuente instrucción
por instrucción a lenguaje de máquina. Esto permite
desarrollos más rápidos pero ejecuciones lentas. No
obstante, se puede ir modificando continuamente el
código fuente, de tal manera que el código puede
escribirse a sı́ mismo.
Qué es programar
Es el proceso por el cual se escribe, se prueba, se
depura, se compila (o interpreta) y se mantiene el
código fuente de un programa informático.
Los errores en programación (bugs en inglés) son
casi inevitables. Por ello, es muy importante el
mantenimiento de las aplicaciones informáticas.
Lenguajes amigables, como python, facilitan ese
mantenimiento.
Qué lenguaje usar
Existen miles de lenguajes de programación, cada
uno apropiado a una tarea concreta (generalmente),
aunque existen lenguajes de propósito general como
python, que usaremos nosotros.
El uso del lenguaje adecuado a cada problema
es relevante: en una disciplina los algoritmos
necesarios son muy diferentes a los de otra disciplina
y es probable que las rutinas pertinentes estén
pre-programadas en un lenguaje y no en el otro.
Tipos de lenguajes de programación
Principalmente existen estos (aunque hay lenguajes
‘mixtos’):
Declarativos
Imperativos
Orientados a objetos
En todos ellos se utilizan sentencias, instrucciones o
comandos en modo texto (normalmente) para escribir
los programas.
Programación declarativa (I/II)
En ella las sentencias que se utilizan describen
el problema que se quiere solucionar, pero no las
instrucciones necesarias para solucionarlo.
Esto último se realiza mediante mecanismos internos
de inferencia de información a partir de la descripción
realizada.
No existen asignaciones.
Programación declarativa (II/II)
Existen tres subtipos de lenguajes declarativos:
Lógico, ejemplo de lenguaje: Prolog.
Algebraico, ejemplo de lenguaje: SQL.
Funcional, ejemplo de lenguaje: Haskell.
Programación imperativa
En ella se describe paso a paso un conjunto de
instrucciones que deben ejecutarse para variar el
estado del programa y hallar la solución.
Ejemplos de lenguaje: Fortran, C, Python.
Nos centraremos en este tipo de programación,
usando python como lenguaje.
Programación orientada a objetos (I/II)
La programación orientada a objetos (POO) utiliza
objetos como elementos fundamentales en la
construcción de la solución.
Un objeto es una abstracción de algún hecho o ente
del mundo real, con atributos que representan sus
caracterı́sticas o propiedades, y métodos que emulan
su comportamiento o actividad.
Programación orientada a objetos (II/II)
Todas las propiedades y métodos comunes a los
objetos se encapsulan o agrupan en clases.
Una clase es una plantilla, un prototipo para crear
objetos; en general, se dice que cada objeto es una
instancia o ejemplar de una clase.
Ejemplos de lenguaje: C++, Java, Python.
(No usaremos las caracterı́sticas OO de python.)
Bases de la programación imperativa
Comandos en programación imperativa
Las instrucciones tienen una apariencia distinta en
lenguajes de programación diferentes, pero existen
algunas funcionalidades básicas que se presentan en
casi todo lenguaje:
Declaración de tipos de dato.
Entrada y salida.
Operaciones con datos.
Subrutinas y funciones.
Condicionales.
Bucles.
Cálculo secuencial y cálculo paralelo
Existen computadores donde se pueden realizar
cálculos en paralelo (por ejemplo, los clusters de
procesadores para cálculo masivo).
No obstante, nosotros abordaremos sólo el cálculo en
serie o secuencial, más sencillo y adecuado al nivel de
nuestro curso.
Algoritmos con estructura secuencial
En cálculo en serie, cada instrucción se ejecuta
completamente antes de pasar a ejecutarse la
siguiente.
Los algoritmos diseñados de esta manera se
denominan en serie.
Por tanto, los programas preparados para este tipo
de algoritmos tienen estructura secuencial.
Constantes y variables (I/II)
A veces, al manejar números fijos como π ≈
3.14159, se necesitan constantes. Algunos lenguajes
de programación permiten declarar explı́citamente
constantes. Otras veces su uso es interno.
Sin embargo, lo normal es que los datos que se
manejan sean modificados de acuerdo al algoritmo.
Para ello se utilizan variables. La acción de modificar
los datos contenidos en una variable se denomina
asignación.
Constantes y variables (II/II)
En programación una variable es un espacio en
memoria al que se accede mediante un identificador,
que tiene asociado el tipo de dato, su manejo, etc.
En el espacio de memoria está almacenado un valor
(posiblemente con más información interna asociada
el tipo de dato).
En python se asigna una variable usando el signo
igual:
a = dato
Ejemplo de algoritmo secuencial (en python)
# Esta lı́nea es un comentario
# Además, las lı́neas en blanco se saltan
pi = 3.1415926535897932
# El radio, r, es conocido previamente
# Cálculo del área del cı́rculo
a = pi*r*r
# Cálc. de la longitud de la circunferencia
l = 2*pi*r
Ejercicio A3 (para resolver en clase)
Prepare un trozo de código en python, para calcular
el semiperı́metro, p, y el área, a, de un triángulo
mediante la fórmula de Herón a partir de las
longitudes de los lados a, b y c:
p
p = (a+b+c)/2,
a = p(p − a)(p − b)(p − c).
Suponga que los lados del triángulo son conocidos
previamente.
(En python la potenciación se calcula usando el
operaror **.)
Solución al ejercicio A3
# a, b y c son conocidos previamente
# Cálculo del semiperı́metro del triángulo
p = (a+b+c)/2.0
# Cálculo del área del triángulo
a = (p*(p-a)*(p-b)*(p-c))**0.5
Comandos en programación imperativa
Declaración de tipos de dato.
Entrada y salida.
Operaciones con datos.
Subrutinas y funciones.
Condicionales.
Bucles.
Declaración de tipos de dato (I/II)
Los computadores manejan muchos tipos de datos:
números enteros y reales, tiras de caracteres,
agrupaciones de datos homogéneas y heterogéneas,
etc.
En muchos lenguajes, se necesita declarar qué tipo
tiene un dato.
Por ejemplo, en C, un entero se define anteponiendo
int a la variable o constante a la que afecte.
Declaración de tipos de dato (II/II)
En python no es necesario declarar las variables:
cuando se realiza la asignación de un dato a una
variable, a, mediante:
a = dato
El tipo de dato de la variable coincide con el tipo de
lo que hay a la derecha del signo igual.
Comandos en programación imperativa
Declaración de tipos de dato.
Entrada y salida.
Operaciones con datos.
Subrutinas y funciones.
Condicionales.
Bucles.
Instrucciones de entrada y salida
Estas instrucciones suelen conllevar el uso de ficheros
(o archivos), que se pueden manejar en modo lectura
y/o escritura.
Por ejemplo, en python, leer de un fichero, f, serı́a:
x = f.read()
También existen otras instrucciones ligadas a obtener
información adicional sobre los ficheros, abrirlos y
cerrarlos, etc.
Entrada y salida simples en python
De momento, para su uso en lo que sigue, en python
la lectura simple de una variable (con un mensaje
explicativo) se puede hacer por teclado:
v = input("Introduzca velocidad ")
La salida por pantalla de varias variables, a, b y c, se
hace mediante:
print(a, b, c)
Comandos en programación imperativa
Declaración de tipos de dato.
Entrada y salida.
Operaciones con datos.
Subrutinas y funciones.
Condicionales.
Bucles.
Operaciones con datos (I/II)
Con los datos, ya sean expresados directamente
(como el número 33) o a través de una variable, se
pueden hacer operaciones.
Las operaciones permitidas dependen del tipo de
dato. Por ejemplo, con los números se pueden
hacer las operaciones aritméticas conocidas en
matemáticas.
Operaciones con datos (II/II)
Se denominan operadores a sı́mbolos (como *, +)
que indican que con los datos se debe realizar cierta
operación.
En python los operadores son infijos, esto es, se
colocan entre los datos sobre los que opera. Ejemplo:
3 * 4
En algunos lenguajes se puede extender el uso de
operadores a tipos de datos definidos por el usuario.
Precedencia de las operaciones
Las operaciones se escriben en una sola lı́nea,
y se realizan generalmente de izquierda a derecha
(excepto las potenciaciones en la mayorı́a de los
lenguajes).
Existe una precedencia de unos operadores sobre
otros. Cada lenguaje tiene sus reglas de precedencia,
pero en general se realizan primero la potenciación
(**), luego las multiplicaciones (*) y divisiones (/),
y luego las sumas (+) y restas (-).
Uso de los paréntesis
Las operaciones se pueden agrupar usando paréntesis
(como en las operaciones aritméticas).
Esto sirve para indicar qué operaciones se realizan
primero (se van quitando los paréntesis más interiores
al realizarse esas operaciones).
En una expresión el número de paréntesis de abrir (
debe ser igual al número de paréntesis de cerrar ).
(Los editores de texto suelen tener un destacado de
paréntesis.)
Ejemplos de operaciones
Por ejemplo: 3a se puede codificar
7b
3*a/7/b
y NO:
3*a/7*b
Otros ejemplos (con llamadas a funciones):
13*log(x)+sin(y)
24+12+6*7*z
y0+v0*t+0.5*g*t**2
Ejemplos de operaciones con paréntesis
La expresión:
2 sin x + cos y 4
3 cos x − sin y
p
ab(c + d)
log(a + log b)
f
g+h
x
2 sin
2+y
se codifica:
((2*sin(x)+cos(y))/(3*cos(x)-sin(y)))**4
sqrt(a*b*(c+d))/log(a + log (b))
f/(g+h)/(2 *sin(x/(2+y)))
Comandos en programación imperativa
Declaración de tipos de dato.
Entrada y salida.
Operaciones con datos.
Subrutinas y funciones.
Condicionales.
Bucles.
Subrutinas y funciones
Una subrutina o subprograma (también llamada
procedimiento o función), codifica un subalgoritmo
que permite resolver una tarea especı́fica.
Esto permite modularizar el código, haciéndolo
más fácil de entender. Además, se usan subrutinas
previamente desarrolladas por otros programadores,
que están bien diseñadas y probadas.
Pueden devolver o no un valor de retorno.
Definiendo subrutinas y funciones
Para definir una subrutina se necesita:
Un identificador que le da nombre.
Tipo(s) de dato(s) de retorno que se
devuelve(n) al terminar su ejecución.
Una lista de parámetros: conjunto de argumentos
(pueden ser cero, uno o más) que la función
debe recibir para realizar su tarea.
El código: conjunto de órdenes y sentencias que
se deben ejecutar.
Algunas consideraciones sobre subrutinas
Existe diversidad en la definición de funciones y
subrutinas en los diversos lenguajes de programación.
Por ejemplo, los argumentos (parámetros) pueden ser
accedidos por valor, por referencia o por nombre.
Además, las variables que se usan en las funciones y
subrutinas pueden tener carácter local o global.
Glosaremos el tema con python.
Ejemplo de función (en python)
(Nótese el indentado y el carácter :)
def circunferencia (r):
# El radio, r, es un argumento
pi = 3.1415926535897932
a = pi*r*r
l = 2*pi*r
return a, l
Ejercicio A4 (para resolver en clase)
Prepare una función en python que transforme las
coordenadas polares en coordenadas cartesianas y
que devuelve esta últimas.
Solución al ejercicio A4
def pol a rect (r, th):
# El radio, r, y el ángulo, th,
# son argumentos (números reales)
x = r*cos(th)
y = r*sin(th)
return x, y
Ejercicio propuesto A5
(Este ejercicio se propone como tarea a entregar por
el estudiante.)
Prepare una función en python que utilice la fórmula
de Stirling para aproximar el factorial de un número
entero n (que se pasa como argumento).
La función debe retornar el logaritmo neperiano del
factorial de n.
Bibliotecas de subrutinas y funciones
Aparte de las funciones definidas por el usuario,
existen bibliotecas (a veces denominadas “librerı́as”,
mala traducción del inglés library ).
Contienen funciones y subrutinas predefinidas
previamente, con el objeto de realizar cálculos o
tareas de interés para muchos usuarios del lenguaje.
Ejemplos: funciones matemáticas, para manejar
grandes cantidades de texto, para comunicar
ordenadores a distancia, etc.
Comandos en programación imperativa
Declaración de tipos de dato.
Entrada y salida.
Operaciones con datos.
Subrutinas y funciones.
Condicionales.
Bucles.
Cambiando la ejecución secuencial
La estructura secuencial sólo permite codificar
algoritmos simples pues no se puede cambiar la
ejecución del código en base a valores concretos de
las variables.
Por eso mismo los lenguajes poseen instrucciones
condicionales, que permiten bifurcar la ejecución
dependiendo del valor de alguna variable.
Instrucciones condicionales
Este tipo de instrucciones trabajan con datos de tipo
lógico (también llamado booleano).
Existen diversas instrucciones condicionales, como if
(presente en casi todos los lenguajes), y case (o
switch...case) que está en muchos lenguajes (pero
no en python, pero puede simularse fácilmente con
condicionales múltiples).
Necesidad de las instrucciones condicionales
Ejemplo:
si llueve entonces
vamos al cine
en caso contrario
vamos a dar un paseo
fin si
‘llueve’ es una condición lógica (verdadero si
está lloviendo y falso si no).
Instrucciones condicionales en python (I/II)
En el caso más simple, se chequea un valor lógico: si
es verdadero se ejecuta una parte del código y si es
falso no (a veces se ejecuta otra parte del código).
si ... entonces
se codifica en python:
if ... :
Instrucciones condicionales en python (II/II)
en caso contrario se codifica en python (y otros
lenguajes) usando else (no olvidarse del carácter :
después en python).
fin si no hace falta codificarlo en python: acaba el
fragmento de código desindentando.
En python el indentado de las lı́neas es parte de la
sintaxis.
Condicional simple
(Nótese el indentado y el carácter :)
if condicion:
# código que se ejecuta
# si condicion es verdadera
...
...
...
# código que se ejecuta después
Condicional doble
if condicion:
# código que se ejecuta
# si condicion es verdadera
...
else:
# código que se ejecuta
# si condicion es falsa
...
# código que se ejecuta después
Ejemplo de condicional (en python)
Convierte un número en 0.0 si es negativo,
multiplicándolo por 2.0 en otro caso:
if x < 0.0:
x = 0.0
else:
x = 2.0*x
Ejercicio A6 (para resolver en clase)
Prepare una función en python que devuelva el signo
de un número: −1.0 si es negativo, 0.0 si es nulo, y
1.0 si es positivo.
Solución al ejercicio A6
def signo (x):
# devuelve el signo de x
if x == 0.0:
return 0.0
if x < 0.0:
return -1.0
else:
return 1.0
Condicional múltiple
if condicion1:
# código que se ejecuta
# si condicion1 es verdadera
...
elif condicion2:
# se ejecuta si condicion1 es falsa
# y condicion2 es verdadera
...
else:
# código que se ejecuta
# si ambas condiciones son falsas
...
# código que se ejecuta después
Ejercicio A7 (para resolver en clase)
Prepare un fragmento de código en python con la
función definida a trozos siguiente:

0,
x ≤ a,


 x−a , a < x ≤ b,
b−a
f (x, a, b, c) =
c−x
, b < x ≤ c,


 c−b
1,
c < x.
Solución al ejercicio A7
def f (x, a, b, c):
# Debe ser a < b < c
if x <= a:
return 0
elif x <= b:
return (x-a)/(b-a)
elif x <= c:
return (c-x)/(c-b)
else:
return 1
Ejercicio propuesto A8 (I/III)
(Este ejercicio se propone como tarea a entregar por
el estudiante.)
Despreciando el rozamiento del aire, la velocidad de
escape de un cuerpo lanzado desde la superficie terrestre
es:
p
vE = 2gR,
donde g es la aceleración de la gravedad en la superficie
y R el radio terrestre.
Ejercicio propuesto A8 (II/III)
Cuando lanzamos un cuerpo con velocidad inicial v < vE
desde la superficie (despreciando el rozamiento del aire)
alcanza una altura máxima:
R
.
h=
1 − (v/vE )2
Cuando v ≥ vE , entonces a una gran distancia de la
Tierra su velocidad final es:
q
2.
vf = v 2 − vE
Ejercicio propuesto A8 (III/III)
Prepare un program en python que, tomando como
datos conocidos g y R (asignados directamente), nos
pida v por teclado, que calcule la velocidad de escape (y
la imprima), y que
si la velocidad es menor que la de escape imprima
la altura máxima que alcanza;
si la velocidad es igual a la de escape que lo diga;
si la velocidad es mayor que la de escape, que diga
que el cuerpo escapa de la Tierra y que imprima
la velocidad final.
Comandos en programación imperativa
Declaración de tipos de dato.
Entrada y salida.
Operaciones con datos.
Subrutinas y funciones.
Condicionales.
Bucles.
Repitiendo la ejecución de código (bucles)
En ocasiones debe repetirse parte del código un
número de veces (conocido a priori o no). Para ello
se utilizan los bucles.
Necesidad de los bucles (I/II)
Ejemplo, para ir al cine se necesita:
nos ponemos en la cola
hacer (cola)
si llegamos a la ventanilla entonces
compramos la entrada
salimos de hacer (cola)
fin si
fin hacer
entramos al cine
Necesidad de los bucles (II/II)
Como vemos, existe la necesidad de verificar una
condición lógica (en el ejemplo, ‘si llegamos a la
ventanilla’) para salir del bucle. (En otro caso el bucle
serı́a infinito.)
Cada repetición del bucle se denomina iteración.
Tipos de bucles
Existen dos tipos (principalmente) de bucles:
los que se repiten un número indeterminado de
veces: while y repeat. . . until (o en su forma
equivalente do. . . while).
de los que se conoce previamente el número de
iteraciones, o bucle con contador: for.
Saliendo la ejecución de un bucle
A veces, la salida del bucle no se realiza al principio o
final del bucle (depende evidentemente del algoritmo
codificado).
En esas ocasiones se necesita usar otras instrucciones,
como break (salida del bucle directamente) y
continue (continua con la siguiente iteración,
saltándose el código que falta hasta el final del bucle).
Bucle while (I/II)
El bucle con un número indeterminado de iteraciones más
utilizado codifica:
mientras condición hacer
código del interior del bucle
fin hacer
En python es:
while condición :
código del interior del bucle
Bucle while (II/II)
El chequeo de la condición se realiza al principio: si la
condición es falsa ya no se ejecuta el bucle, y se salta al
código que está después del bucle.
Lo habitual es que la condición dependa de una variable
que va modificándose en el interior de bucle, pues sino
el bucle serı́a infinito (no acaba nunca).
Ejemplo de bucle while (en python)
# imprime los números enteros
# cuyo cubo es menor que un lı́mite dado
n3max = input("Introduzca el lı́mite ")
n, n3 = 1, 1
while n3 < n3max:
print(n)
n = n+1
n3 = n**3
Ejercicio A9 (para resolver en clase)
Prepare un fragmento de código en python que
imprima las diez primeras longitudes de la serie de
Balmer del hidrógeno (en nanómetros):
λ = 364.6
n2
,
n2 − 4
n > 2.
Solución al ejercicio A9
# Serie de Balmer del hidrógeno
n, nt = 3, 10
while n <= nt:
n2 = n**2 # n2 es una variable auxiliar
print(364.6*n2/(n2-4))
n = n+1
Ejercicio propuesto A10
Prepare un programa en python que repita un bucle
para simular una evolución temporal, variando el
tiempo t desde un instante inicial, ti , con un intervalo
dt, mientras que el tiempo sea menor o igual que tf .
Dentro del bucle se imprimirá el valor de t.
Bucle repeat ... until (repetir ... hasta que)
Este bucle chequea la condición al final, y se ejecuta al
menos una vez:
repetir
código del interior del bucle
hasta que condición (fin repetir)
En python se puede codificar usando un bucle infinito:
while True :
código del interior del bucle
if condición : break
Ejercicio A11 (para resolver en clase)
Prepare un programa que imprima los números cuyo
cubo es menor que un lı́mite dado usando un bucle
con chequeo de condición al final.
Solución al ejercicio A11
# imprime los números enteros
# cuyo cubo es menor que un lı́mite dado
n3max = input("Introduzca el lı́mite ")
n = 1
while True:
print(n)
n = n+1
if n**3 > n3max: break
Bucle con salida intermedia
En un bucle con salida intermedia existe una
condición por el medio que saca la ejecución del bucle
(y la pasa a la instrucción que sigue al final del bucle).
Ejemplo:
while cond1 :
código del bucle primera parte
if cond2 : break
código del bucle segunda parte
Ejercicio propuesto A12
P∞ −n
Se quiere sumar la serie: S =
, |z| > 1,
n=0 z
−n
tomando un número de términos n tal que |z | < EPS,
siendo este último un valor pequeño, pongamos 10−10 .
Prepare un programa en python que nos pida z por
teclado y que imprima la suma obtenida mediante el
criterio anterior. Use un bucle infinito con una condición
intermedia para salir de él.
Uso de continue
El comando continue nos permite saltarnos desde un
punto dado de un bucle hasta el final y empezar otra
iteración nueva del bucle.
while cond1 :
código del bucle primera parte
if cond2 : continue
código del bucle segunda parte
Si la condición cond2 es verdadera se salta la segunda
parte. Si es false se continua con la segunda parte.
Ejercicio A13 (para resolver en clase)
Prepare un programa en python que nos pida por
teclado un número lı́mite, nmax, y que imprima los
números que son múltiplos de 7 entre 1 y nmax.
Use el comando continue.
(En python la operación a %b devuelve el resto de
dividir a entre b.)
Solución al ejercicio A13
# múltiplos de 7
nmax = input("nmax ")
n = 0
while n < nmax:
n = n+1
if n %7 != 0: continue
print(n)
Bucle con contador (I/III)
Este bucle está controlado por una variable que se va
cambiando según un patrón y se chequea frente a un
valor final.
En algunos lenguajes, como C, el cambio en la
variable en el bucle for puede ser realizado de la
manera en que desee el programador.
Realmente, en C no existe el bucle controlado
por variable con un número conocido a priori de
iteraciones.
Bucle con contador (II/III)
En muchos lenguajes existe un tipo de bucle cuyo
número de iteraciones es conocido a priori.
Las iteraciones están controladas por una variable
que no se debe (en algunos lenguajes no se puede)
modificar en el interior del bucle, sino sólo al final del
bucle de manera automática.
Un ejemplo de este bucle es el DO de las últimas
versiones de Fortran, y el bucle FOR...NEXT del
lenguaje Basic.
Bucle con contador (III/III)
Tendrı́amos (NO es código python):
para i = inicio hasta final incremento delta hacer
código del bucle
fin hacer
La variable i toma los valores: inicio, inicio + delta,
inicio + 2delta, . . . , mientras que su valor sea i ≤ final .
Por defecto delta = 1.
Si delta > 0 e inicio > final , o si delta < 0 e
inicio < final , no se realizan las iteraciones.
Bucle con contador en python
En python se puede ‘simular’ este bucle con contador
clásico mediante una función que nos devuelve una lista
fija de valores que cumple un patrón.
La función es range(inicio, final , delta), teniendo en
cuenta que en este caso no se llega a final . Se usa
for i in range(inicio, final , delta):
interior del bucle
La variable i toma los valores: inicio, inicio + delta,
inicio + 2delta, . . . , mientras que su valor sea i < final .
Por defecto inicio = 0, delta = 1.
Ejercicio A14 (para resolver en clase)
Repita el ejercicio A9 pero usando un bucle for.
Prepare un fragmento de código en python que
imprima las diez primeras longitudes de la serie de
Balmer del hidrógeno (en nanómetros):
λ = 364.6
n2
,
n2 − 4
n > 2.
Solución al ejercicio A14
# Serie de Balmer del hidrógeno
nt = 10
for n in range(3, nt+1):
n2 = n**2
print(364.6*n2/(n2-4))
Ejercicio propuesto A15
Pida por teclado un número entero postivo, n.
Luego imprima los números n, n − 1, n − 2,. . . , 1
usando un bucle for y range de la manera adecuada.
Bucle for genérico en python
En python el bucle for está preparado para que una
variable tome, en cada iteración, los valores de los
elementos de una lista:
for x in L:
interior del bucle
En la primera iteración x toma el valor de L[0] (primer
elemento), en la segunda x toma el valor de L[1], . . . ,
hasta que se acabe la lista.
Ejercicio A16 (para resolver en clase)
Determine la suma de los elementos positivos de una
lista de números, L.
Tome, por ejemplo, la lista:
L = [12, -3.0, 1, 0.0, -6.8]
Solución al ejercicio A16
# L es una lista conocida
L = [12, -3.0, 1, 0.0, -6.8]
suma = 0.0
for x in L:
if x > 0:
suma = suma+x
print(suma)
Ejercicio propuesto A17
(Este ejercicio se propone como tarea a entregar por
el estudiante.)
Sea una progresión geométrica, de razon r, con
primer término a, con n términos (incluyendo el
primero). Estos datos se piden por teclado.
Prepare un programa que calcule e imprima la suma
de los términos de la progresión.
Ejercicio propuesto A18 (I/II)
(Este ejercicio se propone como tarea a entregar por
el estudiante.)
Un método de resolución de ecuaciones de la forma
f (x) = 0, mediante iteraciones a partir de un valor
aproximado x0 de la raı́z, se obtiene poniendo la
función en la forma x = g(x) e iterando:
xn+1 = g(xn )
hasta que |xn+1 − xn | < EPS, siendo este último un
valor pequeño, pongamos 10−10 .
Ejercicio propuesto A18 (II/II)
El método no siempre converge (y hay que despejar
la x de otra forma).
Diseñe un programa en python que nos resuelva
x3 = sin x, partiendo de un valor x0 = 1.0 usando
el método iterativo propuesto. El programa debe
imprimir la raı́z por pantalla.
Para evitar bucles infinitos haga como mucho n =
100 iteraciones y si se llega a ellas sin convergencia,
que imprima un aviso de falta de convergencia.