Python résumés si les déclarations

0

La question

Je suis expérimenter avec la façon de condenser si les déclarations dans mon code. J'ai un projet que je suis en train de travailler sur qui a plusieurs "si" consolidés (trop nombreux pour garder une trace de l') et voulez trouver un moyen de les condenser. Évidemment, cela implique une boucle for, mais j'ai de la difficulté d'ajouter d'autres opérations à l'intérieur de cette boucle.

Je suis venu avec le travail ci-exemple pour montrer ma question:

num=6

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

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

Je veux ajouter une pièce supplémentaire pour le code. Cette pièce va exécuter une opération dans l'instruction if. Voir la suite de la non-exemple de travail en tant que cadre pour ce que je suis en train de réaliser:

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)

Pour quelque raison que ce soit, il ne sera pas exécuter l' opération portion de code et échoue avec une erreur de syntaxe. Il ne me laisse pas déclarer la commande "num=num+1" (sans les guillemets) à l'intérieur d'une liste, mais cette déclaration est nécessaire pour l'exécution de la commande. Je me sens comme je suis en manque un petit quelque chose et il devrait être facile à corriger. Je vous remercie à l'avance!!!!

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

La meilleure réponse

1

Le problème ici est que les opérations sont évaluées lorsque vous créez une liste d'entre eux. Vous voulez écrire des chaînes de caractères, et ensuite eval/exec dans la boucle. Je suppose que vous voulez aussi les conditions évaluées dans la boucle.

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

Désolé, j'ai corrigé eval pour exec lors de l'exécution des opérations.
Marcel

Ce n'est généralement pas ce que vous voulez, cependant. Vous devriez écrire le code dans votre fonction, et ne refactoring d'une autre façon.
Marcel

Peut-être d'avoir deux de la fonction de l'un à l'augmentation et à une de la diminution serait une meilleure idée. Vous pouvez ajouter une référence à une liste et de les appeler dans la boucle.
MSH
0

pourquoi ne pas les fonctions?

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

Vous pouvez utiliser les expressions lambda aussi.

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)

Ou vous pouvez utiliser les dictionnaires et les expressions 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

Peut-être une instruction de commutation de la structure susceptible de l'aider.

D'abord définir une fonction de commutation:

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

Ensuite, l'utilisation est en une seule itération de la boucle qui rapporte un cas de fonction de la valeur du commutateur:

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

Dans d'autres langues

Cette page est dans d'autres langues

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