該程序很難學習。即使正確使用冒號和括號,您的程序也很可能無法按預期工作。這通常意味著您忽略了某些內容或誤解了語言結構,您需要在代碼中找到期望和現實不同的地方。
程序員通常使用稱為調試器的工具來解決這種情況。您可以使用調試器逐步運行您的程序。不幸的是,大多數調試器都針對專業用途進行了優化,並假定用戶已經熟悉語言結構的語義(例如函數調用)。
Thonny 是一個初學者的 Python IDE。 塔爾圖大學,愛沙尼亞。調試器是專門為學習和教學編程而設計的,因此它採用了不同的方法。
Thonny 也適合初學者,但本文面向至少具有 Python 或其他命令式語言經驗的讀者。
入門
從版本 27 開始,Tony 就被包含在 Fedora 存儲庫中。 使用 sudo dnf install thonny 安裝或使用您選擇的圖形工具(例如軟件)。
當你第一次啟動 Thonny 時,一些準備工作已經完成,你會看到一個空的編輯器和一個 Python shell。將以下程序文本複製到編輯器中並將其保存到文件 (Ctrl + S)。
n = 1 while n < 5: print(n * "*") n = n + 1
讓我們先運行一次程序。為此,請按鍵盤上的 F5。由句點形成的三角形出現在外殼窗格中。
Thonny 的簡單程序
你知道 Python 想要分析你的代碼並打印三角形嗎?讓我們檢查!
[表示]從菜單[変数]從選擇開始。這將打開一個表格,顯示 Python 如何管理程序中的變量。現在按 Ctrl + F5(或 XFCE 上的 Ctrl + Shift + F5)以調試模式運行程序。在這種模式下,Thonny 告訴 Python 在執行每一步之前暫停。顯示盒裝程序的第一行。這稱為焦點,代表 Python 下一步將執行的代碼部分。
Thonny 調試器焦點
出現在焦點框中的代碼稱為賦值語句。對於這樣的語句,Python 必須計算右側的表達式並使用左側顯示的名稱存儲值。按 F7 進行下一步。 您可以看到 Python 專注於語句的正確部分。在這種情況下,表達式非常簡單,但總的來說,Thonny 提供了一個表達式評估框,允許您將表達式轉換為一個值。再次按 F7 將文字 1 轉換為值 1。現在 Python 已準備好進行實際分配。再次按 F7 可在變量表中顯示值為 1 的變量 n。
帶變量表的 Thonny
繼續並按 F7 以查看 Python 如何以非常小的步驟向前發展。它看起來像是理解代碼用途的東西,還是看起來像遵循簡單規則的愚蠢機器?
函數調用
函數調用是一個編程概念,經常給初學者帶來很大的困惑。從表面上看,沒有什麼複雜的。為您的代碼命名,然後在代碼的其他地方引用(調用)它。在傳統的調試器中,當您進入調用時,焦點會跳轉到函數定義(然後神奇地返回到其原始位置)。這是整個故事嗎?你需要關心嗎?
事實證明,“跳躍模型”僅適用於最簡單的功能。理解參數傳遞、局部變量、返回值和遞歸都受益於堆棧幀的概念。幸運的是,Thonny 可以直觀地解釋這個概念,而不會掩蓋掩蓋下的重要細節。
將以下遞歸程序複製到 Thonny 並在調試模式下運行它(Ctrl + F5 或 Ctrl + Shift + F5)。
def factorial(n): if n == 0: return 1 else: return factorial(n-1) * n print(factorial(4))
反复按 F7 直到表達式 factorial (4) 出現在焦點框中。如果繼續下一步,Thonny 將打開一個新窗口,其中包含功能代碼、另一個變量表和另一個焦點框(移動窗口以確保舊的焦點框仍然存在)。..
Thonny 單步執行遞歸函數
此窗口表示堆棧幀,它是解析函數調用的工作區。一些相互重疊的窗口稱為調用堆棧。注意調用站點的參數 4 和局部變量表中的條目 n 之間的關係。繼續使用 F7 觀察每次調用如何創建一個新窗口並在函數代碼完成時銷毀,以及調用站點如何替換為返回值。
價值觀和參考
現在讓我們用 Python shell 進行實驗。首先輸入下面屏幕截圖中顯示的語句。
Tony Shell Showlist 突變
如您所見,它添加到列表 b,但它也更新列表 a。您可能知道為什麼會發生這種情況,但是向初學者解釋它的最佳方式是什麼?
當我教學生一個列表時,我告訴他們我在 Python 內存模型上撒謊。實際上,它並不像變量表顯示的那麼簡單。重新啟動解釋器(工具欄上的紅色按鈕)和[表示]從菜單[ヒープ]我被指示再次做同樣的實驗。如果這樣做,您將看到變量表不再包含值——它們實際上駐留在另一個稱為“堆”的表中。變量表所做的實際上是將變量名映射到引用堆表中一行的地址(或 ID)。語句 b = a 只複製對列表的引用,而不是列表本身,因為賦值只修改了變量表。這就解釋了為什麼這兩個變量會發生變化。
堆模式下的Thonny
(為什麼要把內存模型的真相推遲到列表的話題上?Python存儲列表與浮點數和字符串有區別嗎?繼續使用Thonny的堆模型找出來!請以評論的想法告訴我!)
如果您想深入研究參考系統,請將以下程序複製到 Thonny 並在堆表打開的情況下執行步驟 (F7)。
def do_something(lst, x): lst.append(x) a = [1,2,3] n = 4 do_something(a, n) print(a)
“堆模式”顯示實際圖像,但使用起來很不方便。為此,建議在此處返回正常模式([表示]菜單的[ヒープ]取消選擇),但請記住,實際模型包含變量、引用和值。
結論是
本文中提到的特性是創建 Thonny 的主要原因。很容易誤解函數調用和引用,但傳統的調試器並不能真正幫助減少混淆。
除了這些顯著的功能,Thonny 還提供了其他幾個初學者工具。環視四周 托尼的主頁 請多多理解!