sábado, 30 de junio de 2018

Cifras pares e impares en Python

Reto: Cifras pares e impares

Generar un número aleatorio entero entre un millón y dos millones. Imprimir ese número en pantalla y decir cuántas cifras pares e impares tiene.




Método 1

Generamos un número aleatorio entero, lo convertimos a cadena con str, recorremos sus valores con un bucle for y por cada elemento lo convertimos nuevamente en número con int para ver si se trata de un número par. Finalmente contamos los pares e imprimimos el resultado.

from random import randint
x = randint(1000000, 2000001)
print(x)
x=str(x)
par=0
for i in x:
  if int(i)%2==0:
    par+=1
print('Hay un total de',par,'cifras pares')
print('Hay un total de',7-par,'cifras impares')



Método 2

En este caso no convertimos el número aleatorio en una cadena sino que operamos todo el tiempo con valores numéricos. Para obtener las cifras individuales que componen el número que debemos analizar hemos creado una expresión z que por ser muy larga hemos descompuesto en dos expresiones parciales que hemos denominado e0 y e1.

import random
x = random.randint(1000000, 2000001)
print(x)
par=0
for i in range(1,8):
  e0=int(x/10**i)
  e1=int(x/10**(i-1))
  z=e1-e0*10 #obtenemos cada una de las cifras
  if z%2==0:
    par+=1
print('Hay un total de',par,'cifras pares')
print('Hay un total de',7-par,'cifras impares')

Para ilustrar el significado de los cálculos intermedios e0 y e1 elegimos el siguiente ejemplo para el número 1849253. La columna z nos proporciona cada una de la cifras por separado.

lunes, 25 de junio de 2018

Manejando onfocus en HTML

Hay un comando que se puede utilizar en HTML para que cuando se seleciona el campo se ejecute una funcion en JavaScript.

Codigo de ejemplo:
 <!DOCTYPE html>  
  <html>  
   <body>  
    Dime tu nombre: <input type="text" onfocus="funcion(this)">  
    <script>  
     function funcion(x) {  
       x.style.background = "yellow";  
     }  
    </script>  
   </body>  
 </html>  

En este ejemplo cambiamos el color de un cuadro de texto pero podía ejecutar cualquier codigo que se pueda meter en la funcion.

domingo, 24 de junio de 2018

Palíndromos en Python

Reto: Palíndromos

Dada una cadena decir si es un palíndromo.


También puede ver la entrada: Palíndromos en una frase


Método 1

Pedimos al usuario una palabra y la convertimos a minúsculas. Por ejemplo, Radar se transforma en radar y ahora comparamos el primer caracter con el último, el segundo con el anteúltimo y así sucesivamente. Pero no es necesario comparar todos, es suficiente con comparar la mitad de ellos para no duplicar trabajo.

def esPalindromo(palabra):  
 for i in range(0,int(len(palabra)/2)): #Es suficiente con analizar la mitad  
  if palabra[i]!=palabra[-i-1]:
   return False
 return True
palabra=input('Escriba una palabra: ').lower()  
print(palabra, '¿es un palindromo?',esPalindromo(palabra))  



Método 2

Pedimos al usuario una palabra y la convertimos en una lista. Distinguimos dos casos según la longitud de la palabra sea par o impar.

y=input('Dime una palabra: ')
x=list(y)
z=len(x)
i=z/2
if z%2==0:
  m=x[0:int(i)]
  m.reverse()
  q=x[int(i):int(z)]
  if m==q:
    print('Es un Palíndromo')
  else:
    print('No es un Palíndromo')
else:
  h=(z/2)-0.5
  m=x[0:int(h)]
  m.reverse()
  q=x[int(h+1):int(z)]
  if m==q:
    print('Es un Palíndromo')
  else:
    print('No es un Palíndromo')



Método 3

Pedimos una palabra al usuario y convertimos todos sus caracteres en minúsculas. Esto se hace para que al poner por ejemplo Menem nos diga que si es un palíndromo.

Para hacer el reverso del string y lo más sencillo es hacer y[::-1]. De esta forma al comparar una cadena alfanumérica con su reverso si son iguales entonces sabemos que se trata de un palíndromo.

y=input('Dime una palabra: ').lower()
if y==y[::-1]:
  print('Es un Palíndromo')
else:
  print('No es un Palíndromo')



Método 4

En este método la sentencia else sorprendentemente se sale del if.

y=input('Dime una palabra: ')
z=list(y)
x=-1
w=len(z)
while x<w:
  x+=1
  w-=1
  if z[x]!=z[w]:
    print('No es un Palíndromo')
    break
else:
  print('Si es un Palíndromo')



Método 5

Usamos una variable booleana de control.

p=input('Dime una palabra: ').lower()
es=True
for i in range(len(p)):
  if p[i]!=p[len(p)-i-1]:
    es=False
if es:
  print('Si es un palíndromo')
else:
  print('No es un palíndromo')



Método 6

Utilizamos ''.join(reversed(x)) para darle la vuelta a x y darle ese valor a y.

x=input('Dime una palabra: ').lower()  
y=''.join(reversed(x))
if y==x:
 print('Es un Palíndromo')
else:
 print('No es un Palíndromo')



Método 7

Invierte el orden de los elementos de la lista z.

