Programación Orientada a Objetos -POO-

#!/usr/bin/python
# DEFINIMOS LA CLASE COCHE.
#     ATRIBUTOS DEL OBJETO: GASOLINA.
#         METODOS: ARRANCAR Y CONDUCIR.
class Coche:             # CLASE
    """Abstraccion de los objetos coche."""
    def __init__(self,gasolina):           # ATRIBUTO
        self.gasolina = gasolina
        print "Tenemos", gasolina, "litros"

    def arrancar(self):                    # METODO
        if self.gasolina > 0:
            print "Arranca"
        else:
            print "No Arranca"

    def conducir(self):                  # METODO
        if self.gasolina > 0:
            self.gasolina -= 1
            print "Quedan", self.gasolina, "litros"
        else:
            print "No se mueve"

mi_coche = Coche(6)         # mi_coche ES EL OBJETO

# PARA EJECUTAR EL SCRIPT, TENEMOS QUE IR DESCUBRIENDO UNO A UNO LAS SIGUIENTES LINEAS DE CODIGOS.

#print mi_coche.gasolina
#mi_coche.arrancar()
#mi_coche.conducir()
#mi_coche.conducir()
#mi_coche.conducir()
#mi_coche.arrancar()
#print mi_coche.gasolina
#mi_coche.conducir()
#print mi_coche.gasolina
#mi_coche.conducir()
#mi_coche.arrancar()
#mi_coche.conducir()
#mi_coche.arrancar()
#mi_coche.conducir()
#print mi_coche.gasolina


Ejemplo de una clase POO. Definición de la clase, atributos y métodos.

M.C.D. Su utilidad para cifrados en criptografía

#!/usr/bin/python
# -*- coding: utf-8 -*-
print
print "Calculadora de numeros coprimos o primos relativos entre si"
print

x = input("Introduce el primer numero: ")   # INTRODUCIMOS LOS DOS NUMEROS A COMPROBAR
y = input("Introduce el segundo numero: ")
def mcd(a, b):
    if b == 0:
        return a
    else:
        return mcd(b, a%b)
#print mcd(x, y)
print
print "El Maximo Comun Divisor de ", x, "y ", y," es: ", mcd(x, y)
print
if mcd(x, y) == 1:
    print "Los numeros SON coprimos o primos relativos entre si"
else:
    print "Los numeros NO SON coprimos entre si"
print

def mcd(a, b):
    resto = 0
    while(b > 0):
        resto = b
        b = a % b
        a = resto
    return a
num1 = int(input("Introduce el primer numero: "))
num2 = int(input("Introduce el segundo numero: "))
print
print "El Maximo Comun Divisor de ", num1, " y " , num2, " es: ", mcd(num1, num2)
print
if mcd(num1 ,num2) == 1:
    print "Los números SON coprimos o primos relativos entre si"
else:
    print "Los números NO SON coprimos entre si"
print



Script para verificar coprimos potenciales para criptografía en matemática discreta, matemática modular y Euclides. Bases del algoritmo RSA y análogos.

Números primos

#!/usr/bin/python
# SABER SI UN NUMERO ES PRIMO.

numero_leido = raw_input("Insertar un numero: ")
numero = int(numero_leido)
contador = 0       
for i in range(1, numero+1):
    if(numero % i) == 0:
        contador = contador + 1
if contador == 2:      
    print "El numero es primo"
else:
    print "El numero no es primo"


Script simple para saber si un número es primo.

Conversos de números a diversas bases

#!/usr/bin/python
# CODIGO CON DOS FUNCIONES. CONVIERTE NUMEROS A VARIAS BASES. INTRODUCES UN NUMERO Y LA BASE EN LA QUE LO QUIERES.

def digit_to_char(digit):
    if digit < 10: 
        return chr(ord('0') + digit)
    else: 
        return chr(ord('a') + digit - 10)

def str_base(number,base):
    if number < 0:
        return '-' + str_base(-number,base)
    else:
        (d,m) = divmod(number,base)
        if d:
            return str_base(d,base) + digit_to_char(m)
        else:
            return digit_to_char(m)

a = int(input("introduzca numero a convertir a cualquier base: "))
b = int(input("introduzca base: "))
print str_base(a,b)


Veamos un ejemplo sencillo.

Vamos a convertir el número 145 a base 3 y después a base 2.

Introduzca numero a convertir a cualquier base: 145
Introduzca base: 3

12101

Introduzca numero a convertir a cualquier base: 145
Introduzca base: 2

10010001

 

Convertir texto a ASCII y viceversa

