1
U8Repetición controlada por
expresión lógica y cadenas
Flexibilidad
2
Datos
problema
simple
entero realcarácterbooleano
Ingeniero = Oreja+catalejomodelo
orde
nado
r
solución
asignación/referencia
Llamada procedimiento
whilefor Do while
if c: bloque1[ else: bloque2]
n bucles
0 o 1alternativas
1 o n0 o n
iterativo
n conocido
recursivo
n desconocido
case
gestión excepciones
Subprogramación
procedimiento
barajar complejidad
Proceso
hacer
función
Disponible en todos los lenguajesFrecuente en otros lenguajes y no disponible en PythonDisponible en Python, no frecuente en otros lenguajes
compuesto
arregloLista/tupla
EstructuratuplaNombre/record/clase
fichero
cadena
1secuencias
Repetición controlada por expresión lógica• Sintaxis: while expresion_booleana: cuerpo
ExprLog
TRUE
FALSE
cuerpo
Siguiente instrucción
n = 10while n<=10: print (n) n = n-1
(1674) Gregory algoritmo: la raíz cuadrada de un número n>=0, mientras ABS(aprox-nuevaAprox) >=precision nuevaAprox=(aprox+n/aprox)/2
a b
Integral de x2, entre 1 y 2, paso= 0,01
• Problema?
• Estudio de la convergencia: Casos posibles vieja>r; vieja<r; vieja=r
• Ojo comparación de floats r
4
raizNewtonRapson.py1 """probador del cálculo de la raiz cuadrada de n iterativo """2 3 def sqrtNR(n, precision):4 """ num,float-->float5 OBJ: raiz cuadrada de n, con precisión >= precision6 PRE: n>0, 0<precision<=n """7 aprox = n/2.0 #me vale cualquier positivo8 cambio = n # como mínimo su propio valor9 while cambio>=precision:
10 nAprox = (aprox+n/aprox)/2.011 cambio = abs(aprox-nAprox)12 aprox = nAprox13 print( 'traza', aprox) #trazador. Quitar14 return aprox15 16 print('raiz =', sqrtNR(9,0.1))
traza 3.25 traza 3.0096153846153846 traza 3.000015360039322 raíz =3.000015360039322
5
integralX2_v1.py1""" Probador de integral X2 entre a y b """
2
3def integralX2(a,b,inc):
4 """ float,float,floatfloat
5 OBJ: integral definida entre a y b, en inc incrementos:
6 método de los rectángulos
7 PRE: a<=b, 0<inc<= b-a """
8 i = 0 # acumulador de integral
9 x = a # valor de la abcisa
10 while x!=< b:
11 i = i+x*x*inc # acumula el área de un rectángulo
12 x = x+inc
13 print(x, i)
14 return i
15
16print(integralX2(1.0,2.0,0.1))
6
Esquemas de programación
• Bucle con condición múltiple y discriminación a la salida• Pos de primera aparición de elemento en una lista (si es que está)
• El esquema centinela
7
Bu
cles
(1-n
)Opción Código ejemplo (en bucle1_n.py)#1 repetir cuerpo del bucle
e= input('Introduce inicial de nombre de estación del año: ')
while e.lower() not in ('p', 'v', 'o','i'): e = input('Introduce inicial de nombre de estación del año: ')
#2 Sub-programar cuerpodel bucle
def estacionPedida (): e = input('Introduce inicial de nombre de estación del año: ') error = e.lower() not in ('p', 'v', 'o','i') if error: print( e, 'no es el nombre de una estación del año') print('vuelve a intentarlo.') return error,e error,e = estacionPedida ()while error: error,e = estacionPedida ()print('hecho')
#3forzado artificial de entrada
pedir = Truewhile pedir: e = input('Introduce inicial de nombre de estación del año: ') pedir = e.lower() not in ('p', 'v', 'o','i') if pedir: print( e, 'no es el nombre de una estación del año') print('vuelve a intentarlo.')print('hecho')
Cuerpo 1 vez
Cuerpo 0-n
def subprograma
Pedir mejor que error
8
Bu
cles
(1-n
) condicion= Falsewhile True: if condicion: break print('hacer lo que sea') condicion = True
print('me sali')
condicion= Falsewhile not condicion: print('hacer lo que sea') condicion = True
print('me sali')
DA TERROR Y era INNECESARIO
9Esq
uem
a p
edir
dato
s al
usu
ari
o
def esCosa (cosa): """tipo de cosa --> booleano OBJ: True si es "cosa" valida """
return cosa cumple condicionParaSerCosa?
def cosaPedida (): #restricciones si las hay + msg solicitud """str --> tipo de cosa OBJ: pide cosa hasta que cumpla restricciones del mundo real"""
cosa = noEsCosa while not esCosa(cosa): cosa = input('dame una cosa:') return cosa
lectivos=('lunes','martes','miércoles','jueves','viernes')def esLectivo(dia): """str-->bool OBJ: True si dia es lectivo PRE: lectivos definido """ return dia in lectivos
def lectivoPedido(msg): """str-->str OBJ: solicita al usuario dia hasta que sea un lectivo """ dia='' while not esLectivo(dia): dia=input(msg) return dia
print(lectivoPedido('¿que lectivo?: '))
Cosa= DNIContraseñaFechaColorHoraEntero,….
Si esCosa es simple se puede no subprogramar
Si esCosa es trivial no subprogramar
10Esq
uem
a p
edir
dato
s al
usu
ari
odef enteroPedido (min,max, msg): """ int,int, str,str-->int OBJ: pide entero a usuario, entre min y max, mostrando msg PRE: min<=max """
pedir = True while pedir or not (min<=n<=max): try: n = int(input(msg)) pedir = False except:print('debe ser un entero. ', end='') return n
Pedir un entero es tan genérico que no he querido poner un número no válido.
min-1 o max+1 valdrían (podría desbordar)
11
Esquema
m
enú
Desarrolla la aplicación de combinatoria que ofrece un menú en el que el usuario selecciona la operación a ejecutar. Le pide los datos que necesite y le muestra el resultado. La interfaz de usuario deseada es: COMBINATORIA
==============1.-Variaciones2.-Combinaciones3.-Permutaciones4.- Salir Teclee la opción elegida: __
Recordatorio: V(m,n)=m!/(m-n)!; P(n)=n!; C(m,n)=V(m,n)/P(n); n,m>=0.
combinatoria
variacionespintaMenu salida
CentrarRotulo
enteroPedido combinaciones
permutaciones
factorial
12
Com
bin
ato
riapintaMenu()opcion = enteroPedido(1,4,'')if opcion==1: m = enteroPedido(1,20,'elementos totales: ','') n = enteroPedido(1,m,'elementos a agrupar: ','') print('variaciones',m,'de', n,'=', libMat.variaciones(m,n))elif opcion==2: m = enteroPedido(1,20,'elementos totales: ','')
n = enteroPedido(1,m,'elementos a agrupar: ','') print('combinaciones',m,'de', n,'=', libMat.combinaciones(m,n))elif opcion==3: m = enteroPedido(1,20,'elementos totales: ','') print('permutaciones', m,'=',libMat.permutaciones(m))elif print('cerrando la aplicación')
Un condicional está diseñado para hacer cosas distintas en cada pata… sacad factor común
13
Cadenas:• Creación general, vacía, unitaria• Acceso a elementos: a[0..n-1]; hacia atrás a[-n..-1]; aborto i>=n, operador slice• Operaciones: concatenar; is , comparación, in • Funciones: len, min, max• Métodos: s.index(x,[i,j]), s.count(x) help(str)
Método Devuelve una…
s.upper() copia de s con todas las letras en mayúsculas
s.lower() copia de s con todas las letras en minúsculas
s.replace(old, new[,count])
copia de s con las count ocurrencias primeras de old sustituidas por new. Todas si no especificado
s.strip([chars=˽]) copia de s eliminados los caracteres char de cabecera y cola. Por defecto, espacio blanco ‘˽’s.swapcase() copia de s intercambiando minúsculas y mayúsculas
s.title() copia de s con primera letra de cada palabra en mayúscula y resto en minúsculas.rsplit(sep=None) lista de palabras en s, considerando sep como separador
com
ún a
tula
s, li
stas
14
U6 NumPy para implementar array en Python • Además de tuplas, listas• ¿por qué? Interpretado/compilado
15
U9Estructuras: Agrupación de elementos de distinto tipo
Barajar complejidad
16
Datos
problema
simple
entero realcarácterbooleano
Ingeniero = Oreja+catalejomodelo
orde
nado
r
solución
asignación/referencia
Llamada procedimiento
whilefor Do while
if c: bloque1[ else: bloque2]
n bucles
0 o 1alternativas
1 o n0 o n
iterativo
n conocido
recursivo
n desconocido
case
gestión excepciones
Subprogramación
procedimiento
barajar complejidad
Proceso
hacer
función
Disponible en todos los lenguajesFrecuente en otros lenguajes y no disponible en PythonDisponible en Python, no frecuente en otros lenguajes
compuesto
arregloLista/tupla
EstructuratuplaNombre/record/clase
fichero
cadena
1secuencias
17
STRUCT/STRUCTURE/RECORD
• Elementos todos del mismo tipo acceso por orden: ARRAY• ¿sin orden? acceso por nombre: Tipos definidos por el usuario:
Constructores de tipo. • Listas y tuplas son tipos en Python. Pero ahora tengo que dar nombres.
Necesito un constructor• Alternativas en Python namedTuple, la clase Record, “clases pobres”
• Nuestro interés diseño de la solución más que la forma de implementación en un lenguaje concreto
18
NamedTuples• from collections import namedtuple• La sintaxis de la declaración: nombreDelTipo= namedtuple(externo, [campo1,…,campon])
• Ejemplo: tPunto = namedtuple('Punto',['x','y'])• Creación objeto y acceso a elementos :
• namedtuple especialización de tipo tupla (vale todo lo que hacía con tuplas)• Convenio: Tipos creados x programador empiezan por t: tFecha, tAlumno
>>> p1 = tPunto(2.0,3.0)>>> p1.x #acceso notación punto2.0>>>p1[1] #acceso por posición3.0
19
• Recorrido de los elementos
• Modificación de elementos :
• Los elementos pueden ser de cualquier tipo
>>> p = tPunto(11.0,22.0)>>> p = tPunto(p.x,33.0) #mantengo el valor de x, cambio el de y>>> pPunto(x=11.0, y=33.0)
>>>p = tPunto(33.0,44.0)>>>p = p._replace(x=2.0,y=3.0) # devuelve copia con valores cambiados>>>pPunto(x=2.0, y=3.0)
NamedTuples
for coordenada in p: print(coordenada)
tSegmento = namedtuple('Segmento','pIni, pFin')
20
Haz un subprograma que calcule la distancia entre dos puntos. Calcula con el tamaño de un segmento pasándole los puntos que lo definen.
En el lenguaje ordinario hablamos del tamaño de un segmento, no de la distancia entre sus extremos. Haz un subprograma que calcule el tamaño de un segmento.
Apoyándote en el módulo punto, haz un programa que aproxime Π por el método de Montecarlo, areaArco=Πr2/4
areaCuadrado=r*rpuntos dentro/puntos totales= Πr2/4r2; despejando Π=4 *puntos dentro/puntos totales
Incluye en el módulo punto una función que calcule si un punto (x,y) está inscrito en una circunferencia de radio r, con centro en el eje de coordenadas. Pista: teorema de Pitágoras.
def puntoAleatorio(): """ nada --> tPunto OBJ: crea un punto aleatorio 0<=x,y<=1 """ from random import random x = random() y = random() return tPunto(x,y)
21