y=input('Dime una palabra: ').lower()
x=list(y)
z=list(x)
z.reverse()
if z==x:
 print('Es un Palíndromo')
else:
 print('No es un Palíndromo')



Método 8

Usando la recursividad.
  • si la palabra tiene cero letras o una letra si es un palíndromo
  • de lo contrario compara la primera y la última letra de la palabra
  • si son diferentes no es un palíndromo
  • si son iguales
  • eliminamos la primera y la última letra de la palabra
  • volvemos a llamar a la función con esta palabra más pequeña

#usando la recursividad
def palindromo(palabra):
  if len(palabra)<=1: #si la palabra tiene cero letras o una letra si es un palíndromo
    print("Si es un palindromo")
  else:               #de lo contrario
    if palabra[0]!=palabra[-1]:  #compara la primera y la última letra de la palabra
      print("No es un palindromo") #si son diferentes no es un palíndromo
    else:                          #si son iguales
      palabra=palabra[1:-1]        #elimina la primera y la última letra del string
      palindromo(palabra)          #vuelve a llamar a la función con este string más pequeño

candidato=input('Dime una palabra: ').lower()
palindromo(candidato)


Nota

En la película La llegada (2016) la protagonista es una linguista que habla del nombre de Hannah indicando que es un palíndromo.

Calendario en Python

Reto: Calendario

Importar la librería calendar. Imprimir el calendario del mes actual.




Método 1

Importamos las librerías datetime y calendar. Calculamos con las variables x e y el año y el mes actuales. Finalmente imprimimos el calendario asociado a esas variables.

import datetime
import calendar
x= datetime.datetime.now().year
y= datetime.datetime.now().month
print(calendar.month(x,y))



Método 2

Obtenemos el año y el mes actuales por un método ligeramente diferente. Imprimimos el calendario sin usar la instrucción print y con el calendario comenzando la semana por domingo.

from datetime import datetime
import calendar
x= datetime.today().year
y= datetime.today().month
c = calendar.TextCalendar(calendar.SUNDAY)
c.prmonth(x, y)


Fecha y hora actuales en Python

Reto: Fecha y hora

Imprimir la fecha y hora actuales.




Método 1

Importamos la librería datetime.

import datetime
print('Fecha:',datetime.datetime.now())
print('Hora:',datetime.datetime.now().time())



Método 2

En este método, no importamos la librería completa, unicamente importamos una parte de ella.

from datetime import datetime
print('Fecha:',datetime.now()) 
print('Hora:',datetime.time(datetime.now()))

Funciones en Python

Reto: Funciones

Crear una función que calcule el cuadrado de un número. Probar la función con los números entre -10 y +10. Crear otra función que lo único que hace es imprimir al final la frase “Programa finalizado”. Ejecutar ambas funciones.




Método 1

Inicializamos la variable z en -10.
Disponemos de dos funciones que se ejecutan con las dos últimas líneas del programa.
La sentencia print(cuadrado(z)) llama a la función cuadrado y le pasa el valor -10.
La función cuadrado comienza inicializando la lista resultado como lista vacía.
Nos metemos en un bucle while que se repetirá hasta que z sea menor que 11.
Dentro del bucle lo que hacemos es añadir a la lista, con append, los cuadrados de z.
Incrementamos z de uno en uno con z+=1.
La función concluye con un return que devuelve la lista resultado ya completa, con todos los cuadrados de los números por los que ha variado z, que van entre -10 y +10.
La última línea del código llama a la función fin(), que no lleva argumento.
Esta función no contiene un return y lo que hace únicamente es imprimir la frase 'Programa finalizado'.

z= -10
def cuadrado(z):
  resultado=[]
  while z<11:
    resultado.append(z**2)
    z+=1
  return(resultado)
def fin():
  print('Programa finalizado')
print(cuadrado(z))
fin()


Método 2

Inicializamos la variable z en -10.
Disponemos de dos funciones. En este caso, existe un while que está fuera de la función y que la llama reiteradamente enviándole los valores de z que varían entre -10 y +10. Estos valores son recogidos por la función cuadrado que usa como argumento la variable n. Hemos querido llamar con otro nombre a la variable de la función para que veamos que no es necesario volver a llamarla z.
La función cuadrado retorna el cuadrado de z.
Dentro del bucle while se encuentra el print que imprime el valor que devuelve la función cuadrado.
La última línea de código llama a la función fin() que en este caso retorna la frase 'Programa finalizado'. Para mostrar una forma de trabajar diferente respecto al método anterior, en esta ocasión, el print no se encuentra en la función sino en la última línea del programa.


z=-10
def cuadrado(n):
  y=n**2
  return(y)
def fin():
  x=('Programa finalizado')
  return(x)
while z<11:
  print(cuadrado(z))
  z+=1
print(fin())


Método 3

Las dos últimas líneas de código ejecutan las dos funciones que existen. A la función cuadrado le pasamos el argumento z=10. Inicializamos la lista resultado como una lista vacía. Nos metemos en un bucle for que recorre los valores entre -z y +z con range. Calculamos el cuadrado de la variable auxiliar i y lo vamos añadiendo a la lista con append. Retornamos el resultado que se imprimirá en pantalla.
Finalmente llamamos a la función fin que imprime 'Programa finalizado'.


