2012-01-18 54 views
0

嗨,我正在使用嘗試和除了但是當我從打印出來,除了如果還有一些更多的信息,它繼續讀取它 當我使用break它給出了外面的錯誤循環。 如何阻止python讀取其餘行? 感謝避免Python中的其餘行

def translate_word(word): 

    try: 
     return dictionary[word] 
    except KeyError: 
     print 'The ' + str(language) + ' word for ' + str(word) + ' is not found' 

if language == "Italian" : 
    create_dictionary('Italian') 
    print "The Italian word for " + str(word) + " is " + str(translate_word(word)) 

而且它打印出這樣的:

The Italian word for rubbish is not found 

The Italian word for rubbish is None 

在哪裏,我只希望它是:

The Italian word for rubbish is not found 
+5

請給我們展示一些代碼。 –

+0

好的我舉了一個例子 –

回答

2

嗯,是的,如果你在你的代碼中有兩處print語句,兩者的執行,你會得到兩行輸出。

問題的根源在於,你translate_word()功能做了兩兩件事:

  1. ,如果這個詞在字典中返回翻譯
  2. 如果這個詞是不是在它打印錯誤消息詞典

在你的功能之外,當你調用它時,你無法分辨發生了什麼。所以,如果這個詞是不是在字典中,發生兩件事情:

  1. translate_word()函數打印錯誤消息
  2. print聲明打印的translate_word()返回值,因爲你沒有在這個返回任何東西的情況下,是None

它仍然做第二個print的原因是因爲你沒有告訴它不要!

這段代碼有點亂。有時你的函數會返回一個翻譯,有時它不會。有時會打印一條消息,有時卻不會。這使得調用者(在這種情況下)很難規劃其餘的程序。

你應該做的是重寫你的translate_word()函數,以便它做一件事:返回翻譯的單詞。如果它不能,它應該返回None

def translate_word(word): 
    return dictionary.get(word, None) 

(異常處理是沒有必要的;字典的get()方法可以實現這個要求其實,你並不需要的功能在所有 - dictionary.get(word, None)不超過translate_word(word)更長的時間 - 但我們會。假定在一個更大的程序中它會做一些其他的東西,並且需要它自己的功能,並且它的可讀性略高)

我們返回None而不是字符串「not found」,這樣我們可以在必要時,容易區分以下兩種情況:

  1. 這個詞是不是在字典
  2. 這個詞在字典中找到,它的翻譯是英語單詞中,「未找到」

None不是字符串,所以它永遠不會成爲一個翻譯任何東西。這可以安全地用作標誌值,指示找不到該單詞。

當您調用該函數時,然後測試返回值以查看是否找到該單詞。如果是這樣,您可以打印翻譯的單詞。否則,你可以打印你的錯誤信息。

translated_word = translate_word(word) 
if translated_word is None: 
    print "The Italian word for %s is not found" % word 
else: 
    print "The Italian word for %s is %s" % (word, translated_word) 

這樣,所有做類似事情的代碼都在同一個地方,而且很容易理解和推理。這被稱爲,由專業程序員分離關注點。讓每一塊代碼只做一件事和一件事是很好的做法,因爲它更易於理解,編寫和維護。特別是,分離程序的輸入/輸出和數據操作部分幾乎總是會使它更直接。

考慮:你錯過了你的程序正在做的事情,而你的程序少於十行。想象一下,如果理解這樣的程序有多難,如果它有一百萬行而你沒有寫出它!

有很多方法可以進一步簡化驗證碼:

translated_word = translate_word(word) 
print "The Italian word for %s is %s" % (word, 
    translated_word if translated_word else "not found") 

現在你說的Python!

+0

謝謝,這對我來說也是有用的! (我希望有一天能夠這樣回答)。 –

+0

謝謝你。我厭倦了必須成爲解釋問題分離WRT I/O所有時間的人:) –

0

你可以用一個簡單的dict.get完全替代功能:

if language == "Italian" : 
    create_dictionary('Italian') 
    print "The Italian word for " + str(word) + " is " + dictionary.get(word, "not found") 
+0

雖然op可能不想結束程序,但他們可能只是想跳過循環的其餘部分 –

+0

@HunterMcMillen:「循環外的休息」讓我相信他不在循環中,只是想阻止腳本的其餘部分運行。但問題相當模糊。 –

+0

測試中的文件「C:\ Python25 \ lib \ doctest.py」,第1228行,在__run compileflags中,1)。 文件「H:\ IND104 \ final \ Project 4 - Italian-Spanish Translator \ translator_q.py」 文件「」,第1行,在 譯員('Italian','垃圾' 「,第146行,在譯員 print」意大利語單詞「+ str(word)+」是「+ str(translate_word(單詞)) 文件」H:\ IND104 \ final \ Project 4 - Italian-Spanish Translator \ translator_q.py「,第131行,在translate_word sys.exit() SystemExit –

1

你通常break圈外:

for line in open('filename', 'r'): 
    if line is 'foo': 
    break 

    # Line isn't foo. Keep going 
1

那麼你應該簡單地做:

result = dictionary.get(word, 'Not Found') 
print "The Italian word for " + str(word) + " is " + result 

official documentation
get(key[, default])返回key的值,如果鍵在字典中,否則默認。

更新:get甚至可以用在評論中的代碼。

例子:

create_dictionary('Spanish').get(word, 'Not Found') 
+0

這個問題,當我這樣做,我有一個如果這樣的函數,如果create_dictionary('西班牙語')[word] == create_dictionary('意大利語')[單詞]:相同=「 - 意大利語和西班牙語相同。 else:same =「」這也給出了錯誤 –

+0

@SarpKaya:我已經更新了我的答案。請注意''KeyError'異常很容易通過使用'get'來避免,也許這會對你有所幫助。否則請解釋一下'create_dictionary'的作用和你的目標是什麼。 –

0

使用::

numCheck = 1 
def translate_word(word): 
try:   
    return dictionary[word]  
except KeyError:   
    print 'The ' + str(language) + ' word for ' + str(word) + ' is not found' 
    numCheck = 0 

if language == "Italian" and numCheck != 0:  
create_dictionary('Italian')  
print "The Italian word for " + str(word) + " is " + str(translate_word(word)) 

應該有所幫助。如果沒有更多操作要做,可以使用exit()從腳本中退出。