#!/usr/bin/python
# CONVERTIMOS TEXTO A ASCII Y VICEVERSA. 
print
print "Este codigo convierte texto a codigo ASCII y viceversa."
print

a = raw_input("Introduce texto a convertir: ")

print "Texto en codigo ASCII:"
for i in range(0, len(a)):
    print ord(a[i]),             

# ESTE BLOQUE CONVIERTE ASCII A TEXTO
 
l = []        # LISTA VACIA DONDE ALMACENA EL RESULTADO
l = input("Introduce valores ascii separados por comas: ") 
print "ASCII a texto: ", ''.join(map(chr,l)) 

print 

Veamos un ejemplo muy sencillo.

Introduce texto a convertir: buenos dias

Texto en codigo ASCII:


98 117 101 110 111 115 32 100 105 97 115

Introduce valores ASCII separados por comas:

98,117,101,110,111,115,32,100,105,97,115

ASCII a texto: buenos dias

Cifrado de Hill en Python

#!/usr/bin/python
# -*- coding: utf-8 -*- 

# Algoritmo Cifrado de Hill en 26 caracteres.  
# Funciona perfectamente.  IMPORTANTISIMO LO DEL -coding utf-8- y las matrices en mod26 y mod27  

# INTRODUCIMOS EN UNA LISTA EL NUMERO DE CARACTERES A UTILIZAR

v2 = ["00 ", "01 ", "02 ", "03 ", "04 ", "05 ", "06 ", "07 ", "08 ", "09 ", "10 ", "11 ", "12 ", "13 ", "14 ", "15 ", "16 ", "17 ", "18 ", "19 ", "20 ", "21 ", "22 ", "23 ", "24 ", "25 "] # 26 caracteres que conforman el alfabeto ya que -00- se cuenta como caracter. 

# INTRODUCIMOS LOS CARACTERES POR LOS QUE VAN A SER SUSTITUIDOS

v1 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] # 26 caracteres.

print

# FUNCION QUE CONVIERTE LAS LETRAS EN NUMEROS DEL -O- AL -25-.   

def crypt(text):      # FUNCION QUE CODIFICA EL TEXTO PLANO
    texto = text
    salir = False
    v3 = 0
    while v3 <= 25:    # MODIFICAMOS SEGUN LOS VALORES DE v1 Y v2 PARA ENTRAR EN RANGO. LO CORRECTO AQUI ES 25 YA QUE EL LIMITE DE v2 ES 25. 
        text = text.replace(v1[v3], v2[v3])   # REEMPLAZAMOS UNOS CARACTERES POR OTROS. 
        v3 = v3 + 1     # CONTADOR
#        print text        # ESTA LINEA IMPRIME POR PANTALLA EL RESULTADO DETALLADO. LA PODEMOS QUITAR.
    print "EL TEXTO CONVERTIDO EN NUMEROS DEL -0- AL -25- ES: ", text    # ESTA IMPRIME EL RESULTADO FINAL.

crypt(raw_input("INTRODUCE TEXTO PLANO -MENSAJE- A CONVERTIR EN NUMEROS DEL -0- AL -25-: ")) 

print 

# YA TENEMOS NUESTRO TEXTO PLANO PASADO A NUMEROS DEL 0 AL 25. 

# AHORA CREAMOS LAS LISTAS QUE CONTENDRA LA MATRIZ Y LAS MATRICES EN SI. CODIFICACION Y TEXTO.  

# CREAMOS MATRIZ -K- QUE DEBE SER INVERTIBLE, ES DECIR, determinante distinto de 0 y m.c.d. (det, mod) = 1. 

matriz1 = []      

filas = int(raw_input("Inserta FILAS de Matriz de codificacion: "))
columnas = int(raw_input("Inserta COLUMNAS de Matriz de codificacion: "))

for i in range(filas):
    matriz1.append([0]*columnas)  

for f in range(filas):
    for c in range(columnas):
        matriz1[f][c] = int(raw_input("Elemento f%d, c%d : " % (f,c))) 

print matriz1                          # IMPRIMIMOS MATRIZ 1 o MATRIZ DE CODIFICACION

for elemento in matriz1:               # IMPRIMIMOS EN FORMA DE MATRIZ
    print elemento

print 
# CREAMOS MATRIZ 2 QUE SERA EL TEXTO PASADO A NUMEROS ENTRE 0 Y 25

matriz2 = []      # ESTA MATRIZ NO GENERA UNA OPERACION AUTENTICA DE MATRIZ, SOLO MULTIPLICA FILAS. 

filas = int(raw_input("Inserta FILAS de Matriz 2 -texto- : "))
columnas = int(raw_input("Inserta COLUMNAS de Matriz 2 -texto- : "))

