Сокращенные операторы if на Python

0

Вопрос

Я экспериментирую с тем, как конденсировать операторы if в своем коде. У меня есть проект, над которым я работаю, в котором есть несколько утверждений "если" (слишком много, чтобы их отслеживать), и я хочу найти способ их сжать. Очевидно, что это связано с циклом for, но у меня возникли проблемы с добавлением дополнительных операций в этот цикл.

Я привел следующий рабочий пример, чтобы продемонстрировать свою проблему:

num=6

if_options = [num==5, num==6]

for i in range(len(if_options)):
    if if_options[i]:
        print(num)

Я хочу добавить дополнительный фрагмент в код. Эта дополнительная часть выполнит операцию в операторе if. Смотрите следующий нерабочий пример в качестве основы для того, чего я пытаюсь достичь:

num=6

if_options = [num==5, num==6]
operations = [num=num+1, num=num-1]

for i in range(len(if_options)):
    if if_options[i]:
        operations[i]
        print(num)

По какой-либо причине он не выполнит часть кода операции и завершится ошибкой синтаксиса. Это не позволяет мне объявить команду "num=num+1" (без кавычек) в списке, однако это объявление необходимо для выполнения команды. Я чувствую, что мне не хватает одной маленькой вещи, и это должно быть легко исправить. Заранее благодарю вас!!

for-loop function loops python
2021-11-23 22:51:10
4

Лучший ответ

1

Проблема здесь в том, что операции оцениваются при создании их списка. Вы хотите записать их в виде строк, а затем eval/exec они в курсе событий. Я предполагаю, что вы также хотите, чтобы условия оценивались в цикле.

num = 6

if_options = ['num==5', 'num==6']
operations = ['num=num+1', 'num=num-1']

for i in range(len(if_options)):
    if eval(if_options[i]):
        exec(operations[i])
        print(num)
2021-11-23 23:04:38

Извините, я поправил eval Для exec при выполнении операций.
Marcel

Однако, как правило, это не то, чего вы хотите. Вероятно, вам следует на самом деле написать код в своей функции и выполнить рефакторинг каким-либо другим способом.
Marcel

Возможно, было бы лучше иметь две функции: одну для увеличения и одну для уменьшения. Вы можете добавить ссылку на них в список и вызвать их в цикле.
MSH
0

почему не функции?

def check(inp):
    #you can do some logic and type checking here
    return type(inp)==int # for example, or return arguments to pass to the operatiins

def operation(inp2):
    if inp2: # check if true or not empty, as an example
        #do some operations

# and then you do something like

for x in input_of_things:
    operation( check( x ) )
2021-11-23 23:19:33
0

Вы также можете использовать лямбда-выражения.

num = 6
if_option_checks = [lambda x: x == 5, lambda x: x == 6]
operations = [lambda x: x + 1, lambda x: x - 1]
for check, operation in zip(if_option_checks, operations):
    if check(num):
        num = operation(num)

Или вы можете использовать словари и лямбда-выражения

num = 6
if_option_checks = {"add": lambda x: x == 5, "sub": lambda x: x == 6}
operations = {"add": lambda x: x + 1, "sub": lambda x: x - 1}
for key, check in if_option_checks.items():
    if check(num):
        num = operations[key](num)
2021-11-24 00:40:38
0

Возможно, структура оператора switch могла бы помочь.

Сначала определите функцию переключения:

def switch(v): yield lambda *c: v in c

Затем используйте в цикле for с одной итерацией, который дает функцию case для значения переключателя:

for case in switch(num):

    if case(5):
        num = num + 1
        break

    if case(6):
        num = num - 1
        break

    ...
2021-11-24 02:44:41

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................