2011-08-23 169 views
1

我很好奇什麼是'正確的'pythonic方式來處理這個錯誤while while循環。在這個例子中,我可以簡單地檢查一下字符串以查看它是否有一個[-1]字符,但是這個例子中我的問題的實際代碼更復雜。正確退出while循環出錯

try: 
    while mystring[-1] == '!' #Will throw an error if mystring is a blank string 
     print("Exclamation!") 
     mystring = mystring[:-1] 
    return mystring 
except: 
    return "" 

切實我的問題是,我while循環是在檢查,循環中的一些處理之後偶爾會拋出一個錯誤隊伍。以上只是這個問題的一個(也許是過度)簡單的說明。我用一系列的嘗試來解決它:除了:'s,但我覺得這不是解決這個問題的「正確」方式。

+0

你想在這裏做什麼?你遇到什麼問題? – murgatroid99

+0

實際上,我的問題是我的while循環取決於一個檢查,偶爾在循環內進行一些處理後會拋出錯誤。 –

+2

嘗試/ excepts實際上是一種非常pythonic的方式來處理這種異常(更容易請求寬恕比權限,http://docs.python.org/glossary.html#term-eafp) – Jdog

回答

3

兩件事情你當前的代碼做,你不應該這樣做:

  1. 捕捉任何異常,你應該抓住剛感興趣
  2. 特定異常包括在try塊的整個循環,你應該如果可能的話只包含那個引發異常的語句/表達式

如果你發現自己在python中使用while循環了很多,它表明你沒有最有效地使用python。鑑於python的工具集,你應該幾乎總是使用某種for循環。沒有看到你的代碼的實際樣品,我不能說這是否是真的。如果你想在這方面有所幫助,張貼一些代碼在http://codereview.stackexchange.com

這個問題的一般解決方法是寫一個處理異常和使用該功能。

def last_character(string): 
    try: 
     return string[-1] 
    except IndexError: 
     return ' ' 

while last_character(mystring) == '!' 
    mystring = mystring[:-1] 
return mystring 

事實上,在許多情況下,已經有異常少等同的標準結構。這個循環可以使用.endswith()方法輕鬆編寫。通過使用這些或製作你自己的代碼,你可以最乾淨地處理異常。

2

使用mystring.rstrip('!')在字符串;-)

結束如果問題要複雜得多刪除'!'字符,正確的方法是捕捉由操作拋出的IndexError。

try: 
    while mystring[-1] == '!' #Will through an error if mystring is a blank string 
     print("Exclamation!") 
     mystring = mystring[:-1] 
    return mystring 
except IndexError: 
    return "" 

另一種方法是檢查emptyness字符串,並使用這引起了異常的操作避免:

while mystring and mystring[-1] == '!': # lazy boolean expression evaluation 
     mystring = mystring[:-1] 
return mystring 

其他版本沒有偷懶布爾表達式求值:

if not mystring: 
    return mystring 
while mystring[-1] == '!': 
    mystring = mystring[:-1] 
    if not mystring: 
     break 
return mystring 

我personnaly青睞第二個版本,尤其是如果你改變mystring [-1] =='!'與mystring.endswith('!')(但在這種情況下,你不需要檢查空白,因爲endswith已經爲你做了這個)。

+0

這不是他的問題。 – agf

+0

編輯我的問題是一個更清楚。 –

+0

第二種方法會執行「mystring [-1] =='!'」檢查第一個(「mystring」)檢查是否失敗?或者只要「訂單」中的第一個失敗就停止? –

3

對於你的榜樣,你可以簡單地這樣做:

while mystring and mystring[-1] == '!': 
    print("Exclamation!") 
    mystring = mystring[:-1] 
return mystring 

這工作,因爲它會短路並結束循環,如果MyString的是空的,所以你永遠不會嘗試訪問-1指數一個空字符串

編輯:正如溫斯頓指出的那樣,你可以通過使用str.endswith如下面的代碼

擺脫所有的特殊外殼的
+0

您也可以遞減要測試的位置的計數器,然後只在最後返回一次副本,而不是複製字符串在每一次迭代。 – agf

+1

@agf確實如此,但OP的問題似乎更多的是處理while循環中的特殊情況,而不是處理特定問題。 – murgatroid99

+3

使用mystring.endswith更好 –