嗯,是的,如果你在你的代碼中有兩處print
語句,兩者的執行,你會得到兩行輸出。
問題的根源在於,你translate_word()
功能做了兩兩件事:
- ,如果這個詞在字典中返回翻譯
- 如果這個詞是不是在它打印錯誤消息詞典
在你的功能之外,當你調用它時,你無法分辨發生了什麼。所以,如果這個詞是不是在字典中,發生兩件事情:
- 的
translate_word()
函數打印錯誤消息
- 的
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」,這樣我們可以在必要時,容易區分以下兩種情況:
- 這個詞是不是在字典
- 這個詞在字典中找到,它的翻譯是英語單詞中,「未找到」
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!
請給我們展示一些代碼。 –
好的我舉了一個例子 –