def cuadrado(z):
  resultado=[]
  for i in range(-z,z+1):
    resultado.append(i**2)
  return(resultado)
def fin():
  print('Programa finalizado')
print(cuadrado(10))
fin()


Método 4

En este caso la función cuadrado únicamente nos retorna el cuadrado del argumento que le pasemos y el bucle for se encuentra fuera de la función. Lo que hace el bucle es llamar a la función de forma reiterada pesándola los valores del argumento que varían entre -10 y +10.
La función fin no imprime nada, simplemente retorna su frase y ésta es impresa por la última línea de código.


def cuadrado(x):
  return x**2
for i in range(-10,11):
  print(cuadrado(i))
def fin():
  return 'Programa finalizado'
print(fin())

domingo, 17 de junio de 2018

Media de n números en Python

Reto: Media de n valores

Calcular la media de n números.




Método 1

El primer while permite preguntar cuántos números desea el usuario utilizar para calcular la media. Si el número es menor que 2 se insiste con la pregunta.
El segundo while permite ir preguntando por los números que compondrán la media.
Se usa la función calcular a la que pasamos dos argumentos. Una lista denominada numeros y la variable x que indica cuántos elementos tiene la lista. La función calcula la media y la devuelve con return.
Finalmente un print nos muestra en pantalla el valor que devuelve la función calcular.

x=0
u=0
numeros=[]
while (x < 2):
  x = int(input('¿Cuántos números quieres?'))
while (u < x):
  z = int(input('Dame un número:'))
  numeros.append(z)
  u+=1
def calcular(numeros,x):
  w= sum(numeros)
  v=w/x
  return(v)
print('Media = ', calcular(numeros,x))


Método 2

Este método es similar al anterior si bien hemos sustituido el segundo while por un for. Otra diferencia con el método anterior radica en que ahora no usamos una función que calcule le media. Lo que hacemos es imprimir directamente la media calculada dentro del print final.
Con el primer input usamos int y con el segundo usamos float. Esto nos permite capturar números decimales para hacer la media, pero cuando preguntamos por cuántos números quiere el usuario tenemos que usar int por ser un número entero.

x = 0
numeros=[]
while (x < 1):
  x = int(input('¿Cuántos números quieres?'))
for i in range(x):
  z = float(input('Dame un número:'))
  numeros.append(z)
print('Media = ', sum(numeros)/x)


Método 3

Calculamos la media utilizando la función media que tiene dos argumentos. Hemos puesto los nombres de los argumentos diferentes a los que se utilizan para llamar a la función. La función se llama con la última línea usando los argumentos numeros y x. La función recoge esos argumentos con los nombres lista y n. Se sabe quién es quién, por el orden. El primer argumento que se llama es el primer argumento de la función y el segundo argumento que se llama es el segundo argumento de la función.
Otra peculiaridad radica en que la función no retorna nada. No existe return. Lo que hace la función es imprimir dentro de ella usando un print que nos da directamente la media.

x=0
numeros=[]
while (x < 1):
  x = int(input('¿Cuántos números quieres?'))
for i in range(x):
  z = float(input('Dame un número:'))
  numeros.append(z)
def media(lista,n):
  print('Media = ', sum(lista)/n)
media(numeros,x)


Método 4

En este caso la función si utiliza un return y por tanto el print se encuentra fuera de la función.

x=0
numeros=[]
while (x < 1):
  x = int(input('¿Cuántos números quieres?'))
for i in range(x):
  z = float(input('Dame un número:'))
  numeros.append(z)
def media(lista,n):
  return(sum(lista)/n)
print('Media = ', media(numeros,x))


Método 5

En los métodos anteriores hemos preguntado siempre sobre cuántos números desea el usuario utilizar para calcular la media. En este caso, lo que hacemos es ir introduciendo números y nos preguntará por el siguiente, hasta que introduzcamos el valor 'n'. En ese momento se detendrá la petición de más números y nos dará la media.
A la pregunta '¿Quieres otro? s/n' podemos contestar pulsando Enter para que nos pida el siguiente valor.

numeros=[]
while True:
  z = float(input('Dame un número:'))
  numeros.append(z)
  r=input('¿Quieres otro? s/n')
  if r=='n':
    break
print(numeros)
print('Media = ', sum(numeros)/len(numeros))


Método 6

El método anterior tenía el inconveniente de que teníamos que pulsar dos veces seguidas Enter, una para validar el número introducido y otra para indicar que deseábamos introducir otro. En este caso, vamos a simplificar este proceso, y por lo tanto lo que haremos es pedir continuamente números, sin hacer preguntas. El proceso se detendrá cuando el valor introducido no sea numérico, o bien pulsemos Enter.

numeros=[]
print('Para salir pulsa cualquier valor no numérico o Enter.')
while True:
  z = input('Dame un número:')
  if z.isnumeric():
    numeros.append(int(z))
  else:
    break
print(numeros)  
if len(numeros)!=0:
  print('Media = ', sum(numeros)/len(numeros))


Método 7

El método anterior tenía el inconveniente de que no funcionaba si introducíamos un valor que siendo numérico tuviera decimales. Es este caso, resolvemos ese inconveniente creando una función que detecta si un valor es numérico de tipo entero (int) o de tipo decimal (float).

