iT邦幫忙

0

Multiple line input 處理未知行數輸入的 Python 程式

  • 分享至 

  • xImage
  •  

問題分析

當我們不知道輸入的行數時,最直觀的方法就是一直讀取輸入,直到遇到一個特定的結束標記或達到檔案結尾。Python 提供了幾種方式來處理這種情況。

解決方案

  • 方法一:使用 while 迴圈和 input()
#初始化一個空字符串 result 用來儲存最終的結果。
result = ""
#使用 while True 創造一個無限循環。
while True: 
    line = input() 
    # 當用戶輸入內容為空行並按下enter後,表示輸入結束,跳出循環。
    if not line:  
        break
    result += line + "-"#將讀取到的行連同 - 拼接至 result。

print(result)

優點:
簡單易懂,適合初学者。
可以靈活處理各種輸入。

  • try excpet 預期使用者可能會輸入不符合預期格式的數據時
    使用 try-except 處理不定行輸入的優點:
  • 錯誤處理: 可以捕獲並處理各種異常,例如 ValueError(當輸入無法轉換為預期數據類型時)、EOFError(當遇到輸入結束符時)等。
  • 程式穩定性: 即使使用者輸入錯誤,程式也不會突然終止,而是會進入 except 塊,進行相應的處理。
  • 彈性: 可以根據不同的異常類型,採取不同的處理措施。
while True:
    try:
        user_input = input()
        if not line:
            break
        result += line + "-"
    except EOFError:
        print("輸入結束")
        break
    
print(result)
  • 使用生成器表達式優化使用 while 迴圈和 input()
def generate_result():
    result = ""
    while True:
        line = input()
        if not line:
            break
        yield result + line + "-"
        result = ""

result = "".join(generate_result())
print(result)

為什麼使用生成器函數?

  • 節省記憶體: 它不會一次性將所有結果都存儲在記憶體中,而是在每次迭代時生成一個值,這樣可以處理非常大的數據集。
  • 提高效率: 生成器函數可以更早地產生結果,不需要等到所有數據處理完畢。
    解析code:
    yield result + line + "-"
    yield 關鍵字將函數變成一个生成器。
    每次调用 generate_result() 時,都會從上一次離開的地方繼續執行,直到遇到下一個 yield 表達式或函數結束。在這裡,它會將當前的 result、讀取的 line 以及連接符 - 拼接起来,並作為生成器的返回值。
  • 方法二:使用 sys.stdin.readline()
import sys

result = ""
for line in sys.stdin:
    line = line.rstrip()  # 去除行尾的換行符
    result += line + "-"

print(result)

優點:
更接近底層,效率更高。
可以處理較大的輸入。

注意事項

輸入結束標記: 在某些特定情況下,你可以使用一個特定的字符串作為輸入結束的標記,例如 exit。
檔案輸入: 如果輸入來自一個檔案,可以使用 with open('filename', 'r') as f: 來打開檔案,然後逐行讀取。
Python 版本: 不同版本的 Python 在處理輸入方面可能略有差異。
編碼: 如果輸入包含非 ASCII 字符,需要指定適當的編碼,例如 encoding='utf-8'。
範例:從檔案讀取並處理

with open('input.txt', 'r') as f:
    result = ""
    for line in f:
        line = line.rstrip()
        result += line + "-"

print(result)

拓展

多種分隔符: 可以根據需求使用不同的分隔符,例如空格、逗號等。
忽略空行: 如果要忽略空行,可以在判斷條件中加入 if line.strip():。
處理特殊字符: 如果輸入包含特殊字符,需要進行轉義或使用 raw_string。

選擇最適合的方法

互動式輸入: 使用 input() 較為直觀。
檔案輸入: 使用 sys.stdin 或 with open() 更高效。
性能要求: 對於大規模輸入,sys.stdin 可能會有更好的性能。

總結

通過以上方法,我們可以有效地處理未知行數的輸入,並根據需求進行定制。選擇哪種方法主要取決於具體的應用場景和對性能的要求。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言