jueves, 3 de noviembre de 2011

Clases en python

No estoy suficientemente fogueado en el tema de programación orientada a objetos, creo que si nunca se escuchó el término es bueno mirar un poco en wikipedia para hacerse alguna idea. Brevemente se podría decir que las clases en python son definiciones, plantillas. Mientras que los objetos son instancias.

Ejemplo sencillo:

class Rectangulo:
    def __init__(self,pbase,paltura):
         self.base=pbase
         self.altura=paltura
    def area(self):
         return self.base*self.altura

rec1=Rectangulo(3,2)
rec2=Rectangulo(8,5)

print rec1 #Muestra una direccion de memoria
print rec1.area() #Muestra 6
print rec2.area() #Muestra 40

En wikipedia hay un ejemplo bien explicado: clases en Python

sábado, 3 de septiembre de 2011

Algunos ejercicios sobre listas

a) Definir una función que reciba un entero y retorne una lista, donde la cantidad de elementos es el número que recibe por parámetro, y el valor del elemento en cada posición es igual al índice que ocupa en la lista.

def nlista(numero):
lista=[]
for i in range(numero):
lista.append(i)
return lista
n=input("Ingrese un numero: ")
print nlista(n)

El range ya lo usé en otros ejemplos pero básicamente usa un intervalo [a,b) para especificar el rango. En este caso va de 0 a numero-1.

b) Definir una función que recibe dos parámetros desde y hasta, y retorne una lista donde los elementos vayan de desde a hasta. Resolver el ejercicio con un while y luego con un for.
def ejb_while(desde,hasta):
i=desde
l=[]
while i<=hasta:
l.append(i)
i+=1
return l
def ejb_for(desde,hasta):
l=[]
j=desde
for i in range(desde,hasta+1):
l.append(i)
return l
a=input("Ingrese un numero: ")
b=input("Ingrese otro numero: ")
print ejb_while(a,b)
print ejb_for(a,b)
c) Definir una función que recibe tres parámetros desde, entonces y hasta, y retorne una lista donde los elementos comiencen en desde, sigan con entonces a hasta. Resolver el ejercicio con un while y luego con un for. Por ejemplo, supongamos que la función se llama enumFromThenTo, los retornos de las siguientes llamadas serían:
enumFromThenTo(1, 3, 11) -> [1, 3, 5, 7, 9, 11]
enumFromThenTo(1, 4, 20) -> [1, 4, 7, 10, 13, 16, 19]
def enumFromThenTo_while(desde,entonces,hasta):
saltos=entonces-desde
l=[desde]
i=entonces
while i<=hasta:
l.append(i)
i=i+saltos
return l
def enumFromThenTo_for(desde,entonces,hasta):
l=[desde,entonces]
saltos=entonces-desde
for i in range(entonces+saltos,hasta+1,saltos):
l.append(i)
return l
print enumFromThenTo_while(1,4,20)
print enumFromThenTo_for(1,4,20)
En este caso usé el range con 3 campos, el tercero indica que avance de saltos en saltos.

d) Definir una función que construya una lista de enteros con la lista que recibe por parámetro, pero con los elementos al revés. Por ejemplo: reverse([2, 3, 5, 7, 11]) -> [11, 7, 5, 3, 2]
def reverse(lista):
laux=[]
i=len(lista)-1
j=0
while i>=0:
laux.append(lista[i])
i-=1
return laux
print reverse([2,3,5,7,11])
e) Definir una función que construya una lista de enteros con los elementos de una lista, pero solo aquellos en las posiciones pares. Por ejemplo: posicionesPares([3, 14, 16, 9, 4, 2, 716]) -> [3, 16, 4, 716]
def posicionesPares(lista):
laux=[]
i=0 #Denota la posicion del elemento en la lista
for e in lista: #e denota el elemento de la lista
if i % 2==0:
laux.append(e)
i+=1
return laux
print posicionesPares([3,14,16,9,4,2,716])
f) Definir una función que construya una lista de enteros con la lista que recibe por parámetro, pero sin incluir los elementos repetidos. Por ejemplo: sinRepetidos([2, 3, 5, 2, 11, 5]) -> [2, 3, 5, 11]
def sinRepetidos(lista):
laux=[]
for e in lista:
if e not in laux:
laux.append(e)
return laux
print sinRepetidos([2,3,5,2,11,5])
g) Definir una función que construya una lista de enteros con los elementos que las dos listas pasadas por parámetro tienen en común. Por ejemplo: intersección([2, 3, 5], [2, 11, 5]) -> [2, 5]
def interseccion_lista(lista0,lista1):
laux=[]
for e in lista0:
if e in lista1:
laux.append(e)
return laux
print interseccion_lista([2,3,5],[2,11,5])
h) Definir una función que modifique una lista pasada por parámetro, de forma que todos sus elementos tengan un valor menor o igual a max. Si el valor es mayor se le asignará a la celda el valor de max.
Por ejemplo: ceiling([3, 14, 16, 9, 4, 2, 716], 10) -> [3, 10, 10, 9, 4, 2,
10]
def ceiling(lista,maximo):
laux=[]
for e in lista:
if e>maximo:
laux.append(10)
else:
laux.append(e)
return laux
print ceiling([3,14,16,9,4,2,716],10)
i) Dada una lista X compuesta de n elementos, se desea diseñar una función que calcule la desviación estándar D dada por la fórmula:
def D(x):
suma=0
for e in x:
suma+=e
promedio=float(suma)/len(x)
bajo_raiz=0
for e in x:
bajo_raiz+=(e-promedio)**2
numerador=bajo_raiz**0.5
d=numerador/(len(x)-1)
return d
print D([1,2,3])

