Python kondenzované pokud prohlášení

0

Otázka

Já jsem experimentoval s jak kondenzovat, pokud prohlášení v mém kódu. Mám projekt, jsem pracoval na, že má několik "pokud" prohlášení (příliš mnoho, aby sledovat) a chcete se přijít na způsob, jak kondenzovat. Samozřejmě se jedná pro smyčce, ale mám potíže přidání další operace v rámci této smyčky.

Já jsem přišel s následující pracovní příkladu demonstrovat můj problém:

num=6

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

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

Chci přidat další kus kódu. Tento další kus se bude provádět operace v if prohlášení. Viz následující non-pracovní příklad jako rámec pro to, co jsem se snaží dosáhnout:

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)

Z nějakého důvodu, to nebude vykonávat operace část kódu, a selže s chybou syntaxe. To mi nedovolí prohlásit, že příkaz "num=num+1" (bez uvozovek) v seznamu, nicméně toto prohlášení je nezbytné pro provedení příkazu. Mám pocit, že jsem chybí jedna maličkost, a to by mělo být snadné opravit. Předem děkuji!!

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

Nejlepší odpověď

1

Problém je, že operace jsou hodnoceny, když si vytvořit seznam z nich. Chcete psát jako řetězce, a pak eval/exec je ve smyčce. Budu předpokládat, že chcete také podmínky hodnoceny ve smyčce.

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

Omlouvám se, opravil jsem eval k exec při spuštění operace.
Marcel

To je obecně to, co chcete, nicméně. Asi bys měl vlastně psát kód do své funkce, a dělat refactoring nějakým jiným způsobem.
Marcel

Možná má dvě funkce, jedna pro zvýšení a jeden pro snížení by bylo lepší nápad. Můžete přidat odkaz do seznamu a volat jim ve smyčce.
MSH
0

proč není funkce?

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

Můžete použít lambda výrazy.

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)

Nebo byste mohli použít slovníky a lambda výrazy

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

Možná, že příkaz switch struktura by mohla pomoci.

Nejprve definovat funkce spínače:

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

Pak použijte je v jedné iteraci smyčky for, že výnosy případ funkce pro přepínání hodnoty:

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

V jiných jazycích

Tato stránka je v jiných jazycích

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