numeros=[]
print('Para salir pulsa cualquier valor no numérico o Enter.')
def is_number(s):
  try:
    float(s)
    return True
  except ValueError:
    return False
while True:
  z = input('Dame un número:')
  if is_number(z):
    numeros.append(float(z))
  else:
    break
print(numeros)  
if len(numeros)!=0:
  print('Media = ', sum(numeros)/len(numeros))

Media de dos números en Python

Reto: Media de dos números

Calcular la media de dos números.




Método 1

Utilizamos números aleatorios.

import random
x = random.randrange(101)
y= random.randrange(101)
z= (x+y)/2
print('Primer número:',x)
print('Segundo número:',y)
print('Su media:',z)



Método 2

Solicitamos al usuarios los dos números para calcular su media. Antes de input podríamos añadir int que convierte la cadena alfanumérica que se captura por teclado en un número. El inconveniente es que int únicamente acepta valores enteros. Este el el motivo por el que hemos añadido float antes del input ya que así conseguiremos aceptar los valores decimales que el usuario desee introducir.

x = float(input("¿Cuál es el primer número?")) 
y = float(input("¿Cuál es el segundo número?"))
z= (x+y)/2
print('Primer número:',x)
print('Segundo número:',y)
print('Su media:',z)

Listar caracteres de una cadena en Python

Reto: Cadenas alfanuméricas

Listar los caracteres de la cadena ‘2001: A Space Odyssey’.




Método 1

Creamos la variable alfanumérica frase. Con un bucle for recorremos cada carácter y lo imprimimos.

frase='2001: A Space Odyssey'
for i in frase:
  print(i)


Método 2

En este caso usamos un bucle while. Para imprimir cada carácter usamos frase[i] que accede a cada uno de los elementos que componen la frase.

frase='2001: A Space Odyssey'
i=0
while i<len(frase):
  print(frase[i])
  i+=1



Método 3

Convertimos la frase en una lista usando list. Con un bucle for recorremos todos los elementos de la lista y los imprimimos.

frase='2001: A Space Odyssey'
L=list(frase)
for i in L:
  print(i)



Método 4

Convertimos la frase en una lista usando list. Nos metemos en un bucle for que hace que la variable auxiliar i recorra los números desde el cero hasta la longitud de la cadena L. Por cada valor de i imprimimos la posición correspondiente de la cadena. Así, L[0] será igual al carácter '2' y L[20] será igual al carácter 'y'.


frase='2001: A Space Odyssey'
L=list(frase)
for i in range(len(L)):
  print(L[i])

Si ejecutamos la siguiente expresión obtendremos el valor 1 por pantalla.

print(--(frase[9]==L[9]))

Lo que estamos haciendo es comparar el caracter 9 de la frase que es un string con el caracter 9 de la lista L. Al empezar a contar por cero, el caracter 9 es la letra 'p'. El resultado será el valor lógico True. Luego convertimos ese valor lógico en un número al multiplicar dos veces seguidas por -1. Esto se hace añadiendo dos signos menos delante de la expresión lógica.

Unir dos listas en Python

Reto: Unir listas

Generar primero una lista con los números entre 0 y 10, luego generar otra lista con los números del 11 al 20. Unir ambas lista e imprimir el resultado.




Método 1

Generamos dos listas con range. Añadimos la segunda lista a la primera usando extend. Finalmente imprimimos la lista extendida.

miLista=list(range(11))
tuLista=list(range(11,21))
miLista.extend(tuLista)
print(miLista)


Método 2

Generamos dos listas con range. Creamos una tercera lista que es suma de las otras dos. Al sumar dos listas en Python se genera una nueva lista que une ordenadamente las listas que se quieren sumar.

miLista=list(range(11))
tuLista=list(range(11,21))
nuestraLista = miLista + tuLista
print(nuestraLista)

sábado, 16 de junio de 2018

Listar números pares en Python

Reto: Pares

Listar los números pares del 10 al 20.




Método 1

Utilizamos una estructura while con un condicional dentro que detecta los pares. Para ello empleamos la expresión x%2 que calcula el módulo o resto de dividir x entre 2. Si el resto es cero quiere decir que el número al dividirlo entre dos tiene división exacta y por tanto eso significa que es un número par.

x=10
while x<21:
  if x%2==0:
    print(x)
  x+=1


Método 2

En este caso utilizamos una estructura for. El comando range utiliza tres parámetros que son el inicio, el final y el paso. Ponemos paso 2 ya que únicamente queremos listar los pares. El paso (step) proporciona el incremento de la variable y acepta valores negativos para ir hacia atrás. También acepta valores decimales, por ejemplo, 0.1 lo que haría es proporcionar incrementos de la variable en décimas.

for x in range(10, 21, 2):
  print(x)


Método 3

Usando listas de comprensión (List Comprehensions).

print([i for i in range(10,21) if i%2==0])


Método 4

Creamos una función que retorna una lista de números pares. Devuelve cinco números que son los pares entre 10 y 20, ambos incluidos.


Los valores de n se multiplican por dos para conseguir que el resultado nos de números pares. Este es el motivo por el que inicializamos n con el valor 5, que es la mitad del número inicial que es 10.

En la última línea llamamos a la función generaPares pasándole el argumento m=10, ya que al doblarse el valor se llegará a 20.