Para elevar un número a un exponente se usa "**", la identación es obligatoria y se me complicó subir bien el código por ser medio chambón jeje

Funciones para strings y para listas (algunas)

Funciones para strings:

len(string): nos da la cantidad de caracteres de un string
find(substring): busca un elemento en un string y devuelve el índice en donde se encuentra por primera vez y si no lo encuentra devuelve -1. (El índice empieza en 0 y va hasta len(string)-1) .
index(substring): es igual que find sólo que si no lo encuentra en vez de -1 devuelve un error.
isalpha(string): devuelve True cuando el string contiene solo letras, en caso contrario retorna False.
isdigit(string): devuelve True cuando el string contiene solo números, en caso contrario retorna False.
split(string): convierte un string a una lista
lower(string): convierte un string a otro cuyos caracteres quedan todos en minúscula. Los caracteres que no sean letras quedan inmutables.
upper(string): convierte un string a otro cuyos caracteres quedan todos en mayúscula. Los caracteres que no sean letras quedan inmutables

Funciones para listas:

len(lista): parecido al len de strings, en las cadenas nos da la cantidad de elementos que ésta tiene.
append(elemento): agrega un elemento a una lista
index(elemento): nos dice el subíndice del elemento que le pasamos por parámetro (el primero que encuentra) en una lista. (El subíndice puede tomar valores entre 0 y len(lista)-1).
remove(elemento): borra un elemento de una lista (el primero que encuentra que sea elemento).
del(lista[x]): borra una cantidad especifica de elementos (la cual se especifica mediante un rango de subíndices) de una lista y con sólo "del lista" la lista entera.
count(elemento): Nos dice la cantidad de veces que el elemento se encuentra en la lista
set(lista): elimina repetidos

Otro programa de strings en python

Dado un string indicar:
* Cantidad de palabras

* Largo promedio de las palabras
* Palabra más corta
* Palabra más larga

Programar una función separada para cada uno de los puntos (en los dos primeros casos la función debe devolver un entero, y en los últimos dos un string).
def cant_palabras(cadena):
lista=cadena.split()
j=0
for i in lista:
j+=1
return j
def largo_promedio(cadena):
lista=cadena.split()
promedio=0
for e in lista:
promedio+=e
return float(promedio)/len(lista)
def palabra_mas_corta(cadena):
min=len(cadena)
lista=cadena.split()
for i in lista:
if len(i) < min:
min=len(i)
palabra=i
return palabra
def palabra_mas_larga(cadena):
lista=cadena.split()
palabra_larga=lista[0]
for e in lista:
if len(e) > len(palabra_larga):
palabra_larga=e
return palabra_larga
La función split() convierte un string a una lista. Por ejemplo. Si ejecutamos el siguiente código:
a="Hola como estas"
l=a.split()
print l

Nos va a dar como resultado la lista: ['Hola', 'como', 'estas']

Reemplazar cadenas

Construir una función que solicite al usuario 3 cadenas a, b y c, y que reemplace b por
c en a. La función debe mostrar por pantalla la cadena a una vez reemplazado el texto.
def reemplazar(a,b,c):
i=0
resultado=""
while i<=len(a)-len(b):
if a[i:i+len(b)]==b:
resultado+=c
i+=len(b)
else:
resultado+=a[i]
i+=1
resultado+=a[i:]
return resultado
reemplazar("Programacion","gramacion","bando")

La función len() devuelve la cantidad de caracteres de una cadena. El código anterior daría como resultado: Probando

Factorial de un número

Dos formas de hacerlo:

Primera forma: recursivamente.
def factorial(n):
if n==0:
return 1
else:
return n*factorial(n-1)

Segunda forma: con while.
def factorial_noR(n):
aux=n
if aux==0:
resultado=1
else:
resultado=1
while aux>1:
resultado=resultado*aux
aux=aux-1
return resultado

viernes, 2 de septiembre de 2011

Aproximar pi con un número racional dentro de un rango dado

Este programa en python devuelve una tupla. La cual contiene en el primer campo a la mínima distancia entre el racional y el valor de pi, el segundo al valor de ese racional convertido a float, el tercero al numerador y el cuarto al denominador. Los valores del numerador y el denominador varían cada uno entre 1 y 1000.
import math

def racional_cerca_de_pi(m,n,a,b):
min=b
for i in range(1,n+1):
for j in range(1,m+1):
v=i/float(j)
d=math.fabs(math.pi - v)
if d < min:
min=d
a=i
b=j
return (min,a/float(b),a,b)
print racional_cerca_de_pi(1000,1000,1,1)

La librería math nos proveé de funciones como fabs() que da el valor absoluto de un número y pi el valor de pi =P. El resultado es: (2.667641894049666e-07, 3.1415929203539825, 355, 113)