py_number_base_converter · Python
▶ Aprender py_number_base_converter (Python) paso a paso · explicación de py_number_base_converter
Código línea a línea
Tres columnas: el código, el trozo del subject o del main que obliga a escribir esa línea, y el por qué.
py_number_base_converter.py
| Código | Subject | Por qué |
|---|---|---|
DIGITS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" | Use digits 0-9 and letters A-Z for values 10-35. | El alfabeto de dígitos: la posición de cada carácter es su valor. Sirve para leer y para escribir. |
| ||
| ||
def number_base_converter(number: str, from_base: int, to_base: int) -> str: | def number_base_converter(number: str, from_base: int, to_base: int) -> str: | Firma del subject. |
if not 2 <= from_base <= 36 or not 2 <= to_base <= 36 or not number: | Support bases from 2 to 36 inclusive. Return "ERROR" for invalid inputs. | Bases fuera de rango o número vacío: error antes de hacer nada. |
return "ERROR" | Return "ERROR" for invalid inputs. | El string literal "ERROR". La misma línea sirve para los dos return de error. |
value = 0 | converts a number from one base to another | Paso 1: pasar el string a un entero. Acumulo aquí. |
for ch in number.upper(): | Use digits 0-9 and letters A-Z | Dígito a dígito. Con upper() acepto también minúsculas. |
digit = DIGITS.find(ch) | Valor del dígito, o -1 si no es un carácter válido. | |
if digit < 0 or digit >= from_base: | number_base_converter("G", 16, 10) => "ERROR" | Carácter desconocido, o dígito demasiado grande para la base de origen (G no existe en base 16). |
return "ERROR" | Return "ERROR" for invalid inputs. | El string literal "ERROR". La misma línea sirve para los dos return de error. |
value = value * from_base + digit | Esquema de Horner: desplazo lo que llevo una posición y sumo el dígito. | |
if value == 0: | Caso especial: el bucle de abajo no produce nada con 0. | |
return "0" | Un cero. | |
out = "" | Paso 2: entero a string en la base destino. | |
while value: | Mientras quede algo. | |
out = DIGITS[value % to_base] + out | Use digits 0-9 and letters A-Z for values 10-35. | El resto es el dígito menos significativo; lo pongo por delante para no tener que invertir al final. |
value //= to_base | Quito ese dígito. | |
return out | Resultado en mayúsculas, como piden los ejemplos. |