Python condensada si las declaraciones

0

Pregunta

Estoy experimentando con el cómo condensar si las declaraciones dentro de mi código. Tengo un proyecto en el que estoy trabajando, que tiene varias declaraciones "if" (demasiados para seguir la pista de), y quiere averiguar una manera de condensar ellos. Obviamente, esto implica un bucle for, pero estoy teniendo problemas para agregar operaciones adicionales dentro de este bucle.

Se me ocurrió el siguiente ejemplo de trabajo para demostrar mi problema:

num=6

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

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

Quiero añadir una pieza adicional para el código. Esta pieza adicional se va a ejecutar una operación de la instrucción if. Ver siguiente no funciona como un marco para lo que estoy tratando de lograr:

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)

Por la razón que sea, no se ejecutará la operación de la porción de código y se produce un error de sintaxis. No me deja declarar el comando "num=num+1" (sin las comillas) dentro de una lista, sin embargo, esta declaración es necesaria para ejecutar el comando. Me siento como que estoy perdiendo un poco la cosa y debe ser una solución fácil. Gracias de antemano!!

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

Mejor respuesta

1

El problema aquí es que las operaciones se evalúan cuando se crea la lista de ellos. Quieres escribir como cadenas, y luego eval/exec en el bucle. Voy a suponer que usted también quiere que las condiciones evaluadas en el bucle.

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

Lo siento, he corregido eval a exec cuando se ejecutan las operaciones.
Marcel

Generalmente, esto no es lo que usted desea, sin embargo. Probablemente, usted debe escribir el código en su función, y hacer la refactorización de alguna otra manera.
Marcel

Tal vez tener dos salones uno para aumentar y uno para la disminución sería una mejor idea. Usted puede agregar una referencia a una lista y llamar a ellos en el bucle.
MSH
0

por qué no funciones?

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

Usted podría utilizar expresiones lambda demasiado.

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)

O usted podría utilizar los diccionarios y las expresiones 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

Tal vez una instrucción switch estructura podría ayudar.

En primer lugar, defina una función de interruptor:

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

A continuación, utilice es en una sola iteración de bucle que se produce un caso de la función para el valor de modificador:

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

En otros idiomas

Esta página está en otros idiomas

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