Есть ли более питонный способ делать вложенные операторы if else, чем этот:
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
Этот скрипт является частью простого конвертера.
python
if-statement
Module_art
источник
источник
and
условия для операторов if-else верхнего уровня. По крайней мере, так будет читабельнее. К сожалению, в python нет операторов switch.Ответы:
Хотя ответы @Aryerez и @ SencerH. Работают, каждое возможное значение
numeral_sys_1
должно многократно записываться для каждого возможного значенияnumeral_sys_2
при перечислении пар значений, что усложняет поддержание структуры данных при увеличении числа возможных значений. Вместо этого вы можете вместо этого использовать вложенный дикт вместо ваших вложенных операторов if:Кроме того, вы можете сгенерировать пары значений для сопоставления с помощью
itertools.permutations
метода, порядок которого соответствует порядку входной последовательности:источник
Вставьте все допустимые комбинации в a
dictionary
изtuple
s, и если комбинации нет, верните 0:Если вы планируете использовать функцию в цикле, возможно, будет лучше определить словарь вне функции, чтобы он не создавался заново при каждом вызове функции.
источник
except KeyError:
.get()
метод dict с0
default вместоtry
оператора.try:... except:...
структура.Если вы уверены, что нет других значений, которые могли бы быть установлены в переменные цифр_сис_1 и числ_сис_2, это самое простое и чистое решение.
С другой стороны, вы должны расширить словарь с его комбинациями с доступными значениями, если у вас есть любое другое значение, кроме «шестнадцатеричный», «десятичный» и «двоичный»
Логика здесь такова; если кортежи переменных в словарных ключах не равны данному кортежу переменных, метод .get () возвращает «0». Если заданный кортеж переменной совпадает с любым ключом в словаре, таким образом, возвращается значение соответствующего ключа.
Существует также использование генератора может быть решением. Выглядит намного умнее, но я думаю, что словарь с жесткой кодировкой будет быстрее, чем использование генератора для этого простого требования.
источник
Альтернативный способ использования вложенного списка. Надеюсь, поможет!!
источник
На мой взгляд,
convert_what
сама эта функция не очень питонна. Я предполагаю, что код, который вызывает этот код, также содержит несколько операторов if и выполняет преобразование в зависимости от возвращаемого значенияconvert_what()
. Я предлагаю что-то вроде этого:Первый шаг, сделайте одну функцию для каждой комбинации:
Второй шаг, поместите объекты функций в диктовку. Обратите внимание, что после имен функций нет (), потому что мы хотим сохранить объект функции и еще не вызывать его:
Третий и последний шаг, реализовать функцию преобразования. Оператор if проверяет, являются ли обе системы одинаковыми. Затем мы получаем правильную функцию из нашего dict и вызываем ее:
источник
Это делается с помощью операторов switch-case в большинстве других языков. В Python я использую простую функцию со словарем выражений.
Код:
Вывод:
источник
В общем, я бы запустил словарное решение для вложенной задачи. Некоторые частные случаи могут привести к другому подходу. Как этот:
источник
Как насчет чего-то вроде:
источник
Идея использует список и получить индекс результата, т.е.
источник
Как сказал @Sadap,
Если вы реализуете преобразование базы для целых чисел, вы , вероятно , через общее представительство в любом случае:
int
. Отдельная функция для каждой пары баз не требуется, и двум задействованным базам даже не нужно знать друг о друге.вход
Создайте отображение из имени системы счисления в ее базу:
позволяя вам читать входы с
int(text, BASES[numeral_sys_1])
.Вывод
Создайте отображение из имени системы счисления в спецификатор формата :
позволяя вам записывать результаты с
format(n, FORMATTERS[numeral_sys_2])
.Пример использования
Любой dict можно также сделать более общим, сделав функции значений вместо этого, если вам нужно поддерживать другой набор форматов
int(x, base)
или больше выходных баз, чем поддерживает встроенное целочисленное форматирование.источник
Мне нравится держать код сухим:
источник
Используя некоторые методы, которые предоставляют другие ответы, и объедините их:
источник
Хотя и не уверен, что этот подход быстрее, но может быть реализован и с помощью numpy:
и может быть использован как:
источник