def generaPares(m):
  n=5
  lista=[]
  while n<=m:
    lista.append(n*2)
    n+=1
  return lista
print(generaPares(10))

Listar números en Python

Reto: Bucles

Listar los números del 1 al 10.



Método 1

El primer método para resolver este reto es muy simple. Creamos una lista con los números del 1 al 10 y luego imprimimos la lista.

Obviamente no es un método válido para un elevado número de datos a imprimir ya que tendríamos que escribir de forma manual la lista. Afortunadamente disponemos de mejores métodos, pero hemos querido mostrar este por su sencillez y para introducir las listas.

x=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(x)


Método 2

Con este método ya podríamos generar listas grandes gracias al uso de range y de list.

miLista=list(range(1,11))
print(miLista)


Método 3

Vamos a listar los números imprimiendo cada uno usando un bucle creado con un while.

x=0
while (x < 10):
  x+=1
  print(x)

La expresión x+=1 equivale a x=x+1 que permite incrementar la variable x en una unidad cada vez que el flujo del programa pasa por esa línea. En nuestro caso, se usa para conseguir que el rango a imprimir comience en 1 y finalice en 10.


Método 4

Vamos a listar los números uno a uno usando un bucle creado con un for.

for x in range(1,11):
  print (x)



Método 5

Usamos una lista de comprensión (List Comprehensions). Se trata de sintetizar código para hacer un bucle for en una sola línea.

x=[i+1 for i in range(10)]
print(x)

Intervalos de números

Reto: Intervalos

Generar un número aleatorio entre 1 y 120. Decir si se encuentra en el intervalo entre 10 y 50, o bien si es mayor de 50 hasta 100, o bien si es mayor de 100, o bien si es menor de 10.



Método 1

Primero importamos la librería random que nos permitirá trabajar con números aleatorios.
Generamos un número aleatorio entero usando random.randrange.
Con una estructura condicional if clasificamos el valor según el intervalo al que pertenece.
La estructura condicional también usa elif que es la abreviatura de 'else if' que podríamos traducir como "y si". Al final tenemos un else que indica "y en caso contrario" para recoger los valores de x que no están en ninguno de los otros intervalos.

import random
x = random.randrange(120)
print('Numero elegido:', x)
if x<10:
  print('El numero es menor de 10')
elif x<50:
  print('El numero esta entre 10-50')
elif x<100:
  print('El numero esta entre 50-100')
else:
  print('El numero es mayor que 100')


Método 2

En este caso trabajamos con listas. Primero generamos una lista. Luego usamos random.choice que nos permite elegir aleatoriamente un valor entre todos los de la lista. Finalmente usamos el mismo condicional que en el caso anterior.


import random
y =list(range(1,121))
x = random.choice (y)
print('Numero elegido:', x)
if (x < 10 ):
 print('El numero es menor de 10')
elif (x <50):
 print('El numero esta entre 10-50')
elif (x <100):
 print('El numero esta entre 50-100')
else:
 print('El numero es mayor que 100')


Método 3

Generamos el número aleatorio con random.randint.
Creamos un diccionario con la variable d, donde la clave son los números del 1, 2, 3, 4 que son los cuatro casos posibles que podemos imprimir. El valor asociado a cada clave es cada una de las cuatro frases que se puede llegar a imprimir.

1:'El número es menor de 10',
2:'El número está entre 10-50',
3:'El número está entre 51-100',
4:'El número es mayor que 100'


import random
x=random.randint(1, 120)
print('Número elegido:', x)
d={1:'El número es menor de 10',2:'El número está entre 10-50',3:'El número está entre 51-100',4:'El número es mayor que 100'}
z=1+len([i for i in [9,50,100,121] if i<x])
print(d[z])

La línea que realmente hace el trabajo duro es la que calcula la variable z.
La sentencia len calcula la longitud de la lista creada. Luego sumamos 1 ya que las posiciones de una lista comienzan en cero y nosotros el diccionario le hemos comenzado en uno.
Finalmente se imprime el valor del diccionario asociado con la clave z.

viernes, 15 de junio de 2018

Instalar Python

Reto: Instalar Python

Instalar Python


Método 1

El lenguaje de programación Python se puede instalar para PC, MAC y LINUX. La página de descarga es la siguiente.



Actualmente estamos en la versión 3.X, aconsejamos descargar la más actual. Si vamos a comenzar a aprender un lenguaje conviene hacerlo con la versión más reciente.

Método 2

Otra alternativa es utilizar algunos editores en los que podremos teclear nuestro código y desde los que podremos incluso ejecutarlo. Proponemos algunos programas para los que existe versión gratuita.

Método 3

También podemos trabajar utilizando una página web para escribir nuestro código y ejecutarlo desde esta aplicación online. Proponemos algunas opciones, nosotros usaremos para la resolución de muchos de nuestros retos la primera opción.

martes, 12 de junio de 2018

Generar aleatorios enteros en Python

Reto: Aleatorios

Generar un número aleatorio.




Método 1

Importamos la librería random y usamos randrange.
Tenemos que poner hasta 101 para que se llegue a 100, puesto que el último número no se alcanza. Por tanto, el rango obtenido estará entre 0 y 100 ambos incluidos.


