編譯自: https://fedoramagazine.org/learn-code-thonny-python-ide-beginners/
譯者: Auk7F7
學習編程很難。即使當你最終怎麼正確使用你的冒號和括號,但仍然有很大的可能你的程序不會如你所想的工作。 通常,這意味著你忽略了某些東西或者誤解了語言結構,你需要在代碼中找到你的期望與現實存在分歧的地方。
程序員通常使用被叫做 調試器(debugger)的工具來處理這種情況,它允許一步一步地運行他們的程序。不幸的是,大多數調試器都針對專業用途進行了優化,並假設用戶已經很好地瞭解了語言結構的語義(例如:函數調用)。
Thonny 是一個適合初學者的 Python IDE,由愛沙尼亞的 Tartu 大學 開發,它採用了不同的方法,因為它的調試器是專為學習和教學編程而設計的。
雖然 Thonny 適用於像小白一樣的初學者,但這篇文章面向那些至少具有 Python 或其他命令式語言經驗的讀者。
開始
從第 Fedora 27 開始,Thonny 就被包含在 Fedora 軟件庫中。 使用 sudo dnf install thonny 或者你選擇的圖形工具(比如“ 軟件(Software)”)安裝它。
n = 1
while n < 5:
print(n * "*")
n = n + 1
我們首先運行該程序。 為此請按鍵盤上的 F5 鍵。 你應該看到一個由星號組成的三角形出現在 shell 窗格中。
一個簡單的 Thonny 程序
Python 分析了你的代碼並理解了你想打印一個三角形了嗎?讓我們看看!
首先從“ 查看(View)”菜單中選擇“ 變量(Variables)”。這將打開一張表格,向我們展示 Python 是如何管理程序的變量的。現在通過按 Ctrl + F5(在 XFCE 中是 Ctrl + Shift + F5)以調試模式運行程序。在這種模式下,Thonny 使 Python 在每一步所需的步驟之前暫停。你應該看到程序的第一行被一個框包圍。我們將這稱為焦點,它表明 Python 將接下來要執行的部分代碼。
Thonny 調試器焦點
Thonny 變量表
繼續按 F7 並觀察 Python 如何以非常小的步驟前進。它看起來像是理解你的代碼的目的或者更像是一個愚蠢的遵循簡單規則的機器?
函數調用
函數調用(Function Call)是一種編程概念,它常常給初學者帶來很大的困惑。從表面上看,沒有什麼複雜的事情——給代碼命名,然後在代碼中的其他地方引用它(調用它)。傳統的調試器告訴我們,當你進入調用時,焦點跳轉到函數定義中(然後稍後神奇地返回到原來的位置)。這是整件事嗎?這需要我們關心嗎?
結果證明,“跳轉模型” 只對最簡單的函數是足夠的。理解參數傳遞、局部變量、返回和遞歸都得理解堆棧框架的概念。幸運的是,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
此窗口表示堆棧幀,即用於解析函數調用的工作區。幾個放在彼此頂部的這樣的窗口稱為 調用堆棧(call stack)。注意調用位置的參數 4 與 “局部變量” 表中的輸入 n 之間的關係。繼續按 F7 步進, 觀察在每次調用時如何創建新窗口並在函數代碼完成時被銷燬,以及如何用返回值替換了調用位置。
值與參考
現在,讓我們在 Python shell 中進行一個實驗。首先輸入下面屏幕截圖中顯示的語句:
Thonny shell 顯示列表突變
正如你所看到的, 我們追加到列表 b, 但列表 a 也得到了更新。你可能知道為什麼會發生這種情況, 但是對初學者來說,什麼才是最好的解釋呢?
當教我的學生列表時,我告訴他們我一直欺騙了他們關於 Python 內存模型。實際上,它並不像變量表所顯示的那樣簡單。我告訴他們重新啟動解釋器(工具欄上的紅色按鈕),從“ 查看(View)”菜單中選擇“ 堆(Heap)”,然後再次進行相同的實驗。如果這樣做,你就會發現變量表不再包含值——它們實際上位於另一個名為“ 堆(Heap)”的表中。變量表的作用實際上是將變量名映射到地址(或稱 ID),地址又指向了 堆(Heap)表中的行。由於賦值僅更改變量表,因此語句 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)
即使“堆模式”向我們顯示真實的圖片,但它使用起來也相當不方便。 因此,我建議你現在切換回普通模式(取消選擇“ 查看(View)”菜單中的“ 堆(Heap)”),但請記住,真實模型包含變量、參考和值。
結語
我在這篇文章中提及到的特性是創建 Thonny 的主要原因。很容易對函數調用和引用形成錯誤的理解,但傳統的調試器並不能真正幫助減少混淆。
via: https://fedoramagazine.org/learn-code-thonny-python-ide-beginners/