2013-04-30 43 views
0

目前,我正在研究一個Python程序,該程序返回在多行輸入中出現次數最多的單詞,最後一行是字符串「### 」。如何測試在Python中沒有輸入3.3.0

poetry = [] 
max = 0 
maxitem = None 
while True: 
poetry.append(input().lower().split()) 
for x in poetry: 
    count = poetry.count(x) 
if count > max: 
    max = count 
    maxitem = x 
    print(maxitem) 

現在,我遇到的主要問題是我在while循環體中得到的EOF錯誤。據我所知,這背後的原因是它不斷要求新的輸入線,但它沒有。我不知道如何糾正這一點。任何與該計劃的其餘部分的幫助,也將不勝感激。

+0

你可以'try'你的代碼,趕上的SyntaxError,使你的代碼的過程爲空字符串或者只是繼續迭代。 – Dolphiniac 2013-04-30 16:50:11

+2

@Dolphiniac:什麼'SyntaxError'?你有沒有嘗試在2.x中運行這個python-3.x代碼? – abarnert 2013-04-30 16:53:26

+0

@abarnert也許我做到了。謝謝。我想我需要更新。 – Dolphiniac 2013-04-30 17:07:35

回答

4

不要使用input()來讀取數據,使用sys.stdin代替:

for line is sys.stdin: 
    poetry.append(line.lower().split()) 

這會讀取來自stdin文件句柄行,直到關閉未拋出異常EOF。如果stdin開始關閉,則循環體不會執行。

+0

謝謝,儘管我更傾向於使用input(),因爲這是我對這項任務的期望。 – Dan 2013-04-30 16:56:46

+1

值得指出兩者之間的差異。 'input'會去掉每個尾隨的換行符(這不重要,因爲你明確地調用'strip')。對於某些IDE/GUI包裝器,'input'可以更好地工作(除非你使用一個IDE)。 'input'將會總是立即運行,而不是等到你打到EOF時爲止,或者至少填充一個緩衝區(這不重要,因爲你沒有運行像文件讀取那樣緩慢的代碼,或者人類用戶或時間敏感)。迭代文件要簡單得多,且易於閱讀(總是很重要)。 – abarnert 2013-04-30 17:03:04

3

使用sys.stdin正如Martijn Pieters所建議的那樣,但爲了完整起見,您可以繼續使用input()。你只需要抓住EOFError異常並退出循環:

while True: 
    try: 
     poetry.append(input().lower().split()) 
    except EOFError: 
     break 
+0

你可以通過使用['iter'](http://docs.python.org/3/library/functions.html#iter)的雙參數形式將它變成一個簡單的'for'循環。 (這並不意味着你應該_特別是因爲,爲了真正做到這一點,你會希望通過一個包裝函數來轉換'EOFError'來返回一個標記,在這一點上,你可能會寫一個代替包裝發電機。) – abarnert 2013-04-30 17:05:07