Skrócone instrukcje if Pythona

0

Pytanie

Ja eksperymentuję z tym, jak skondensować instrukcje if w kodzie. Mam projekt, nad którym pracuję, w którym znajduje się kilka stwierdzeń "jeśli" (zbyt wiele, aby ich śledzić), i chcę znaleźć sposób, aby je skompresować. Oczywiście, że jest to związane z cyklem for, ale mam problemy z dodaniem dodatkowych operacji w ten cykl.

Przyprowadziłem następny roboczy przykład, aby zaprezentować swój problem:

num=6

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

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

Chcę dodać dodatkowy fragment kodu. Ta dodatkowa część wykona operację w instrukcji if. Zobacz następny niesprawny przykład jako podstawę dla tego, co chcę osiągnąć:

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)

Z jakiegoś powodu nie wykona część kodu operacji i zakończy się błędem składni. To nie pozwala mi ogłosić polecenie "num=num+1" (bez cudzysłowów) w liście, jednak to ogłoszenie jest niezbędne do wykonania polecenia. Czuję, że brakuje mi jednej małej rzeczy, i to powinno być łatwo naprawić. Z góry dziękuję!!

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

Najlepsza odpowiedź

1

Problem polega na tym, że operacje są oceniane przy tworzeniu ich listy. Chcesz zapisać je w postaci wierszy, a następnie eval/exec są one na bieżąco. Zakładam, że chcesz również, aby warunki były oceniane w cyklu.

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

Przepraszam, ja poprawiłem eval Dla exec podczas wykonywania operacji.
Marcel

Jednak, jak zwykle, to nie jest to, czego chcesz. Prawdopodobnie należy właściwie napisać kod w swojej funkcji i wykonać refaktoryzacja w jakikolwiek inny sposób.
Marcel

Może byłoby lepiej mieć dwie funkcje: jedną dla wzrostu i jedną zmniejszać. Możesz dodać link do nich na listę i wywołać je w pętli.
MSH
0

dlaczego nie funkcji?

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

Możesz także użyć wyrażenia lambda.

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)

Lub można korzystać ze słowników i lambda-wyrażenia

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

Możliwe, struktura operatora switch mogłaby pomóc.

Najpierw należy zdefiniować funkcję przełączania:

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

Następnie użyj pętli for z jednej iteracji, który daje funkcję case dla wartości przełącznika:

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

W innych językach

Ta strona jest w innych językach

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