學慣用 Thonny 寫代碼: 一個面向初學者的Python IDE
來自專欄 Linux16 人贊了文章
學習編程很難。即使當你最終怎麼正確使用你的冒號和括弧,但仍然有很大的可能你的程序不會如你所想的工作。 通常,這意味著你忽略了某些東西或者誤解了語言結構,你需要在代碼中找到你的期望與現實存在分歧的地方。
程序員通常使用被叫做 調試器(debugger)的工具來處理這種情況,它允許一步一步地運行他們的程序。不幸的是,大多數調試器都針對專業用途進行了優化,並假設用戶已經很好地了解了語言結構的語義(例如:函數調用)。
Thonny 是一個適合初學者的 Python IDE,由愛沙尼亞的 Tartu 大學 開發,它採用了不同的方法,因為它的調試器是專為學習和教學編程而設計的。
雖然 Thonny 適用於像小白一樣的初學者,但這篇文章面向那些至少具有 Python 或其他命令式語言經驗的讀者。
開始
從第 Fedora 27 開始,Thonny 就被包含在 Fedora 軟體庫中。 使用 sudo dnf install thonny
或者你選擇的圖形工具(比如「 軟體(Software)」)安裝它。
當第一次啟動 Thonny 時,它會做一些準備工作,然後呈現一個空白的編輯器和 Python shell 。將下列程序文本複製到編輯器中,並將其保存到文件中(Ctrl+S
)。
n = 1while n < 5: print(n * "*") n = n + 1
我們首先運行該程序。 為此請按鍵盤上的 F5
鍵。 你應該看到一個由星號組成的三角形出現在 shell 窗格中。
一個簡單的 Thonny 程序
Python 分析了你的代碼並理解了你想列印一個三角形了嗎?讓我們看看!
首先從「 查看(View)」菜單中選擇「 變數(Variables)」。這將打開一張表格,向我們展示 Python 是如何管理程序的變數的。現在通過按 Ctrl + F5
(在 XFCE 中是 Ctrl + Shift + F5
)以調試模式運行程序。在這種模式下,Thonny 使 Python 在每一步所需的步驟之前暫停。你應該看到程序的第一行被一個框包圍。我們將這稱為焦點,它表明 Python 將接下來要執行的部分代碼。
Thonny 調試器焦點
你在焦點框中看到的一段代碼段被稱為賦值語句。 對於這種聲明,Python 應該計算右邊的表達式,並將值存儲在左邊顯示的名稱下。按 F7
進行下一步。你將看到 Python 將重點放在語句的正確部分。在這個例子中,表達式實際上很簡單,但是為了通用性,Thonny 提供了表達式計算框,它允許將表達式轉換為值。再次按 F7
將文字 1
轉換為值 1
。現在 Python 已經準備好執行實際的賦值—再次按 F7
,你應該會看到變數 n
的值為 1
的變數出現在變數表中。
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) * nprint(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 = 4do_something(a, n)print(a)
即使「堆模式」向我們顯示真實的圖片,但它使用起來也相當不方便。 因此,我建議你現在切換回普通模式(取消選擇「 查看(View)」菜單中的「 堆(Heap)」),但請記住,真實模型包含變數、參考和值。
結語
我在這篇文章中提及到的特性是創建 Thonny 的主要原因。很容易對函數調用和引用形成錯誤的理解,但傳統的調試器並不能真正幫助減少混淆。
除了這些顯著的特性,Thonny 還提供了其他幾個初學者友好的工具。 請查看 Thonny的主頁 以了解更多信息!
via: https://fedoramagazine.org/learn-code-thonny-python-ide-beginners/
作者:Aivar Annamaa 譯者:Auk7F7 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出
推薦閱讀:
※(如何(用Python)寫一個(Lisp)解釋器(上))
※Python數據處理 II:數據的清洗(預處理)
※用Python剪輯年會音樂
※開源IP代理池續——整體重構