python新手打印沙漏圖案時遭遇NameError:問題分析與代碼改進
本文針對Python初學者在打印沙漏圖案時遇到的NameError: name ‘sym’ is not defined錯誤提供詳細的解決方案。 原始代碼意圖使用print_hourglass函數打印由用戶指定字符構成的沙漏圖案,但由于輸入處理不當導致錯誤。
問題根源在于原始代碼的輸入處理:它試圖同時讀取行數和字符,但如果用戶輸入格式不正確(例如,只輸入一個數字或輸入非數字字符),map(int, input().split())函數會引發ValueError異常。 更重要的是,即使沒有ValueError,如果用戶沒有提供第二個輸入(字符),sym變量將未定義,從而導致NameError。
改進后的代碼通過更穩健的輸入處理和變量定義解決了這個問題:
立即學習“Python免費學習筆記(深入)”;
def is_integer_string(s): """檢查輸入字符串是否為整數""" try: int(s) return True except ValueError: return False def print_hourglass(n, sym): """打印沙漏圖案""" i = 1 while n >= i * i: print(' ' * (i - 1) + sym * (i * 2 -1)) # 修正公式 print(' ' * (i - 1) + sym * ((i + 1) * 2 -1)) # 修正公式 i += 2 while i > 0: print(' ' * (i - 1) + sym * (i * 2 -1)) # 修正公式 i -= 2 try: n_str = input("請輸入沙漏的行數(奇數):") if is_integer_string(n_str): n = int(n_str) if n % 2 == 0: print("請輸入奇數") else: sym = input("請輸入構成沙漏的字符:") print_hourglass(n, sym) else: print("無效輸入,請輸入整數") except Exception as e: print(f"發生錯誤: {e}")
改進之處:
- 更清晰的輸入提示: 代碼增加了輸入提示,指導用戶輸入行數和字符。
- 單獨讀取輸入: 代碼分別讀取行數和字符,避免了map函數的潛在問題。
- 整數校驗: is_integer_string函數簡化了,使用try-except塊更簡潔地檢查輸入是否為整數。
- 奇數校驗: 增加了對輸入行數是否為奇數的校驗,確保沙漏圖案的正確顯示。
- 錯誤處理: 使用try-except塊捕獲所有可能的異常,并打印友好的錯誤信息。
- 公式修正: 原代碼中打印沙漏圖案的公式略有瑕疵,已修正,使其能夠正確打印沙漏圖案。
通過這些改進,代碼更加健壯,能夠有效地處理各種用戶輸入,避免NameError錯誤,并打印出正確的沙漏圖案。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END