使用 Thonny 學習編碼 — 適合初學者的 Python IDE


學習編程很難。即使正確使用了冒號和括號,您的程序也很可能無法按預期工作。通常這意味著您忽略了某些東西或誤解了語言結構,您需要在代碼中找到期望與現實之間的差異。

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

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

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 中進行實驗。首先輸入下面屏幕截圖中顯示的語句。

更改 Thony shell 顯示列表

更改 Thony shell 顯示列表

如您所見,它附加到列表 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 還為初學者提供了一些其他工具。環視四周 托尼的主頁 學到更多!