Python condensat dacă declarațiile

0

Problema

Am experimentat cu cum să condenseze în cazul în declarații în codul meu. Am un proiect, am de lucru pe care are mai multe "dacă" declarațiile (prea multe pentru a urmări) și vreau să găsim o cale să le condenseze. Evident, acest lucru implică o pentru buclă, dar sunt probleme la adăugarea operații suplimentare în această buclă.

Am venit cu următoarele exemplu de lucru pentru a demonstra problema mea:

num=6

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

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

Vreau să adăugați o bucată suplimentară de cod. Această piesă suplimentară va executa o operațiune în cazul în declarație. A se vedea următoarele non-exemplu de lucru ca un cadru pentru ceea ce am încercat să realizeze:

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)

Pentru orice motiv, aceasta nu va executa operația parte din cod și nu cu o eroare de sintaxă. Nu mă lăsa să declare comanda "num=num+1" (fără ghilimele) în termen de o lista, cu toate acestea, această declarație este necesar pentru a executa comanda. Simt că îmi lipsește un pic de lucru și ar trebui să fie ușor de reparat. Va multumesc anticipat!!

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

Cel mai bun răspuns

1

Problema aici este că operațiunile sunt evaluate atunci când creați lista de ele. Vrei să-i scrie ca siruri de caractere, și apoi eval/exec le în bucla. Voi presupune, de asemenea, doriți condițiile evaluate în buclă.

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

Scuze, am corectat eval pentru a exec când se execută operațiuni.
Marcel

Acest lucru este, în general, nu ceea ce vrei, cu toate acestea. Probabil că ar trebui să scrie cod în funcție, și de a face refactoring-un alt mod.
Marcel

Poate avea două funcții pentru creșterea și una de scădere ar fi o idee bună. Puteți adăuga o referință la listă și le numim în buclă.
MSH
0

de ce nu functioneaza?

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

Ai putea folosi expresii lambda prea.

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)

Sau ai putea folosi dicționare și expresii 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

Poate un comutator declarație de structură ar putea ajuta.

Mai întâi să definiți o funcție de comutare:

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

Apoi, utilizați este într-o repetare buclă pentru că dă un caz funcție pentru a comuta valoarea:

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

În alte limbi

Această pagină este în alte limbi

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