天天看點

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

本節書摘來自華章計算機《樹莓派python程式設計指南》一書中的第2章,第2.1節,作者:(美) alex bradbury ben everard更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

本章通過一些代碼示例來逐漸介紹python。你不必了解這些代碼的所有細節,本章隻是帶你領略下程式設計的感覺。你将會學到如何在螢幕上繪畫,甚至如何編寫簡單的遊戲。同時,你将會學到一些程式設計的基本概念。如果無法完全了解本章中的程式,不用擔心,我們會在後面章節中做詳細介紹。

是時候開始程式設計了!我們強烈建議你将代碼一行行輸入idle3,這樣可以幫助你了解每行都做了什麼事情。言歸正傳,打開idle3,點選file→new window,然後輸入:

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

然後點選run→run module或者按f5鍵來運作程式。此時會跳出一個對話框讓你輸入檔案名。起什麼名字都可以,但起一個容易了解的名字可以幫助我們記住它(這裡我們使用chapter2-example1.py)。

檔案中每一行都是一個python指令。python一行行檢查它們,然後按照先後順序來執行。圖2-1顯示了計算機執行完所有步驟後的結果:在螢幕上畫出一條直線,直線上面連接配接一個圈。看起來像棒棒糖,實際上,這是一朵花的第一部分。如果你的螢幕沒有顯示出這個結果,請檢查下檔案的每一行是否正确,然後再試一次。

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

接下來我們仔細看下python是如何根據代碼來工作的。

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

在python程式的開頭部分,通常會有一些import行。它們為程式導入一些附加特性,就像其他軟體中的附件或者插件一樣。這些特性被分成不同的子產品。後面章節中将介紹更多的import指令。本例中我們僅導入turtle子產品以完成繪圖工作。

接下來的代碼:

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

建立了一個新視窗用于繪圖,并定義了一個動作,單擊視窗就可以将其關閉。

下面這行代碼使用了我們在第一行中導入的turtle子產品建立的一個名字叫babbage的turtle對象(charles babbage,計算機先驅,創造了計算機的概念)。

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

https://yqfile.alicdn.com/f72c19061d0abfa2b55a00e0ecf59ed6cac8ec38.png

" >

babbage有很多個方法可供我們使用。例如下面這行:

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

https://yqfile.alicdn.com/412d48be40e2bd23c083858387e2845921c9be04.png

使用了left()方法,使babbage向左轉一定角度。位于left()方法後面括号裡的參數可以控制該方法運作時的角度。本例中,輸入參數為90,是以babbage向左轉90°。下一行使用了forward()、right()和circle()方法。

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

https://yqfile.alicdn.com/d32198f5a9b449132d9eac1b38d97085d71248d0.png

第一個方法将turtle向前移動100個像素,第二個将其右轉90°,最後一個畫了一個半徑為10像素的圓。

現在開始添加花瓣。按下面例子編輯代碼(變化部分已經用黑體标出):

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

運作後會看見這朵花已經有了第一片花瓣。注意我們添加了一些帶#符号的行,計算機将忽略以#開始的行。是以我們可以用這種方法添加注釋(或者其他任何閱讀代碼的人)。它增加了程式的可讀性。當我們幾天、幾周甚至幾年後再來看這段代碼,有了注釋就可以很容易地了解它做了什麼。

2.1.1 使用循環

畫花瓣的部分很容易了解(我們使用三角函數來計算出兩個左轉之間的夾角,但不用擔心,我們不會陷入數學計算中)。

現在可以添加一段新代碼來畫第二片花瓣(總共要畫24片花瓣)。和畫第一片花瓣完全相同,是以隻要複制粘貼就可以得到下列代碼:

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

然後,重複22次畫出剩餘花瓣。好吧,夠了,根據程式設計的一般經驗法則,不能重複出現相同的代碼。假設你要改變花瓣尺寸,而且需要改48個地方(每片花瓣兩次),如果忘記任何一個地方,将會得到一個不靠譜的圖檔。是以,你可以使用循環,用一小段代碼告訴計算機反複執行特定部分的代碼。

你可以用下面代碼來替代從#畫第一片花瓣(#draw first petal)開始的所有代碼:

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

https://yqfile.alicdn.com/ae323d84dd40c3a7cc033ef9f8c8b2a361fcf158.png

我們将會在第3章中介紹注釋後面的第一行代碼。現在,隻需要了解它表示重複運作後面那段代碼24次之後,計算機将執行這塊代碼後的下一個指令。

python中循環(或者之後接觸的其他類型條件)的代碼段通常使用相同的格式。第一行以冒号結尾,之後的每一行都使用相同的縮進。當tab或者縮進結束時,python就認為該代碼段結束了。如果你之前使用過其他程式設計語言,将會發現python的做法和其他語言有所不同。

運作代碼後,你會發現babbage轉了一圈将所有花瓣都畫完了。我們得到了圖2-2所示的完整花朵。

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

