2013-02-13 26 views
1

我正在嘗試製作一個程序,用於在某些用戶輸入上執行某些任務,如遞增或遞減整數,向字符串中添加字符等。
用戶可以給同一行中有多個命令。如何使if-elif條件縮短來解析

當我使用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 

我用這解析。

+2

它看起來足夠短,給我。它仍然可讀。 – eumiro 2013-02-13 10:25:44

+4

那麼,如果你能夠擴展你分享的信息,那麼它將會有所幫助,因爲它並不瞭解更多信息,我沒有看到任何真正的方法來減少這種情況。一個建議是根據「i」的值將字典映射到應該完成的操作。 – 2013-02-13 10:26:14

+1

什麼是應用程序?你正在編寫一個解析器或支撐匹配器嗎? – 2013-02-13 10:26:29

回答

1

如果你想減少你的代碼使用的行數,你可以在一行上簡單地執行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.... 
+0

查看我對elifs可能類型的更新。 – pradyunsg 2013-02-13 10:47:18

+0

我明白了,我不會爲你寫代碼,但是你應該用我的例子作爲開始爲你的代碼編寫適當的函數。更進一步的建議是將它們全部包裝在一個類中,併爲每種類型的組合/動作提供一個函數,將每種情況映射到最通用的形式,然後您的界面將僅僅是提供流,字符串或字符到你的函數中,它會完成剩下的工作。 :) – 2013-02-13 10:49:47

+0

你能告訴我如何處理多個elifs,使用地圖,而不是代碼,但只是一個開始,就像是什麼可以使用的想法。 – pradyunsg 2013-02-13 10:57:58