0

我正在尝试制作一个程序,该程序在某些用户输入上执行某些任务,例如递增或递减整数,将字符添加到字符串等
。用户可以在同一行中给出多个命令。

当我使用 时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

我正在使用它进行解析。

4

1 回答 1

0

如果您想减少代码使用的行数,您可以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....
于 2013-02-13T10:37:58.797 回答