學習編程很難。即使正確使用了冒號和括號,您的程序也很可能無法按預期工作。通常這意味著您忽略了某些東西或誤解了語言結構,您需要在代碼中找到期望與現實之間的差異。
程序員通常使用稱為調試器的工具來解決這種情況,這些工具允許您逐步執行程序。不幸的是,大多數調試器都針對專業用途進行了優化,並假定您已經熟悉語言結構的語義,例如函數調用。
Thonny 是上面開發的一個對初學者友好的 Python IDE。 塔爾圖大學,愛沙尼亞調試器採用不同的方法,因為它是專門為學習和教學編程而設計的。
Thonny 適合初學者,但本文適用於至少對 Python 或其他命令式語言有一定經驗的讀者。
入門
Tony 從版本 27 開始包含在 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 中進行實驗。首先輸入下面屏幕截圖中顯示的語句。
更改 Thony shell 顯示列表
如您所見,它附加到列表 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 還為初學者提供了一些其他工具。環視四周 托尼的主頁 學到更多!