Conversor de unidades de medida de almacenamiento en Python 3.X

Iniciado por z0mb1es, Julio 15, 2020, 07:38:16 PM

Tema anterior - Siguiente tema

0 Miembros y 3 Visitantes están viendo este tema.

Hola amigos. Les vengo a dejar un pequeño código que creé hace unos días. La idea original era diseñar un algoritmo para hacer estas conversiones, pero la cabeza no me da para tanto :P. Quería compartir este código con ustedes porque en anteriores ocasiones me han ayudado a mejorarlo, me han dicho que cosas puedo cambiar para tener un código más optimizado, etcétera.

Aquí va:

Código: python
#!/usr/bin/python
import time
from os import system, name

def clear():
    if name == 'nt':
        _ = system('cls')
    else:
        _ = system('clear')

def bit2byte():
    x = int(input("Cuantos bits? "))
    y = x / 8
    print(str(y) + " es la cantidad de bytes en " + str(x) + " bits.")
    time.sleep(3)
    clear()
def kbyte2byte():
    x = int(input("Cuantos kilobytes? "))
    y = x * 1024
    print(str(y) + " es la cantidad de bytes en " + str(x) + " kilobytes.")
    time.sleep(3)
    clear()
def mbyte2kbyte():
    x = int(input("Cuantos megabytes? "))
    y = x * 1024
    print(str(y) + " es la cantidad de kilobytes en " + str(x) + " megabytes.")
    time.sleep(3)
    clear()
def gbyte2mbyte():
    x = int(input("Cuantos gigabytes? "))
    y = x * 1024
    print(str(y) + " es la cantidad de megabytes en " + str(x) + " gigabytes.")
    time.sleep(3)
    clear()
def tbyte2gbyte():
    x = int(input("Cuantos terabytes? "))
    y = x * 1024
    print(str(y) + " es la cantidad de gigabytes  en " + str(x) + " bits.")
    time.sleep(3)
    clear()

menu = """
[1] Convertir bits a bytes
[2] Convertir kilobytes a bytes
[3] Convertir megabytes a kilobytes
[4] Convertir gigabytes a megabytes
[5] Convertir terabytes a gigabytes
[6] Salir
"""

the = True
while the is  True:
    print(str(menu))
    opc = (input("Selecciona una opción: "))
    if opc == "1":
        bit2byte()
    elif opc == "2":
        kbyte2byte()
    elif opc == "3":
        mbyte2kbyte()
    elif opc == "4":
        gbyte2mbyte()
    elif opc == "5":
        tbyte2gbyte()
    elif opc == "6":
       
        print("\n\nHasta la próxima :)\n\n")
        break
        exit()   
    else:
        print("\nElije una opción valida.\n")
        time.sleep(0.4)
        clear()


Sé que está un poco desorganizado y planeo mejorarlo, claro está. Les muestro esto porque es digamos la versión alpha de este proyecto.

Saludos. ;D
Public Yy As String = "\z0mb1es RAT\."
         Public HOST As String = "101.110.010.111"
              Public port As Integer = 8989
                                    Public cap As New CRDP

Julio 15, 2020, 08:25:33 PM #1 Ultima modificación: Julio 17, 2020, 04:33:13 AM por Kirari
Buenas compañero! Acá le dejo una versión modificada del código que hecho de manera rápida y sencilla para que pueda examinarlo con tranquilidad, incluso te lo he comentado:

Código: python


from os import system, name

def clear():
    # Aca no haria falta que cree una variable, solo llame a la funcion system y estaria.
    if name == 'nt':
        system('cls')
    else:
        system('clear')
   

# Las operaciones en funciones pueden ser declaradas de esta forma, es más legible.
# Todas las funciones, aceptan como parametro, un valor entero.
# Ya si luego quiere restringir si es cadena o no, es parte de la investigación que deberá hacer usted.
def bit2byte(x):
    return x // 8
   
def convbytes(x):
    return x * 1024

# Funcion para verificar si el dato ingresado es un entero   
def ingresar(text):
    error = True
    # Mientras se ingrese erroneamente
    while (error==True):
        try:
            x = int(input(text))
            # Si el dato es correcto, sale del bucle
            error = False
        except ValueError:
            # Se manipula la salida del error en caso de que el dato no sea el correcto
            print("Error, se debe ingresar un numero entero.")
   
    return x
   
# Todo lo que tenga que ver con el menu, esta colocado en esta funcion.
def main():

    menu = """
    [1] Convertir bits a bytes
    [2] Convertir kilobytes a bytes
    [3] Convertir megabytes a kilobytes
    [4] Convertir gigabytes a megabytes
    [5] Convertir terabytes a gigabytes
    [6] Salir
    """
   
    print(menu)
   
    # Entrada de usuario
   
    the = ingresar("Selecciona una opción: ")
   
    # Al presionar 6, el programa finaliza
    while the!=6:
       
        if the == 1:
            # Se le pide el ingreso de datos al usuario
            x = ingresar("Cuantos bits? ")
            # Al llamar a la función, se le pasa como argumento la variable x, no hace falta concatenar, puede solo mostrar el resultado
            print("{} es la cantidad de bytes en {} bits.".format(bit2byte(x),x))
           
        elif the == 2:
            x = ingresar("Cuantos kilobytes? ")
            print("{} es la cantidad de bytes en {} kilobytes.".format(convbytes(x),x))
           
        elif the == 3:
            x = ingresar("Cuantos megabytes? ")
            print("{} es la cantidad de kilobytes en {} megabytes.".format(convbytes(x),x))
           
        elif the == 4:
            x = ingresar("Cuantos gigabytes? ")
            print("{} es la cantidad de megabytes en {} gigabytes.".format(convbytes(x),x))
           
        elif the == 5:
            x = ingresar("Cuantos terabytes? ")
            print("{} es la cantidad de gigabytes  en {} terabytes.".format(convbytes(x),x))
   
        else:
            print("Escoja una opción valida.")
       
        input("Presione una tecla para continuar...\n")   
        clear()
        print(menu)
        the = ingresar("Selecciona una opción: ")
   
    # Al salir del bucle, le mostrará el mensaje
    print("\n\nHasta la próxima https://underc0de.org/foro/Smileys/default/smiley.gif\n\n")
   
