Existe uma maneira mais pitônica de fazer declarações aninhadas se mais 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 é parte de um conversor simples.
python
if-statement
Module_art
fonte
fonte
and
condições das instruções if-else de nível superior. Seria pelo menos mais legível assim. Infelizmente, o python não possui instruções de opção.Respostas:
Enquanto as respostas de @Aryerez e @ SencerH. Funcionam, cada valor possível de
numeral_sys_1
deve ser escrito repetidamente para cada valor possívelnumeral_sys_2
ao listar os pares de valores, dificultando a manutenção da estrutura de dados quando o número de valores possíveis aumenta. Em vez disso, você pode usar um dict aninhado no lugar das instruções if aninhadas:Como alternativa, você pode gerar os pares de valores para o mapeamento com o
itertools.permutations
método, cuja ordem segue a da sequência de entrada:fonte
Insira todas as combinações válidas em um
dictionary
detuple
s e, se a combinação não estiver lá, retorne 0:Se você planeja usar a função em um loop, pode ser uma idéia melhor definir o dicionário fora da função, para que não seja recriado em todas as chamadas para a função.
fonte
except KeyError:
.get()
método dict com0
padrão em vez datry
instruçãotry:... except:...
estrutura.Se você tiver certeza de que nenhum outro valor poderia ter sido definido para as variáveis numeral_sys_1 e numeral_sys_2, esta é a solução mais simples e limpa.
Por outro lado, você deve estender o dicionário com suas combinações com os valores disponíveis, se tiver outro valor que não seja "Hexadecimal", "Decimal" e "Binário"
A lógica aqui é; se as tuplas variáveis nas chaves do dicionário não forem iguais a determinada tupla variável, o método .get () retornará "0". Se determinada variável tupla corresponder a qualquer chave no dicionário, retornará o valor da chave correspondente.
Há também usando gerador poderia ser uma solução. Parece muito mais inteligente, mas acho que o dicionário codificado seria mais rápido do que usar um gerador para esse requisito simples.
fonte
Uma maneira alternativa usando lista aninhada. Espero que ajude!!
fonte
Na minha opinião, essa
convert_what
função em si não é muito pitônica. Eu acho que o código que chama esse código também possui várias instruções if e faz a conversão dependendo do valor de retorno deconvert_what()
. Sugiro algo como isto:Primeiro passo, faça uma função para cada combinação:
Segundo passo, coloque os objetos de função em um ditado. Observe que não há () após os nomes das funções, porque queremos armazenar o objeto da função e ainda não o chamamos:
Terceiro e último passo, implemente uma função de conversão. A instrução if verifica se os dois sistemas são iguais. Então, obtemos a função correta de nosso ditado e a chamamos:
fonte
Isso é feito por instruções de caso de switch na maioria dos outros idiomas. Em python, eu uso uma função simples com um dicionário de expressão.
Código:
Resultado:
fonte
Em geral, eu correria com a solução de dicionário para tarefa aninhada se. Alguns casos particulares podem levar a outra abordagem. Como este:
fonte
Que tal algo como:
fonte
Uma idéia está usando uma lista e obtém o índice do resultado, ou seja.
fonte
Como o @Sadap disse,
Se você está implementando conversão base para inteiros, provavelmente você está passando por uma representação comum de qualquer maneira:
int
. Uma função separada para cada par de bases não é necessária, e as duas bases envolvidas nem precisam saber uma da outra.Entrada
Crie um mapeamento a partir do nome de um sistema numérico até sua base:
permitindo ler entradas com
int(text, BASES[numeral_sys_1])
.Resultado
Crie um mapeamento a partir do nome de um sistema numérico para um especificador de formato :
permitindo escrever saídas com
format(n, FORMATTERS[numeral_sys_2])
.Exemplo de uso
Qualquer regra também pode ser tornada mais geral, fazendo com que os valores funcionem, se você precisar oferecer suporte a um conjunto diferente de formatos
int(x, base)
ou mais bases de saída do que a formatação inteira integrada suporta.fonte
Eu gosto de manter o código seco:
fonte
Usando algumas técnicas fornecidas pelas outras respostas e combiná-las:
fonte
Embora não tenha certeza se essa abordagem é mais rápida, mas pode ser feita usando o numpy também:
e pode ser usado como:
fonte