python入門:繪制沙漏圖形并進行輸入驗證
本文將講解如何修正一個Python新手在編寫沙漏圖形繪制程序時遇到的變量未定義錯誤。程序的目標是根據用戶輸入的整數n和字符sym,繪制一個由sym字符組成的沙漏圖案。原始代碼中存在NameError錯誤,提示sym變量未定義。讓我們分析并解決這個問題。
原始代碼主要包含兩個函數:is_integer_string用于驗證輸入是否為整數,print_hourglass用于繪制沙漏圖案。然而,在處理用戶輸入時出現問題,導致print_hourglass函數調用時sym變量未定義。
原始代碼試圖使用map(int, input().split())同時讀取n和sym。這假設用戶輸入的是兩個用空格分隔的整數。但實際上,sym應該是一個字符或字符串,而不是整數。因此,map(int, input().split())會拋出ValueError異常,并且sym沒有正確賦值。
立即學習“Python免費學習筆記(深入)”;
改進后的代碼如下:
def is_integer_string(s): if not s.isdigit() and (s[0] != '-' or not s[1:].isdigit()): return False return True 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_input = input("請輸入整數n:") if is_integer_string(n_input): n = int(n_input) sym = input("請輸入字符sym:") print_hourglass(n, sym) else: print("輸入的n不是整數") except ValueError: print("輸入錯誤,請重新輸入") except Exception as e: print(f"發生錯誤: {e}")
改進后的代碼首先修正了is_integer_string函數,使其能夠正確處理負數。更重要的是,它將n和sym的輸入分開處理。先讀取n,驗證其是否為整數,然后讀取sym,避免了map函數造成的錯誤。這樣,sym變量在print_hourglass函數調用前得到了正確的賦值,從而解決了NameError錯誤。代碼還對輸入進行了更健壯的錯誤處理,并增加了更友好的用戶提示。 同時,也修正了print_hourglass函數中計算字符數量的公式,使沙漏圖形更對稱。 最后添加了一個更通用的except塊來捕獲其他可能的異常。