王麗麗
上期文章提到阿派破解了羊皮卷的咒語。當(dāng)他(她)大聲朗讀出咒語時(shí),只見一道金光閃現(xiàn),現(xiàn)出一副金色卡牌。阿派取出第一張卡牌,上面畫了一朵玫瑰。他(她)隨手一揚(yáng),卡牌就化作了一朵紅玫瑰。
:在這一課中,學(xué)生將了解自定義函數(shù)的作用和創(chuàng)建方法,并利用自定義函數(shù)實(shí)現(xiàn)從一朵到一簇玫瑰花的繪制。學(xué)生還將了解到類的特點(diǎn),使用類和對(duì)象描述玫瑰的特征。
在之前的《神秘的圖騰》一文中,我們已經(jīng)了解了Python中海龜畫圖的基本使用方法。如圖1的方法一,利用turtle繪制一朵紅玫瑰。其中的for語句,我們?cè)凇哆^招守護(hù)使》一文中接觸過,在這里利用for i in range(20)語句,實(shí)現(xiàn)繪制20瓣花瓣的效果。另外,circle的語法為turtle.circle(radius, extent=None, steps=None)。參數(shù)radius表示半徑,為正數(shù)時(shí)逆時(shí)針畫圖,負(fù)數(shù)時(shí)順時(shí)針。extent表示圓的弧度,如果缺省則表示畫完整的圓。參數(shù)steps用于設(shè)定邊數(shù),如果steps為6,則表示畫六邊形,缺省為畫圓。圖1中的t.circle(i,80)表示逆時(shí)針繪制半徑為i、弧度為80的圓弧,這樣就繪制了玫瑰葉子的一條邊緣線。
Python定義函數(shù)使用def關(guān)鍵字,def是define的縮寫,表示“定義”的意思,一般格式如下:
def函數(shù)名(參數(shù)列表):函數(shù)體
函數(shù)名最好能見名知意,體現(xiàn)函數(shù)的功能,以字母、數(shù)字以及下畫線組成,不能以數(shù)字開始。如圖1的方法二,利用def Rose()自定義一個(gè)名為Rose的函數(shù),函數(shù)體即左側(cè)的一大塊代碼塊,注意函數(shù)體要比def縮進(jìn)四個(gè)空格,因?yàn)镻ython使用縮進(jìn)表示結(jié)構(gòu)層次。調(diào)用自定義函數(shù)和調(diào)用內(nèi)建函數(shù)一樣,只需要函數(shù)名和參數(shù)即可。如圖1中的Rose()表示調(diào)用一次函數(shù),繪制一朵玫瑰。如果需要反復(fù)多次繪制玫瑰,那我們可以多次調(diào)用自定義函數(shù)來完成快速繪制。
:Python提供了許多內(nèi)建函數(shù)實(shí)現(xiàn)指定功能,如print()用于屏幕打印。我們也可以自己創(chuàng)建函數(shù),實(shí)現(xiàn)特定的功能。在函數(shù)體內(nèi)的變量,其作用域只限該函數(shù)內(nèi),在函數(shù)執(zhí)行結(jié)束后就不能再用了。函數(shù)是重復(fù)利用代碼、提高效率的一種方式。
如果需要繪制50朵玫瑰花,那上文的重復(fù)調(diào)用函數(shù)的方法,顯然還是不方便。我們可以利用for語句來實(shí)現(xiàn)函數(shù)的多次調(diào)用。如上頁圖2,一條for語句繪制50朵玫瑰花,且出現(xiàn)在畫布的隨機(jī)位置。
:結(jié)合函數(shù)和for語句,可以很方便地重復(fù)利用代碼。本例中,除了設(shè)置玫瑰的隨機(jī)位置,還可以試一試隨機(jī)大小、隨機(jī)顏色等,讓運(yùn)行效果更好。
玫瑰有很多品種,植株生長(zhǎng)的高度也各不相同。如圖3,將所有的玫瑰定義為rose這一類。不同的玫瑰具有各自的特征,如品名(name)和植株高度(height),這就是類的屬性。玫瑰還可以有不同的狀態(tài),如植株正在生長(zhǎng)(grow),這就是類的方法。
依據(jù)花朵大小來分類,玫瑰一般可分為:蔓性種、迷你種、中輪種和大輪種。我們可以在玫瑰(rose)這一父類下創(chuàng)建四個(gè)子類。其中的“大輪種(Hybrid)”這一子類的玫瑰,又有著不同的花朵顏色(color)屬性,而且花朵可能處在不同的狀態(tài),如正在綻放(bloom)。
:類是具有相似屬性和方法的對(duì)象的集合。一個(gè)對(duì)象就是某個(gè)類的實(shí)例。每個(gè)對(duì)象的屬性值,根據(jù)對(duì)象的不同而不同,如不同品種的玫瑰花的顏色可能不同。通過類的創(chuàng)建,將事物分類,在編程時(shí),更符合人的認(rèn)知習(xí)慣,且結(jié)構(gòu)清晰,易于維護(hù)。
接下來,在Python中代碼實(shí)現(xiàn)。首先,所有的玫瑰可以定義為一個(gè)類。如圖4,利用class關(guān)鍵字來定義類,后面跟上類名rose。然后,定義基本屬性,即品名(name)和植株高度(height)。再定義一個(gè)名為__init__( )的特殊方法,在類的實(shí)例化操作時(shí)會(huì)自動(dòng)調(diào)用該方法。接著,將玫瑰的生長(zhǎng)狀態(tài)定義為grow方法。這里,我們用簡(jiǎn)單的print函數(shù)輸出玫瑰的當(dāng)前狀態(tài)。如果有需要,還可以嘗試其他效果。
:與定義一般的函數(shù)不同,定義類方法必須包含參數(shù)self,而且self為第一個(gè)參數(shù),代表類的實(shí)例。self參數(shù)可以從類中的一個(gè)函數(shù)調(diào)用類中或者父類中的另外一個(gè)函數(shù)。此外,Python支持參數(shù)的格式化輸出。如圖4,%s是字符串對(duì)應(yīng)的格式通配符,%d是數(shù)值整型對(duì)應(yīng)的格式通配符。
依據(jù)圖3的分類,繼續(xù)創(chuàng)建子類hybrid(大輪種)。當(dāng)然,大輪種和其他三類都屬于rose類,因此均繼承了父類rose的特征。同時(shí),它又具備自己的特征,如顏色屬性(如圖5)。
:現(xiàn)在,我們已經(jīng)創(chuàng)建了兩個(gè)類。注意在定義子類hybrid時(shí),需要在類的參數(shù)(括號(hào)中)注明父類rose的名稱,表明隸屬關(guān)系。這樣,子類可以繼承父類的特征。
將hybrid類“實(shí)例化”后,就得到了一個(gè)對(duì)象。如圖6,flower1屬于hybrid類的一朵玫瑰,品名是“卡羅拉”,植株高度為90厘米,顏色為紅色。同一個(gè)類,還可以創(chuàng)建多個(gè)對(duì)象,如通過實(shí)例化產(chǎn)生其他玫瑰,有不同的顏色和高度等特征。
最后,運(yùn)行程序,效果如圖7。
之后的卡牌牌面都是空白,你可以利用類和函數(shù)來設(shè)計(jì)新卡牌,快速建造其他物品,創(chuàng)造一個(gè)新的文明世界。