python绘制如下图形、小三角形边长20_在编程中发现数学之美——使用Python小龟绘制多边形...
在使用數學知識畫出很酷的各種圖形之前,你需要先學習Python編程語言的基礎知識。本文將會帶你熟悉以下編程概念:循環、變量、函數、使用小龜模塊繪制圖像。本文假設你已經安裝了Python,如果沒有,歡迎你訪問我的在線編程學習網站www.icoding.pub,你可以在編程入門—使用python語言開發游戲課程中下載Python并學習安裝過程和Python基礎操作。本文是在Python編程中發現數學之美的第一章內容,其余內容會陸續發布在www.icoding.pub,歡迎關注。
小龜模塊
Python的小龜模塊來源于Logo語言。Logo語言發明于1960年代,目的是使所有人都能夠學習編程。Logo語言有可供人機交互的圖形界面。Python的設計者對Logo語言的小龜模塊如此喜歡,以至于他們也在Python中設計了小龜模塊。
在Python的小龜模塊中,你可以控制類似小龜的圖像,像在游戲中控制一個角色。你需要給小龜清晰明確的指令,指導小龜在屏幕上的動作。因為小龜的運動會留下軌跡,我們可以通過控制小龜運動畫出各種圖形。
導入小龜模塊
打開IDLE,新建文件,保存為myturtle.py。使用小龜模塊,你需要首先引入它的函數。在Python中,函數是指完成某一功能的可重復使用的一段代碼。Python中有許多內置函數,當然你也可以創建自己的函數,我們稱之為自定義函數。本章中你就將寫自己的自定義函數。
模塊在Python中指一個文件,這個文件中含有預定義的函數和定義,這些函數和定義你可以在其他程序中使用。小龜模塊在你安裝Python的時候已經自動安裝了。
Python中引入模塊的方法有許多,我們使用簡單的一種,在myturtle.py中,輸入以下語句:from turtle import *
from表示我們將從外部的文件中導入某些內容。我們在from后輸入要導入的模塊,這里是turtle。我們用import獲取欲導入的內容,這里的通配符*表示我們將turtle的內容全部引入到當前的程序。
移動小龜
現在你已經引入了小龜模塊,你可以輸入指令輸入指令移動小龜了。我們將使用foreward()函數(縮寫為fd)來命令小龜移動一段距離并在后面留下軌跡。注意,forward()是我們從turtle小龜模塊中引入函數中的其中一個。使小龜移動:foreward(100)
這里,括號中的100表示小龜移動的步數。在編程語言中,100是傳遞給foreward函數的參數。當然,你也可以將100改成其它任何值。保存,運行程序,一個新窗口會打開,窗口中心有一個箭頭。
正如你所見,小龜起點為窗口正中,向右移動了100步(100個像素)。注意,默認的形狀是一個箭頭,不是烏龜。輸入以下指令變為烏龜的形狀:from turtle import *
forward(100)
shape('turtle')
或許你已經猜到了,shape()是小龜模塊中定義的另一個函數。這個函數讓你可以定義默認的箭頭為其他形狀,如圓、方塊。這里,shape()函數的參數是字符串'turtle',不是數字。保存并運行,你會看到箭頭的形狀已經變成了小龜。
改變方向
小龜只能在它的方向上向前走。改變方向,你首先必須使用right()或left()函數讓小龜轉一定的角度。修改程序如下:from turtle import *
forward(100)
shape('turtle')
right(45)
forward(150)
你會發現,小龜從窗口中心開始,向前走100步,右轉45度,然后向前走了150步。練習1-1:修改代碼,使小龜的軌跡畫一個正方形。
循環執行代碼
每一種編程語言都有自動重復執行一定次數的方法。這個功能很重要,因為重復執行避免了你一遍又一遍輸入相同內容代碼的麻煩。它還可以幫你避免輸入錯誤,從而保證程序正常運行。
for循環
Python語言中使用for執行循環代碼。我們用range指明循環次數。打開IDLE,新建文件for_loop.py,輸入:for i in range(2):
print('hello')
這里,range()函數為每一個循環i創建了一個迭代器。迭代器每次使用會依順序產生新值。括號中的2是傳遞給range()函數的參數,與前面傳遞給forward()和right()參數類似。
這個例子中,range(2)創建了一個包括兩個值:0和1的序列。對兩個值中的每一個,for分別執行冒號之后的代碼,在這兒是執行打印hello。
記住,在所有需要循環執行的代碼(冒號之后的)前按TAB鍵(或4個空格),以使這些代碼有相同的縮進。縮進告訴Python哪些代碼行在循環內容需要for循環執行。別忘了for語句最后的冒號,它告訴Python下面的代碼是需要循環執行的。保存、運行以上代碼,你會看到輸出兩行hello。
打印兩行hello是因為range(2)創建了包含兩個數字0和1的序列。這表示for指令逐個訪問序列中的0和1,每次訪問打印hello。我們可以對代碼做如下修改:for i in range(10):
print(i)
保存并運行,結果是打印了從0到9的10個數字。
你注意到了嗎?range()函數的序列是從0開始,到參數的前一個數字結束(這里是9)。上面的代碼的作用可簡述為“對從0到9范圍中的每一個值,打印當前的數字。”for循環重復執行代碼,直到超出數字范圍。下面我們在小龜程序中使用for循環。
使用for循環畫正方形
上面的練習1-1中,你面臨的挑戰是使用forward()和right()畫正方形。完成這個任務,你不得不重復forward(100)和right(90)四次。這不但需要輸入許多代碼,而且輸入過程中還往往出錯。
現在我們有了for循環,就可以省去重復輸入相同代碼的麻煩了。下面的myturtle.py程序,使用for代替了重復的forward()和right()語句:from turtle import *
shape('turtle')
for i in range(4):
forward(100)
right(90)
注意,shape('turtle')語句應該在import語句后面其他繪畫代碼的前面。for循環內部的兩行代碼告訴小龜,向前100步然后右轉90度(想想對小龜來說哪邊是左哪邊是右)。由于正方形有四條邊,我們使用range(4)讓代碼循環四次,運行代碼的結果會如下面的圖片:
1_squares.gif
小龜向前100步然后右轉,重復了四次,最終回到原來出發的點。恭喜你,你使用for循環畫出了正方形。
創建自定義函數
我們寫了畫正方形的代碼,我們可以使用個小魔術將代碼保存起來,以后需要畫正方形的時候隨時調用。每種變成語言都有實現這個功能的方法,在Python里它被成為函數,函數在編程中非常重要。函數使代碼精巧并易于維護修改,將復雜問題化解為若干函數的過程中,也有助于你找到解決問題的最佳方法。在前面的代碼中你已經使用過Python語言內置的函數,現在我們將學習怎么創建我們自己的函數。
定義函數你需要為它取個名字,可以取任何名字,記住不要與Python語言的關鍵字相同,如list,range,等等。為函數命名的時候,最后取個有意義的名字,這樣你調用的時候能夠方便的想起來。這里我們為我們畫正方向的函數命名為square(),因為我們這個函數的作用是畫正方形,修改剛才的程序mytutle.py,增加下面內容:def square():
for i in range(4):
forward(100)
right(90)
def關鍵字告訴Python我們正定義一個函數,后面的將會是函數名字,這兒是square()。別忘了square后面的兩個括號!Python中它們的出現表示現在要處理的是函數。后面我們將在括號中放數值,但即使沒有任何數值,括號也必須要有以讓Python知道這是個函數。另外,不要忘記函數定義語句末尾的冒號。注意,函數內容部分的代碼都有向右4個空格的縮進,這是告訴Python哪些代碼是函數內部的語句。
如果現在運行,什么也不會出現。你定義了函數,但還沒有運行它。要運行函數你需要調用它,對代碼繼續修改,修改后的代碼如下:from turtle import *
shape('turtle')
def square():
for i in range(4):
forward(100)
right(90)
square()
保存,運行。程序的最后一行,通過square()調用了函數。現在你可以在程序任何位置調用square()函數來方便地繪制四方形了。
你還可以將這個函數放在循環中,來繪出更復雜的圖形。例如,畫一個正方形,右轉一定角度,畫另一個正方形,繼續右轉...這樣循環若干次。
下面的練習將繪制一個由正方形組成的有趣的圖形。要畫出這個圖形,需要你的小龜忙活一會兒,所以你可以通過調用speed()函數控制小龜的速度。在shape('turtule')語句后面插入一行speed(0),使小龜移動的速度達到最快(speed(1)使小龜速度最慢)。當然你可以調整speed()的參數。練習1-2:正方形組成的圓。寫程序,這個程序將畫60個正方形,每畫一個正方形后右轉5度。程序中要使用循環語句。運行結果如圖:
circle of squares
使用變量繪制圖形
現在為止我們的正方形大小都相同。想要不同大小的正方形,要改變小龜前進的距離。要通過每次修改函數獲得不同的距離,那太麻煩了。我們用變量來解決這個問題,變量在Python中表示可以改變的值。變量與數學函數表達式中的x相似。
數學中的變量名字是一個字母,編程中你可以給變量取任何名字。類似與函數,我建議你的變量名稱應該是有意義的,便于記憶和理解。
函數中使用變量
定義函數的時候,可以將變量作為傳遞給函數的參數。例如,可以修改square()的定義,來畫不同尺寸的正方形,對myturtle.py修改如下:def square(sidelength):
for i in range(4):
forward(sidelength)
right(90)
這里我們在函數定義中增加了sidelength。現在你調用這個函數的時候,要在括號間傳遞一個值給函數,這個值我們稱之為參數。傳遞的任何值都將作為sidelength的數值。例如,調用square(50)和square(80)將分別繪制邊長為50和80的正方形。
變量錯誤
調用函數的時候,如果函數定義中有參數,而調用時未指明參數,Python會報錯。如調用上面的函數square(),IDLE中會出現以下錯誤提示:TypeError: square() missing 1 required positional argument: 'sidelength'
這個錯誤提示我們缺少了一個需要的參數(這兒是sidelength)。怎樣避免出現這種錯誤呢?我們可以在定義函數時給參數賦一個默認值,例如這樣:def square(sidelength=100):
這里,我們給sidelength賦值100。現在我們調用square時如果填寫了參數,會繪制邊長為我們填寫數值的正方形,如果我們沒有填寫,也不會報錯,會繪制邊長為100的正方形。我們可以這樣調用函數:square(30)
square(50)
squre()
運行結果會是這樣:
1_func_params.gif
給函數參數設置缺省值,我們可以不同擔心調用時忘記填寫參數了。在編程中,我們稱之為讓程序變得健壯。練習1-3:繪制三角形。寫triangle()函數,函數功能為繪制給定變長的三角形。
等邊三角形
多邊形是有多個邊的圖形。等邊三角形是多邊形的一種,有三條邊且變長相等。
triangle
等邊三角形有3個都為60度的內角,你的數學老師肯定告訴過你,三角形內角和為180度。
寫繪制三角形的函數
現在,讓我們用目前學到的知識畫出一個等邊三角形。因為每個內角都是60度,我們可以將right()參數修改為60度,像下面這樣修改myturtle.py:def triangle(sidelength=100):
for i in range(3):
forward(sidelength)
right(60)
triangle()
保存,運行。你看到了什么?
triangle
我們沒看到三角形,看起來畫的好像是六邊形的一半。想想為什么?如果你是圖上的小龜,站在它的位置,向右轉60度,循環3次……是不是也會走出上圖的路徑。你應該想到了,向右轉,不應該轉60度,而應該轉180-60=120度。練習1-4:寫繪制多邊形的函數。函數名字為polygon,參數為一個整數,函數功能是繪制多邊形,邊的條數為參數值。
改變變量的值
我們可以這樣改變變量的值:在每一個循環中讓變量的值遞增,結果是每次循環所畫的正方形比上一次大一些。例如我們使用length變量,我們用這個變量的值作為變長畫正方形,下一個循環中為length增加5:length = length + 5
這是一個賦值語句,length變量被賦予length原來的值加上5。打開IDLE,輸入以下語句:>>> radius = 10
上面我們創建了一個變量,其名字是radius,其值為10。任何時候你都可以重新給這個變量賦一個新值:>>> radius = 20
現在,變量radius中的值為20了。練習1-5:創建一個函數,函數的功能為畫60個正方形,每畫一個正方形后旋轉5度,且邊長增加。初始邊長為5,每次增加5。結果應該如圖所示:
總結
本文我們學習了使用Python的小龜模塊turtle和它的內置函數forward()及right()。我們探索了使用這個兩個函數繪制復雜有趣的圖形。turtle是Python其中一個包,你可以訪問Python的官方網站https://python.org/,上面有turtle更全面的介紹。
本文我們還學校了如何定義自己的函數,自定義函數可以讓我們實現代碼復用。我們還學習了for循環。練習1-6:星星的誕生。首先你要寫一個名為star的函數,函數功能是繪制一個五角星,如圖:
star
,接下來,你需要寫另一個starSpiral()函數,函數的作用是繪制旋轉的五角星,結果如下圖:
stars spiral
總結
以上是生活随笔為你收集整理的python绘制如下图形、小三角形边长20_在编程中发现数学之美——使用Python小龟绘制多边形...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python pywinauto 单击鼠
- 下一篇: python数据分析方法五种_加速Pyt