21
U8 Repetición controlada por expresión lógica y cadenas 1 Flexibil idad

U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

Embed Size (px)

Citation preview

Page 1: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

1

U8Repetición controlada por

expresión lógica y cadenas

Flexibilidad

Page 2: U8 Repetición controlada por expresión lógica y cadenas 1 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

Page 3: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

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

Page 4: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

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

Page 5: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

5

  integralX2_v1.py1""" Probador de integral X2 entre a y b """

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))

Page 6: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

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

Page 7: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

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

Page 8: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

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

Page 9: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

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

Page 10: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

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)

Page 11: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

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

Page 12: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

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

Page 13: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

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

Page 14: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

14

U6 NumPy para implementar array en Python • Además de tuplas, listas• ¿por qué? Interpretado/compilado

Page 15: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

15

U9Estructuras: Agrupación de elementos de distinto tipo

Barajar complejidad

Page 16: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

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

Page 17: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

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

Page 18: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

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

Page 19: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

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')

Page 20: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

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)

Page 21: U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad

21