¿Hay una manera más pitónica de hacer declaraciones anidadas if else que esta:
def convert_what(numeral_sys_1, numeral_sys_2):
if numeral_sys_1 == numeral_sys_2:
return 0
elif numeral_sys_1 == "Hexadecimal":
if numeral_sys_2 == "Decimal":
return 1
elif numeral_sys_2 == "Binary":
return 2
elif numeral_sys_1 == "Decimal":
if numeral_sys_2 == "Hexadecimal":
return 4
elif numeral_sys_2 == "Binary":
return 6
elif numeral_sys_1 == "Binary":
if numeral_sys_2 == "Hexadecimal":
return 5
elif numeral_sys_2 == "Decimal":
return 3
else:
return 0
Este script es parte de un convertidor simple.
python
if-statement
Módulo_arte
fuente
fuente
and
condiciones para las instrucciones if-else de nivel superior. Al menos sería más legible de esa manera. Lamentablemente, Python no tiene declaraciones de cambio.Respuestas:
Si bien las respuestas de @Aryerez y @ SencerH. Funcionan, cada valor posible de
numeral_sys_1
tiene que escribirse repetidamente para cada valor posiblenumeral_sys_2
al enumerar los pares de valores, lo que hace que la estructura de datos sea más difícil de mantener cuando aumenta el número de valores posibles. En su lugar, puede usar un dict anidado en lugar de sus instrucciones if anidadas:Alternativamente, puede generar los pares de valores para la asignación con el
itertools.permutations
método, cuyo orden sigue el de la secuencia de entrada:fuente
Inserte todas las combinaciones válidas en una
dictionary
detuple
s, y si la combinación no está allí, devuelva 0:Si planea usar la función en un bucle, puede ser una mejor idea definir el diccionario fuera de la función, para que no se vuelva a crear en cada llamada a la función.
fuente
except KeyError:
.get()
método dict con0
default en lugar de latry
declaración.try:... except:...
estructura.Si está seguro de que no se ha podido establecer ningún otro valor en las variables numeral_sys_1 y numeral_sys_2, esta es la solución más simple y limpia.
Por otro lado, debe extender el diccionario con sus combinaciones con los valores disponibles, si tiene cualquier otro valor que no sea "Hexadecimal", "Decimal" y "Binario"
La lógica aquí es; si las tuplas variables en las claves del diccionario no son iguales a la tupla variable dada, el método .get () devuelve "0". Si la tupla variable dada coincide con cualquier clave del diccionario, devuelve el valor de la clave correspondiente
También está utilizando generador podría ser una solución. Parece mucho más inteligente, pero creo que un diccionario codificado sería más rápido que usar un generador para este simple requisito.
fuente
Una forma alternativa usando la lista anidada. ¡¡Espero eso ayude!!
fuente
En mi opinión, esta
convert_what
función en sí no es muy pitónica. Supongo que el código que llama a este código también tiene un montón de sentencias if y realiza la conversión según el valor de retorno deconvert_what()
. Sugiero algo como esto:Primer paso, realice una función para cada combinación:
Segundo paso, coloca los objetos de función en un dict. Tenga en cuenta que no hay () después de los nombres de las funciones, porque queremos almacenar el objeto de la función y no llamarlo todavía:
Tercer y último paso, implementar una función de conversión. La instrucción if verifica si ambos sistemas son iguales. Luego, obtenemos la función correcta de nuestro dict y lo llamamos:
fuente
Esto se hace mediante declaraciones de mayúsculas y minúsculas en la mayoría de los otros idiomas. En python, uso una función simple con un diccionario de expresión.
Código:
Salida:
fuente
En general, correría con una solución de diccionario para la tarea anidada if. Algunos casos particulares pueden llevar a otro enfoque. Como éste:
fuente
¿Qué tal algo como:
fuente
Una Idea está usando una lista y obtiene un índice de resultado, es decir.
fuente
Como dijo @Sadap,
Si va a implementar la conversión de base de los enteros, lo que probablemente va a través de una representación común de todos modos:
int
. No es necesaria una función separada para cada par de bases, y las dos bases involucradas ni siquiera necesitan conocerse entre sí.Entrada
Cree una asignación desde el nombre de un sistema numérico hasta su base:
permitiéndole leer entradas con
int(text, BASES[numeral_sys_1])
.Salida
Cree una asignación del nombre de un sistema numérico a un especificador de formato :
permitiéndole escribir salidas con
format(n, FORMATTERS[numeral_sys_2])
.Ejemplo de uso
O bien dict también se puede hacer más general haciendo que los valores funcionen en su lugar, si necesita admitir un conjunto diferente de formatos
int(x, base)
o más bases de salida que las que admite el formato de entero integrado.fuente
Me gusta mantener el código seco:
fuente
Usando algunas técnicas que proporcionan las otras respuestas y combinarlas:
fuente
Aunque no estoy seguro de si este enfoque es más rápido, también podría hacerse usando numpy:
y se puede usar como:
fuente