import random
x=random.randrange(101)
print('Número elegido:',x)


Método 2

Importamos la librería random y usamos randint que nos da valores entre 1 y 100, ambos incluidos.
En la segunda línea de código hemos añadido random.seed() que baraja la serie de números aleatorios. Python, al igual que otros lenguajes, no trabaja con números aleatorios sino con números pseudoaleatorios, que se obtienen mediante algoritmos. Las series de números pseudoaleatorios que se obtienen generalmente son bastante adecuadas, pero tienen el inconveniente de ser series finitas, por ejemplo de 65.000 números. Pero esta serie luego se repite, y comienza por el mismo valor y los demás van en el mismo orden. Lo que hace la sentencia random.seed() es inicializar la semilla, lo que equivale a barajar esa larga serie de números aleatorios con la finalidad de que no se repitan en el mismo orden, y así obtener un comportamiento más cercano a lo que sería un proceso aleatorio real, como el de obtener números sacando bolas de un bombo, tirando dados, o sacando cartas de un mazo barajado.


import random
random.seed()
x=random.randint(1,100)
print('Número elegido:',x)


Método 3

En lugar de importar la librería random entera lo que hacemos es importar de ella únicamente el método randrange. Si no vamos a usar otros métodos de esta librería, puede resultar interesante hacer esto ya que no cargamos en memoria toda la librería que puede llegar a ser muy pesada y ralentizar nuestros procesos.
Al usar randrange ya no tenemos que poner  random.randrange con poner únicamente la palabra  randrange es suficiente.


from random import randint
x=randint(1,100)
print('Número elegido:',x)


Método 4

El uso de random.choice nos permite elegir aleatoriamente entre los valores de una serie que puede ser una lista, o un rango, como en este caso.


import random
x=random.choice(range(1,101))
print('Número elegido:',x)


Método 5

Hasta ahora hemos generado números aleatorios enteros. Al usar random.random lo que hacemos es generar un número aleatorio con decimales que varía entre cero y uno, pudiéndose alcanzar el cero, pero no el uno. Esto es lo que en estadística se denomina una distribución de probabilidad uniforme [0,1).

import random
print(random.random())


Método 6

Con random.random generamos un número aleatorio que se ajusta a una distribución de probabilidad uniforme [0,1), puede incluir el cero pero no llega nunca a 1. Al multiplicar por 200 lo que hacemos es amplificar el rango y ahora irá entre [0,200). Al sumar 5000 desplazamos hacia la derecha el eje y ahora el rango de variación estará entre [5000,5200). Si queremos que llegue a alcanzar en algún momento el valor 5200 tendremos que sumar 1, y así el mínimo que se puede llegar a obtener es 5001 y el máximo 5200, todos ellos números enteros ya que hemos añadido int que trunca la parte decimal.


import random
print(int(random.random()*200+5000)+1)

Veamos el valor máximo y mínimo generando 1000 aleatorios de este tipo.

import random
random.seed()
L=[]
for i in range(1000):
  L.append(int(random.random()*200+5000)+1)
print('maximo: %d minimo: %d' % (max(L),min(L)))


Método 7

Importamos la librería random para poder manejar números aleatorios.

Creamos una lista con list. Usando range conseguimos que la lista comience en 0 y finalice en 100, para ello tenemos que usar el valor 101 en el rango. Imprimimos la lista L.

Luego usamos random.choice para elegir un valor de la lista de forma aleatoria. Así, ya podremos mostrar en pantalla un número aleatorio entre 0 y 100, ambos incluidos.


import random
L=list(range(101)) #creamos la lista L
print(L)
x=random.choice (L)
print('Número elegido:',x)

Comparar dos números en Python

Reto: Número mayor y menor

Dados dos números decir cuál es mayor, o si ambos son iguales.



Método 1

Usamos dos variables, x e y. Con la variable x capturamos el primer número y con la variable y anotamos el segundo números. Ambos valores los ha de introducir el usuario y los capturamos con input. Antes del input añadimos int que convierte el valor alfanumérico en un valor numérico. Por ejemplo, si el usuario introduce el número 5 este se asignará a la variable como una cadena (string). Sera '5' que es distinto del número 5. Lo que hace int es convertir la cadena '5' en un verdadero número 5.

Usamos la estructura if para comparar. Como existen tres casos hemos necesitado usar elif que es la abreviatura de 'else if', y al final hemos usado else que se puede traducir como "y en caso contrario".


x = int(input("¿Cuál es el primer número?")) #Preguntamos al usuario qué número quiere
y = int(input("¿Cuál es el segundo número?"))
if x>y:
  print('El primer número es mayor.')
elif x<y:
  print('El primer número es menor.')
else:
  print('Es el mismo número.')