for i in range(filas):
    matriz2.append([0]*columnas)

for f in range(filas):
    for c in range(columnas):
        matriz2[f][c] = int(raw_input("Elemento %d, %d : " % (f,c)))  # POR ESO AQUI NO PONEMOS FILAS Y COLUMNAS. 

print matriz2                         # IMPRIMIMOS MATRIZ 2

for elemento in matriz2:               # IMPRIMIMOS EN FORMA DE MATRIZ
    print elemento

print
# CREAMOS LA ESTRUCTURA DE LA MATRIZ RESULTADO

matrizresultado = []      

filas = int(raw_input("Inserta FILAS de la Matriz Resultado: "))
columnas = int(raw_input("Inserta COLUMNAS de la Matriz Resultado: "))

for i in range(filas):
    matrizresultado.append([0]*columnas)

for f in range(filas):
    for c in range(columnas):
#        matrizresultado[f][c] = int(raw_input("Elemento f%d, c%d : " % (f,c)))
        matrizresultado[f][c] = 0     # LA MATRIZ RESULTADO DEBE SER UNA MATRIZ VACIA

print matrizresultado                # IMPRIMIMOS LA FORMA DE LA MATRIZ RESULTADO

for elemento in matrizresultado:    # IMPRIMIMOS LA MATRIZ RESULTADO EN FORMA DE MATRIZ
    print elemento

print 
# AQUI VIENE EL PROCESO DE MULTIPLICACION DE FILAS Y COLUMNAS, QUE COMO HEMOS DICHO, NO ES MUY CORRECTO.

a=3 # int(raw_input("Inserta -COLUMNAS- matriz de codificacion: ")) # METEMOS EL NUMERO DE FILAS Y COLUMNAS PARA NO LIMITARLO A 3
b=int(raw_input("Inserta -COLUMNAS- matriz de texto: "))       # EJEM: PARA MATRIZ 3 x 1 =>  a=3  b=1  r=3 
r=3 # int(raw_input("Inserta -FILAS- matriz resultado: "))     # EJEM: PARA MATRIZ 3 x 2 =>  a=3  b=2  r=3 
                                                               # EJEM: PARA MATRIZ 3 x 3 =>  a=3  b=3  r=3
                                                               # EJEM: PARA MATRIZ 3 x 4 =>  a=3  b=4  r=3

#for x in range(0,3): 
for x in range(0,a):
#    for y in range(0,3):
    for y in range(0,b):
#        for z in range(0,3):
        for z in range(0,r):
            matrizresultado[x][y]+=matriz1[x][z]*matriz2[z][y] 

print matrizresultado

for elemento in matrizresultado:
    print elemento

print 
# AHORA TRATAMOS DE APLANAR LA LISTA DE LISTAS Y PASARLO A mod26.

def flattener(lst):            # DEFINIMOS LA FUNCION QUE NOS APLANARA LA LISTA
    return [item for sublist in lst for item in sublist]

#lista = [[36, 60, 41],[25, 55, 46]]  ejemplo de como queda

print flattener(matrizresultado)  # IMPRIMIMOS LAS LISTAS EN UNA SOLA LISTA. 

#[36, 60, 41, 25, 55, 46]   ejemplo de como queda

for elemento in flattener(matrizresultado):      # IMPRIMIMOS EL RESULTADO EN mod 26
    print elemento%26,                           # LA , ES PARA IMPRIMIR HORIZONTAL. (mod26) 

print

# UNA VEZ OBTENIDO EL RESULTADO DE LA MULTIPLICACION DE MATRICES, PASAMOS A LA CONVERSION DE LOS NUMEROS EN TEXTO. 

# INTRODUCIMOS LA LISTA DE NUMEROS A UTILIZAR

v1 = ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"] # 26 caracteres que conforman el alfabeto ya que el -00- cuenta como caracter. 

# INTRODUCIMOS LOS CARACTERES POR LOS QUE VAN A SER SUSTITUIDOS

v2 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] # 26 caracteres.

print 

# FUNCION QUE NOS CONVERTIRA LAS CIFRAS OBTENIDAS EN mod26 EN LETRAS DEL ALFABETO.  

def crypt(text):      # FUNCION QUE CODIFICA EL TEXTO PLANO
    texto = text
    salir = False
    v3 = 0
    while v3 <= 25:   # MODIFICAMOS SEGUN LOS VALORES DE v1 Y v2 PARA ENTRAR EN RANGO. LO CORRECTO ES 25. 
        text = text.replace(v1[v3], v2[v3])   # REEMPLAZAMOS UNOS CARACTERES POR OTROS. 
        v3 = v3 + 1     # CONTADOR
