Python condensada no caso de instruções

0

Pergunta

Eu estou a experimentar como condensar instruções se dentro do meu código. Eu tenho um projeto que eu estou trabalhando no que tem várias instruções "if" (muitos para acompanhar o) e quer descobrir uma maneira de agrupá-los. Obviamente, isso envolve um loop for, mas eu estou tendo problemas para adicionar operações adicionais dentro deste loop.

Eu vim com o seguinte exemplo de trabalho para demonstrar o meu problema:

num=6

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

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

Eu quero adicionar uma peça adicional para o código. Esta peça irá executar uma operação dentro da instrução if. Veja a seguir não-exemplo de trabalho como um framework para o que eu estou tentando fazer:

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 alguma razão, ele não irá executar a operação de parte do código e falha com um erro de sintaxe. Não deixe-me declarar o comando "num=num+1" (sem aspas) dentro de uma lista, no entanto, esta declaração é necessária para executar o comando. Eu sinto falta de uma coisa pequena e deve ser fácil de corrigir. Obrigado antecipadamente!!

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

Melhor resposta

1

O problema aqui é que as operações são avaliadas quando você cria a lista deles. Você quer escrevê-los como seqüências de caracteres e, em seguida, eval/exec - los em loop. Vou assumir que você também quer as condições avaliadas no loop.

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

Desculpe, eu corrigido eval para exec quando executando as operações.
Marcel

Geralmente isto não é o que você quer, no entanto. Provavelmente, você deve escrever o código em sua função, e fazer a refatoração de alguma outra forma.
Marcel

Talvez ter duas funções, uma para o aumento e uma diminuição seria uma idéia melhor. Você pode adicionar uma referência a um lista de e chamá-los em loop.
MSH
0

por que não funciona?

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

Você pode usar expressões lambda também.

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 você poderia usar dicionários e expressões 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

Talvez uma instrução switch estrutura poderia ajudar.

O primeiro passo é definir um parâmetro de função:

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

Em seguida, use é uma iteração de loop que gera um caso de função para o valor de opção:

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

Em outros idiomas

Esta página está em outros idiomas

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