En la primera línea hemos incluido un comentario del programador. Todo lo que escribimos después del símbolo almohadilla (#) se considera que es un comentario del programador y tiene la finalidad de documentar el código para el propio programador o para otros que puedan leerlo en el futuro. El programa no ejecutará los comentarios del programador.

Para hacer un comentario del programador que abarque varias líneas se usan las triples comillas (''') al inicio y al final del párrafo que deseamos comentar.


Método 2

Generamos aleatoriamente el valor de las dos variables, x e y. Para poder generar números aleatorios necesitamos la librería random. Éste es el motivo de que la importemos en la primera línea.

Para generar números aleatorios enteros entre 0 y 5 usamos random.randint(0, 5).
Imprimimos los números obtenidos x e y.
Nos metemos en una estructura condicional if para analizar los tres casos posibles, que x sea mayor, que sea menor y que sea igual a y.

import random
x=random.randint(0, 5)
y=random.randint(0, 5)
print(x)
print(y)
if x>y:
 print(x,'es mayor que',y)
elif x<y:
 print(x,'es menor que',y)
else:
 print(x,'es igual a',y)

jueves, 7 de junio de 2018

Hola mundo en Python

Reto: Hola mundo

Imprimir la expresión "Hola mundo".



Hacer un "Hola Mundo" se ha convertido en un clásico ejercicio en cualquier lenguaje en el que comencemos a programar. Es un ejemplo que nos permite ver si tenemos bien instalado el programa que nos permite ejecutar el código.

Método 1

Utilizamos print para mostrar por pantalla alguna expresión. Si queremos imprimir un texto debe ir entre comillas dobles o entre comillas simples.

print("Hola mundo")

Método 2

En este método las comillas son simples. El texto se denomina string y son caracteres alfanuméricos, una mezcla de texto y números, o solo texto, o solo números pero al ir entre comillas se trata como texto.

print('Hola mundo')

En la versión 2 de Python no se ponían los paréntesis. Esto se puede ver publicado en alguna página web o libro que tratan de la versión antigua.
Si lo prueba en Python 3 es necesario poner los paréntesis, en caso contrario dará error.

Método 3

Parece complicado hacer un código alternativo al clásico "Hola mundo", pero siempre podemos dejar volar la imaginación y ver otras alternativas. En este caso, vamos a imprimir la frase concatenando las palabras que la componen.

Concatenar caracteres de una cadena alfanumérica consiste en unirlos y formar una cadena que junte esos caracteres. En Python concatenamos con el signo +. Este signo sumará si se trata de números pero lo que hará es concatenar si se trata de caracteres alfanuméricos.

Para unir caracteres usamos el signo más (+). Las cadenas alfanuméricas siempre entre comillas simples o entre comillas dobles.

print('Hola '+'mundo')

Observe que después de la palabra Hola hemos incluido un espacio en blanco. Esto se hace para que al imprimir se vean separadas las dos palabras.

Método 4

También podemos separar mediante coma las dos palabras y en ese caso el espacio en blanco no es necesario ya que lo añade automáticamente Python al imprimir textos separados por coma.

print('Hola','mundo')

Método 5

Usando format.

print('{} {}'.format('Hola','mundo'))

Método 6

Definimos una cadena alfanumérica que asignamos a la variable a. Invertimos el orden del string a y lo asignamos a la variable b. Imprimimos el string contenido en b.

a="!odnum aloH¡"
b=a[::-1]
print(b)

Método 7

Definimos una cadena alfanumérica que asignamos a la variable str. Invertimos el orden de los caracteres del string str y lo imprimimos.

Para realizar la inversión usamos reversed.

str="!odnum aloH"
print(''.join(reversed(str)))

Método 8

Para usar la función print e imprimir un 'Hola mundo' no es necesario usar programación orientada a objetos, ni definir la función main. Al igual que muchas otras de las funciones implementadas de base en Python no es necesario llamarlas usando __name__ pero así vemos que ello es posible.

def main():
    print("¡Hola mundo!")

if __name__ == "__main__":
    main()


Método 9

Utilizamos print para mostrar por pantalla alguna expresión. Si queremos imprimir un texto debe ir entre comillas dobles o entre comillas simples.

from termcolor import colored
print(colored('Hola', 'red'), colored('mundo', 'green'))


Método 10

Usando un bucle infinito que se rompe a la primera con break después de imprimir nuestro Hola mundo.

while True: print('Hola mundo'); break


Método 11

Usando formateo de impresión con el comando f y metiendo dos variables.

a='Hola'
b='Mundo'
print(f'{a} {b}')


Método 12

Usando formateo de impresión con el comando f y metiendo una variable.

alguien='Mundo'
print(f'Hola {alguien}')


Método 13

Usando caracteres Unicode.

print('\u0048\u006f\u006c\u0061\u0020\u006d\u0075\u006e\u0064\u006f')


Método 14

Usando código ASCII que convertimos a caracteres con chr. La lista está al revés, vamos tomando el último caracter y eliminándolo.
La condición del while será la lista l que dará True mientras no esté vacía.

l=[111, 100, 110, 117, 77, 32, 97, 108, 111, 72]
while l:
    print(chr(l[-1]),end='')
    l.pop()
print()

domingo, 3 de junio de 2018

Triangulo de Floyd en Python

Utilizando Python, hemos generado un Triangulo de Floyd.
El nombre viene de un científico informático llamado Robert Floyd, que fue compañero de habitación con Carl Sagan cuando estos estaban en la universidad.

Es un triangulo rectángulo formado por los números naturales, se empieza con uno en la primera fila y cada fila tiene un numero mas que la anterior.

Este es el Python:
 n = int(input("¿Cuántas filas quieres?")) #filas que quiere el usuario  
 x=1 #Fila actual que es el mismo número que el número de columnas que tiene que tener esa fila  
 y=1 #Número que hay que imprimir  
 z=1 #número de columnas que hay en la fila  
 frase = ''  
 for x in range(1,n+1):  
   for z in range(1,x+1): #z recorre de 1 hasta x. Ejemplo en la 4 (x=4 z=1,2,3,4)  
     frase+=(str(y)+(' '))  
     y+=1  
   print(frase)  
   frase =''  
Este es el resultado:

sábado, 2 de junio de 2018

Enumerate en Python

Cuando queremos recorrer los elementos de una lista en Python podemos hacer uso de la función Enumerate que se encuentra definida en Python.

Comentarios al código

Primero creamos una lista con las cuatro estaciones

Luego imprimimos la lista para ver el resultado. Esto es lo habitual manejando listas. Usamos print(mi_lista) y también podríamos haber usado print(list(mi_lista)) con idéntico resultado.

Seguidamente usamos enumerate y al imprimirlo nos devuelve una tupla con dos compoentes. Por una lado el contador que comienza en cero, y por el otro lado el elemento correspondiente de la lista.

Finalmente, en este primer ejemplo, imprimimos la tupla pero haciendo que el contador comience en uno. Esto se consigue añadiendo start=1.


#creamos una lista
mi_lista=["primavera","verano","otoño","invierno"]

#imprimimos la lista completa
print(mi_lista)

#usando enumerate obtenemos una tupla
#con un contador desde cero y los elementos de la lista
print(list(enumerate(mi_lista)))

#podemos conseguir que el contador comienze en 1
print(list(enumerate(mi_lista, start=1)))

En el segundo ejemplo usamos un bucle for para recorrer todos los elementos de la lista, y dispones al mismo tiempo del valor del contador. Éste comienza en cero pero también podría comenzar en uno si así lo indicásemos añadiendo start=1.

#otro ejemplo
esta_lista=[100,110,120]

#creamos un bucle for donde
#se recorre la lista y se puede usar el contador

for contador, elemento in enumerate(esta_lista):
    print(contador, elemento)


Cálculo del VAN

Vamos a realizar un caso práctico para ver el uso de numerate. Se trata de calcular el VAN (Valor Actual Neto) en inglés NPV (Net Present Value).

Se trata de calcular el VAN de la inversión cuyos flujos de caja se indican. Esta inversión valorada al 10% anual arroja un VAN igual a cero.

def npv(rate, cashflows):
    total = 0.0
    for i, cashflow in enumerate(cashflows):
        total += cashflow / (1 +rate)**i
    return total

cashflows=[-4000,1400,1300,1200,1100]

print(npv(0.1,cashflows))

Ordenación QuickSort en Python

Para ordenar listas o valores de un array existen varios métodos. Son bastante conocidos los dos siguientes.
  • BubbleSort. El método de ordenación de la burbuja (bubble sort)
  • QuickSort. El método rápido de ordenación (quick sort)
El método de la burbuja realiza una ordenación comparando todos los elementos por parejas. Es un buen método pero si el número de elementos a ordenar es muy grande este procedimiento se relentiza que ya el tiempo de cálculo crece con el cuadrado de n, del número de elementos. Por ejemplo, para ordenar un millón de valores no sería adecuado.

Para un elevado número de elementos a ordenar se aconseja el método QuickSort que se basa en dividir los elementos de la lista en dos subgrupos, los menores y los mayores a un elemento dado que se usa como pivote. Existen diferentes método para elegir el pivote óptimo, pero nosotros por simplicidad utilizaremos como pivote el primer elemento de la lista. De esta forma, los elementos inferiores al pivote los situaremos en una sublista que hemos denominado Izquierda, y los elementos superiores al pivote los situaremos una sublista denominada Derecha. Luego reconstruiremos la lista concatenando la lista de la izquierda, con el pivote que llamaremos centro, y con la lista de la derecha.

A su vez para cada una de las sublistas se repite este proceso de forma recursiva, hasta que la sublista más profunda únicamente tiene un elemento.

La filosofía de este algoritmo para llegar a ordenar listas largas es "Divide y vencerás".

Código

miLista = [34,93,19,58,12,28,95,37,23,80,57,82,55,48,21,39,53,65,30,32,84,64,44,68,36]

def sort(lista):
    izquierda = []
    centro = []
    derecha = []
    if len(lista) > 1:
        pivote = lista[0]
        for i in lista:
            if i < pivote:
                izquierda.append(i)
            elif i == pivote:
                centro.append(i)
            elif i > pivote:
                derecha.append(i)
        #print(izquierda+["-"]+centro+["-"]+derecha)
        return sort(izquierda)+centro+sort(derecha)
    else:
      return lista

print(miLista)
print(sort(miLista))


El resultado obtenido es el de la siguiente imagen. Primero se imprime la lista original que deseamos ordenar, y luego se imprime la lista ya ordenada.


Existe una línea con un comentario en el código, si quitamos la almohadilla (#) del comentario y convertimos esa línea en ejecutable, obtendremos el siguiente resultado.


En la imagen anterior vemos el resultado de las diferentes iteraciones. Se ve que el método de ordenación va actuando por sublistas colocando el elemento pivote en el centro.

Vamos a ordenar una lista grande de elementos para ver que se realiza en un tiempo razonable.