#        print text        # ESTA LINEA IMPRIME POR PANTALLA EL RESULTADO DETALLADO. LA PODEMOS QUITAR.
    print "Y POR FIN, EL TEXTO FINAL ES: ", text           # ESTA IMPRIME EL RESULTADO FINAL.

crypt(raw_input("PASO FINAL.- Introduce los GUARISMOS de dos en dos para convertir en TEXTO PLANO: ")) 

print 


Crear una matriz

Aquí podemos ver tres formas simples de crear una matriz tanto de ceros como de los números que elijamos.

#!/usr/bin/python
#
# CREANDO MATRICES FACIL           
# LA PRIMERA MAS SENCILLA E INTUITIVA
matriz1 = []   

numero_filas = 3
numero_columnas = 4

for i in range(numero_filas):
    matriz1.append([]) 
    for j in range(numero_columnas): 
        matriz1[i].append(0)    # SI QUIERES UNA MATRIZ DE CEROS O LO QUE QUIERAS. 

print matriz1 
print
# LA SEGUNDA MENOS INTUITIVA PERO MAS EFICIENTE

matriz2 = [None] * numero_filas

for i in range(numero_filas):
    matriz2[i] = [2] * numero_columnas

print matriz2
print
# MATRIZ VACIA

matrizvacia = [None] * numero_filas

for i in range(numero_filas):
    matrizvacia[i] = [] * numero_columnas

print matrizvacia
print
# VERSION MAS COMPACTA

matriz3 = [range(numero_columnas) for i in range(numero_filas)] 

print matriz3
print
# VARIACION DE LA ANTERIOR

matriz4 = [[0] * numero_columnas for i in range(numero_filas)] 

print matriz4
print


La salida que nos dará el script será la siguiente:

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

[[2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2]]

[[], [], []]

[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

Funciones Lambda

#!/usr/bin/python
#
print
print "Funcion -lambda-. Permite crear una funcion anonima en linea. Resume codigo. Aqui da numeros pares e impares."
print

# LA FUNCION ORIGINAL SERIA ASI: 

def es_par(n):
    return (n % 2.0 == 0)

l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
l2 = filter(es_par, l)

print l2

# LA FUNCION CON lambda SERIA LA SIGUIENTE: 

# PARA QUE NOS DE LOS NUMEROS PARES

l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
l2 = filter(lambda n: n % 2.0 == 0, l)

print l2

# PARA QUE NOS DE LOS NUMEROS IMPARES

l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
l3 = filter(lambda n: n % 2.0 != 0, l)
 
print l3


Este es un pequeño ejemplo de funciones Lambda. Son funciones que habitualmente se resumen en una sola línea de código y resumen una función más amplia. En el ejemplo vemos la función original y luego la función Lambda. La primera nos da los números pares y la segunda los impares.

Crear carpetas ocultas y codificadas en Windows

cls
@ECHO OFF
title Folder Nuevo
if EXIST "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}" goto UNLOCK
if NOT EXIST Nuevo goto MDLOCKER
:CONFIRM
echo desea activar la contraseña?(Y/N)
set/p "cho=>"
if %cho%==Y goto LOCK
if %cho%==y goto LOCK
if %cho%==n goto END
if %cho%==N goto END
echo Invalid choice.
goto CONFIRM
:LOCK
ren Nuevo "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}"
attrib +h +s "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}"
echo Folder locked
goto End
:UNLOCK
echo Ingrese la clave para axceder a la carpeta
set/p "pass=>"
if NOT %pass%==Pon la contraseña goto FAIL
attrib -h -s "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}"
ren "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}" Nuevo
echo Folder Unlocked successfully
goto End
:FAIL
echo Invalid password
goto end
:MDLOCKER
md Nuevo
echo Nuevo created successfully
goto End
:End

Muy sencillo de usar.

Abres un documento .txt y copias el texto arriba indicado.

Donde pone «if NOT %pass%==Pon la contraseña goto FAIL», justo donde pone «Pon la contraseña», pones la clave que tú quieras sin dejar espacios y guardas el archivo como archivo.bat. Pinchas en el archivo y te aparecerá una nueva carpeta que se llama «nuevo». Si vuelves a pinchar en el archivo .bat, te dirá si quieres aplicar la contraseña. Le dices que sí (Y) y la carpeta se esconderá. La siguiente vez que vuelvas a pinchar en el archivo.bat te pedirá la contraseña para mostrar la carpeta. La pones y te aparecerá de nuevo la carpeta. Es muy fácil y práctico para que no te fisguen tus archivos.