Python condensato, se le istruzioni

0

Domanda

Sto sperimentando come condensare se le istruzioni all'interno del mio codice. Ho un progetto a cui sto lavorando che ha una serie di "if" (troppi per tenere traccia di) e si vuole capire un modo per condensare loro. Ovviamente questo comporta un ciclo for, ma sto avendo problemi di aggiunta di ulteriori operazioni all'interno di questo ciclo.

Mi si avvicinò con il seguente esempio per dimostrare il mio problema:

num=6

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

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

Voglio aggiungere un ulteriore pezzo di codice. Questo ulteriore pezzo di eseguire un'operazione all'interno dell'istruzione if. Vedi di non-lavoro esempio di come in un quadro di quello che sto cercando di realizzare:

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)

Per qualsiasi motivo, di non eseguire l' operazione di porzione di codice e non riesce con un errore di sintassi. Non mi permette di dichiarare il comando "num=num+1" (senza virgolette) all'interno di una lista, tuttavia questa dichiarazione è necessaria per eseguire il comando. Sento che mi manca una cosa da poco e dovrebbe essere una facile soluzione. Vi ringrazio in anticipo!!!!

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

Migliore risposta

1

Il problema qui è che le operazioni vengono valutate quando si crea l'elenco dei loro. Vuoi scrivere come stringhe, e quindi eval/exec loro nel ciclo. Io assumo anche voi volete le condizioni valutate nel ciclo.

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

Scusa, ho corretto eval per exec quando si eseguono le operazioni.
Marcel

In genere questo non è ciò che si desidera, tuttavia. Probabilmente si dovrebbe scrivere il codice della funzione, e fare refactoring qualche altro modo.
Marcel

Magari avere due funzioni, una per l'aumento e una diminuzione sarebbe un'idea migliore. È possibile aggiungere un riferimento a un elenco e li chiamano in loop.
MSH
0

perché non funzioni?

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

Si potrebbe utilizzare le espressioni lambda troppo.

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)

Oppure si potrebbe usare dizionari e le espressioni lambda

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

Forse un'istruzione switch struttura potrebbe aiutare.

Prima di definire una funzione di commutazione:

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

Quindi utilizzare si trova in una iterazione per un ciclo che produce un caso di funzione per impostare il valore:

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

In altre lingue

Questa pagina è in altre lingue

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