僅用13行代碼,幹得不錯。當然,不是所有的花都是黑色的,在圖檔中添加點顔色會更好看點。turtle子產品提供了一些方法讓我們可以選擇畫線的顔色。下面對前面的代碼做了些修改(更改部分以黑體顯示)。

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

上述代碼中,我們使用了color(colour1, colour2)方法(英國人應該看得出來該方法的名字是美式寫法)。這裡colour1是畫筆色,colour2是填充色。畫完花朵中心後,我們告訴計算機用begin_fill()方法填充中心。然後,我們調用end_fill()方法,以防它填充所有的花瓣。

2.1.2 條件處理:if、elif和else

現在繼續向idle3輸入畫花朵程式的後半部分:

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

https://yqfile.alicdn.com/3c02168418f0cf5d8a4a85166c0d3cdd37a96a2d.png

我們使用點藝術眼光,決定用紅、橙、黃三種顔色來繪制這朵花的葉子。由于這是本黑白印刷的書,隻有在樹莓派上運作程式之後,才能看到彩色圖像。當然也可以通過本書網站上的flower.png來檢視結果。為了轉換花瓣色彩,我們使用了if ... elif ... else語句。它告訴python根據不同的資料做不同的事情。基本結構如下所示:

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

這裡的表示條件,可以為真或假。本例中,我們使用如下條件:

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

babbage.color()(注意該方法不帶任何參數)告訴應用程式我們目前使用的顔色。不同于我們之前遇到的方法,它反過來給我們輸出了一些資訊。它的傳回值是一對顔色——第一個是畫筆色,第二個是填充色(從畫完花朵中心之後,我們就沒有改變過這兩個顔色,是以程式的後繼部分仍然使用它們)。雙等于号(==)表示“相等”。使用雙等于号是因為等号已經被定義為“指派”,我們在建立window和turtle對象時已經使用過等号。

如果條件為真(本例中,如果turtle的顔色為(“red”, “black”)),python将執行if之後的代碼。如果條件為假,python将轉而執行elif(elif是else if的簡寫)。這裡的判斷條件和if一樣。

如果elif處的條件為假,python将轉到else處執行。到此為止(也就是說,if和elif處的判斷條件都為假),python将執行else之後的代碼。else處沒有判斷條件。圖2-3描述了上述邏輯流程。

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

https://yqfile.alicdn.com/c49a9a560b56ad524333fe03c4d856b36448e6dc.png" >

這些if語句能夠在畫完一個花瓣後改變畫筆顔色。我們在程式後面新加了下面這行:

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

它會隐藏turtle(滑鼠),以保證滑鼠不會遮擋我們的圖檔。至此,我們的第一個python程式圓滿完成。

2.1.3 使用函數和方法組織代碼

在開始第二個python程式之前,我們先停下來讨論下“方法”。從前面的代碼可以看出來,方法能夠有效地控制程式。在前面的例子中,我們使用它們來移動turtle,改變顔色或者建立窗體。每次都調用這些方法來完成某些事情。例如,通過babbage.forward(50)來調用babbage的forward(50)方法,通過window.exitonclick()來調用window的exitonclick()方法。每次調用這些方法,都會運作儲存在python子產品中的相應代碼。python還有個相似的特性——函數。函數和方法的工作方式有點類似,但是函數不需要import任何子產品。例如,在python解釋器中輸入:

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

這行代碼将運作print函數,将參數輸出到螢幕上。是否還記得我們前面提到的不要在程式中出現重複的代碼?當時我們說可以使用循環和函數來減少重複。例如,現在需要一個根據給定半徑計算圓周長的程式。如果聽過數學課都知道圓周長等于2×pi×r(如果沒有上過數學課也沒關系,隻需要跟着做就好了)。每次在計算時重寫代碼可能會使問題變得複雜(如果某個地方寫錯了圓周率(pi)的值,将會導緻一系列很難發現的問題)。是以我們建立一個函數來完成它。在python中是這樣做的:

《樹莓派Python程式設計指南》——第2章 Python簡介2.1 使用Turtles繪畫

這裡我們使用了兩個函數嵌套在一起。circlearea(1)計算半徑為1的圓周長,print()把計算結果輸出到螢幕上。

我們使用關鍵字def定義了一個自己的函數。def之後是函數名,接下來的小括号裡是參數。在程式中可以直接使用這些參數,參數值在函數調用時傳遞過去。關鍵字return告訴python我們的傳回值是什麼。是以,在前面的例子中,當python發現circlearea(1)時,将會把1作為參數radius的值傳入函數,然後執行def circlearea(radius)。接着,它傳回計算結果(6.28)給函數print。以後你将會看到,方法也可以像函數一樣,一個方法通過嵌套将資訊傳遞給另外一個方法。這是一種非常有用的方法,可以在程式的不同部分間傳遞資料流。