簡體   English   中英

如何使if-elif條件的條件更短以進行解析

[英]How to make if-elif conditionals shorter for parsing

我正在嘗試制作一個程序,以在某些用戶輸入上執行某些任務,例如遞增或遞減整數,向字符串添加字符(charachter)等。
用戶可以在同一行中給出多個命令。

當我使用raw_input ,我不能(也不想)接受多行輸入。

是否可以使if-elif-else條件條件更短,並保持可讀性呢?

for i in test_str:
    if i == '[':
        a += 1
    elif i == '(':
        b += 1
    elif i == ']' and c > 0:
        c -= 1
    elif i == ')'and d > 0:
        d -= 1
    elif c == 0 and d == 0:
        ret += i
    ... # more elifs

像這樣的elif也有可能:

elif i == 'o':
    if test_str[test_str.index(i)+1] == i: # next char is same
         # handle
    else:
         # handle

我正在使用它進行解析。

如果要減少代碼使用的行數,則只需在一行上使用if - elif - else語句即可。

if i == '[':
    a += 1
elif i == '(':
    b += 1
elif i == ']' and c > 0:
    c -= 1
elif i == ')'and d > 0:
    d -= 1
elif c == 0 and d == 0:
    ret += i

成為:

if i == '[': a += 1   
elif i == '(': b += 1   
elif i == ']' and c > 0: c -= 1   
elif i == ')'and d > 0: d -= 1    
elif c == 0 and d == 0: ret += i

但是,您應該更改正在使用的邏輯,而不是這樣做。

首先,您應該使用一個函數,我也建議您使用某種映射。

例:

d = {
'[' : ('add', a, 1),
'(' : ('add', b, 1),
']' : ('method', my_method, ['sample_arg1', 'sample_arg2'], {'sample_kwarg' : 'sample value'})} 

def check_char(char, mapping):
    mapper = d.get(char, None)
    if mapper:
        if mapper[0] == 'add':
            mapper[1] += mapper[2]
        if mapper[0] == 'subtract':
            mapper[1] -= mapper[2]
        if mapper[0] == 'method':
            mapper[1](char, mapper[2], mapper[3])
    # you get the idea....

def my_method(char, *args, **kwargs):
    # deal with char....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM