該程序很難學習。即使正確使用冒號和括號,您的程序也很可能無法按預期工作。這通常意味著您需要忽略某些內容或誤解語言結構,並在代碼中找到期望和現實不同的地方。

程序員通常使用稱為調試器的工具來解決這種情況。該工具允許您逐步運行程序。不幸的是,大多數調試器都針對專業用途進行了優化,我們假設用戶已經熟悉語言結構的語義,例如函數調用。

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 調試器焦點

Thonny 調試器焦點

出現在焦點框中的代碼稱為賦值語句。對於此類語句,Python 必須計算右側的表達式並將值存儲在左側出現的名稱中。按 F7 進行下一步。 您可以看到 Python 專注於語句的正確部分。在這種情況下,表達式非常簡單,但總的來說,Thonny 提供了一個表達式評估框,允許您將表達式轉換為一個值。再次按 F7 將文字 1 轉換為值 1。現在 Python 已準備好進行實際分配。再次按 F7 鍵,在變量表中顯示值為 1 的變量 n。

帶變量表的 Thonny

帶變量表的 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步驟

通過遞歸函數的Thonny步驟

此窗口表示堆棧幀,它是解析函數調用的工作區。一些相互重疊的窗口稱為調用堆棧。注意調用站點的參數 4 和局部變量表中的條目 n 之間的關係。繼續使用F7,看看函數代碼完成時如何為每次調用創建一個新窗口並銷毀,以及調用站點如何替換為返回值。

價值和參考

現在讓我們用 Python shell 進行實驗。首先鍵入下面屏幕截圖中顯示的語句。

Tony Shell Showlist 突變

Tony Shell Showlist 突變

如您所見,它添加到列表 b,但它也更新列表 a。您可能知道為什麼會發生這種情況,但是向初學者解釋它的最佳方式是什麼?

當我教學生一個列表時,我告訴他們我在 Python 內存模型上撒謊。實際上,它並不像變量表所暗示的那麼簡單。重新啟動解釋器(工具欄上的紅色按鈕),[表示]從菜單[ヒープ]被指示再次運行相同的實驗。如果這樣做,您將看到變量表不再包含值。該值實際上駐留在另一個稱為“堆”的表中。變量表所做的實際上是將變量名映射到引用堆表中行的地址(或 ID)。由於賦值只修改變量表,語句 b = a 只複製對列表的引用,而不是列表本身。這就解釋了為什麼這兩個變量會發生變化。

堆模式下的Thonny

堆模式下的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 還提供了其他幾個初學者工具。環視四周 托尼的主頁 請多多理解!