if __name__ == '__main__':
    # Llamamos a la funcion menu
    main()


Espero te sea de utilidad. Saludos!
-Kirari

Julio 17, 2020, 01:48:02 AM #2 Ultima modificación: Julio 17, 2020, 01:51:56 AM por tincopasan
con que necesidad cuatro funciones que hacen lo mismo?
Código: python

def kbyte2byte(x):
    y = x * 1024
    return y

def mbyte2kbyte(x):
    y = x * 1024
    return y
   
def gbyte2mbyte(x):
    y = x * 1024
    return y
   
def tbyte2gbyte(x):
    y = x * 1024
    return y


con una sola es lo mismo, total todas devuelven x * 1024
y deberían verificar que se puede pasar a entero lo ingresado, si el usuario es "malicioso" o "descuidado" si ingresa un valor no convertible qenerara un error no manejado.
además en los print deberían usar formateo de cadenas, si es por claridad de código.

Julio 17, 2020, 02:11:29 AM #3 Ultima modificación: Julio 17, 2020, 02:41:55 AM por Kirari
@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta De hecho te doy la razón compañero, lo he hecho rápido y no tomé en cuenta lo de las funciones, con una sola bastaría. En cuanto a lo de verificar también se le puede agregar, pero eso es para investigación del usuario, lo básico estaría, pero ya que modificaré el código, lo agrego.

La modificación ya está hecha. Mis disculpas por ese error, no lo había notado. Muchas gracias @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta !

-Kirari

no es necesario disculparse, cada uno codifica como quiere, de todas formas para mi gusto escribís código de más, lo haría así :
Código: python

#-*- coding: utf -8 -*-
from os import system, name

def clear():
    # Acá no haría falta que cree una variable, solo llame a la función system y estaría.
    if name == 'nt':
        system('cls')
    else:
        system('clear')
   
valores = {2:["kilobytes","bytes"],3:["megabytes","kilobytes"],4:["gigabytes","megabytes"],5:["terabytes","gigabytes"]}   
# Función para verificar si el dato ingresado es un entero   
def ingresar(text):
    # Mientras se ingrese erróneamente
    while True: # error==True:
        try:
            x = int(input(text))
            # Si el dato es correcto, sale del bucle
            break
        except ValueError:
            # Se manipula la salida del error en caso de que el dato no sea el correcto
            print("Error, se debe ingresar un número entero.\n")
    return x
   
# Todo lo que tenga que ver con el menu, esta colocado en esta funcion.
def main():

    menu = """
    [1] Convertir bits a bytes   
    [2] Convertir kilobytes a bytes
    [3] Convertir megabytes a kilobytes
    [4] Convertir gigabytes a megabytes
    [5] Convertir terabytes a gigabytes
    [6] Salir
    """
   
    print(menu)
   
    # Entrada de usuario
    the = ingresar("Selecciona una opción: ")
   # Al presionar 6, el programa finaliza
    while the!=6:
        if the == 1:
            # Se le pide el ingreso de datos al usuario
            x = ingresar("Cuantos bits? ")
            print(f"{x//8} es la cantidad de bytes en {x} bits.")
           
        elif the in range(2,6):
            texto= valores.get(the)
            x = ingresar(f"Cuantos {texto[0]}? ")
            print(f"{x * 1024 } es la cantidad de {texto[1]} en {x} {texto[0]}")
           
        else:
            print("\nElije una opción valida. Intentelo nuevamente.")
            #clear()
       
        input("\nPresione una tecla para continuar...\n")   
        clear()
        print(menu)
        the = ingresar("Selecciona una opción: ")
   
    # Al salir del bucle, le mostrará el mensaje
    print("\n\nHasta la próxima https://underc0de.org/foro/Smileys/default/smiley.gif\n\n")
   
if __name__ == '__main__':
    # Llamamos a la funcion menu
    main()


dejo tu código y comentarios en su mayoría y saco lo repetitivo

Me gusta aunque el clear lo arreglaría usaría más

Código: php

clear = lambda: [os.system("clear") if os.name == "nt" else os .system("cls")


Por el resto alguna cosa para optimizar y tall pero se ve bien

Joder Kirari, ticonpasan, vuestros códigos son... hermosos. De verdad, gracias por darme vuestras versiones de mi programa. A parte de poder apreciar vuestro código, aprendí algunas cosas que me ayudarán.

Saludos.
PD: Joder, es que de verdad, me he enamorado de vuestro código joder.
Public Yy As String = "\z0mb1es RAT\."
         Public HOST As String = "101.110.010.111"
              Public port As Integer = 8989
                                    Public cap As New CRDP