[英]Proper Exiting of While Loop on Error
我很好奇使用while循環處理此錯誤的“正確” pythonic方法是什么。 在此示例中,我可以簡單地檢查字符串以事先查看其是否具有[-1]字符,但是此問題基於此示例的實際代碼要復雜得多。
try:
while mystring[-1] == '!' #Will throw an error if mystring is a blank string
print("Exclamation!")
mystring = mystring[:-1]
return mystring
except:
return ""
實際上,我的問題是我的while循環取決於檢查,偶爾在循環內進行某些處理后,該檢查會拋出錯誤。 以上只是對該問題的(也許是過度的)簡化說明。 我通過一系列try:excepts:修復了它,但是我覺得那不是解決此問題的“正確”方法。
例如,您可以簡單地執行以下操作:
while mystring and mystring[-1] == '!':
print("Exclamation!")
mystring = mystring[:-1]
return mystring
這將起作用,因為如果mystring為空,它將短路並結束循環,因此您將永遠不會嘗試訪問空字符串的-1
索引
編輯:正如Winston所指出的,您可以通過使用str.endswith
來擺脫所有特殊的大小寫,如以下代碼所示
while mystring.endswith('!'):
print("Exclamation!")
mystring = mystring[:-1]
return mystring
當前代碼不應該做的兩件事:
如果您發現自己在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()方法輕松編寫此循環。 通過使用這些內容或精心制作自己的內容,您可以最干凈地處理異常。
使用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 ""
另一種方法是檢查字符串是否為空,並避免使用引發異常的操作:
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
我個人喜歡第二個版本,特別是如果您更改mystring [-1] =='!' 使用mystring.endswith('!')(但是在這種情況下,您不需要檢查是否為空,因為endswith已經為您完成了此操作)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.