Python電子教案5-2 函數(shù)和代碼復(fù)用PPT精品文檔_第1頁
Python電子教案5-2 函數(shù)和代碼復(fù)用PPT精品文檔_第2頁
Python電子教案5-2 函數(shù)和代碼復(fù)用PPT精品文檔_第3頁
Python電子教案5-2 函數(shù)和代碼復(fù)用PPT精品文檔_第4頁
Python電子教案5-2 函數(shù)和代碼復(fù)用PPT精品文檔_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、1七段數(shù)碼管繪制 數(shù)碼管是一種價格便宜、使用簡單的發(fā)光電子器件,廣泛應(yīng)用在價格較低的電子類產(chǎn)品中,其中,七段數(shù)碼管最為常用。七段數(shù)碼管(seven-segment indicator)由7段數(shù)碼管拼接而成,每段有亮或不亮兩種情況,改進(jìn)型的七段數(shù)碼管還包括一個小數(shù)點位置,如圖5.4所示。七段數(shù)碼管繪制七段數(shù)碼管繪制 七段數(shù)碼管能形成27=128種不同狀態(tài),其中部分狀態(tài)能夠顯示易于人們理解的數(shù)字或字母含義,因此被廣泛使用。圖5.5給出了十六進(jìn)制中16個字符的七段數(shù)碼管表示。七段數(shù)碼管繪制 本節(jié)將延續(xù)實例2和第2.4節(jié)內(nèi)容,通過部分turtle庫函數(shù)繪制七段數(shù)碼管形式的日期信息。該問題的IPO描述如

2、下:輸入:當(dāng)前日期的數(shù)字形式處理:根據(jù)每個數(shù)字繪制七段數(shù)碼管表示輸出:繪制當(dāng)前日期的七段數(shù)碼管表示七段數(shù)碼管繪制 每個0到9的數(shù)字都有相同的七段數(shù)碼管樣式,因此,可以通過設(shè)計函數(shù)復(fù)用數(shù)字的繪制過程。進(jìn)一步,每個七段數(shù)碼管包括7個數(shù)碼管樣式,除了數(shù)碼管位置不同外,繪制風(fēng)格一致,也可以通過函數(shù)復(fù)用單個數(shù)碼段的繪制過程。這里,先給出程序的全部代碼,實例代碼7.1如下七段數(shù)碼管繪制 實例代碼7.1定義了drawDigit()函數(shù),該函數(shù)根據(jù)輸入的數(shù)字d繪制七段數(shù)碼管,結(jié)合七段數(shù)碼管結(jié)構(gòu),每個數(shù)碼管的繪制采用圖5.6所示順序。七段數(shù)碼管繪制 繪制起點在數(shù)碼管中部左側(cè),無論每段數(shù)碼管是否被繪制出來,tur

3、tle畫筆都按順序“畫完”所有7個數(shù)碼管。對于給定數(shù)字d,哪個數(shù)碼段被繪制出來采用ifelse語句判斷。drawLine(True) if d in 2,3,4,5,6,8,9 else drawLine(False)drawLine(True) if d in 2,3,4,5,6,8,9 else drawLine(False)七段數(shù)碼管繪制 以第8行為例,代碼采用了單行ifelse語句,這種語句常用于if和else分別只有一行語句的情形。第8行代碼含義采用普通ifelse語句表達(dá)如下,可見,單行語句的實現(xiàn)方式能夠使表達(dá)更加緊湊。if d in 2,3,4,5,6,8,9:if d in 2

4、,3,4,5,6,8,9: drawLine(True) drawLine(True) else:else: drawLine(False) drawLine(False)七段數(shù)碼管繪制 第8行代碼根據(jù)輸入數(shù)字判斷是否要繪制七段數(shù)碼管最中間的橫線 當(dāng)需要繪制時,調(diào)用繪制函數(shù)drawLine(),參數(shù)賦值True 當(dāng)不需要繪制時,賦值參數(shù)False。根據(jù)0-9數(shù)字結(jié)構(gòu),對于2,3,4,5,6,8,9這些數(shù)字需要繪制,否則不需要繪制。為了使輸出樣式固定,簡化設(shè)計,當(dāng)不需要繪制時,turtle畫筆需要抬起。drawLine()函數(shù)根據(jù)輸出參數(shù)的值(True或False)決定是否抬起畫筆。七段數(shù)碼管繪

5、制 為了使代碼模塊化更好,實例代碼7.1定義了drawDate()函數(shù)和main()函數(shù)。drawDate()函數(shù)將更長數(shù)字分解為單個數(shù)字,進(jìn)一步調(diào)用drawDigit()分別繪制每個數(shù)字。main()函數(shù)將啟動窗體大小、畫筆寬度、系統(tǒng)時間等功能封裝在一起,但main()函數(shù)并不體現(xiàn)單一功能,這種封裝僅從提高代碼可讀性角度考慮。七段數(shù)碼管繪制實例代碼7.1的運行效果 實例代碼7.1僅給出了最基本的七段數(shù)碼管繪制程序,可以看出,使用函數(shù)能大量復(fù)用代碼,避免相同功能重復(fù)編寫。此外,函數(shù)的好處還體現(xiàn)在對代碼的修改方面。能否繪制更有趣的七段數(shù)碼管呢? 實例代碼7.2給出了圖5.8的繪制風(fēng)格,請讀者比較

6、實例代碼7.2和實例代碼7.1,進(jìn)一步體會函數(shù)為編程帶來的便利。七段數(shù)碼管繪制實例代碼7.2的運行效果18代碼的復(fù)用和模塊化設(shè)計 程序由一系列代碼組成,如果代碼是順序但無組織的,不僅不利于閱讀和理解,也很難進(jìn)行升級和維護(hù)。因此,需要對代碼進(jìn)行抽象,形成易于理解的結(jié)構(gòu)。 當(dāng)代編程語言從代碼層面采用函數(shù)和對象兩種抽象方式,分別對應(yīng)面向過程和面向?qū)ο缶幊趟枷?。?fù)用和模塊化 函數(shù)是程序的一種基本抽象方式,它將一系列代碼組織起來通過命名供其他程序使用。函數(shù)封裝的直接好處是代碼復(fù)用,任何其他代碼只要輸入?yún)?shù)即可調(diào)用函數(shù),從而避免相同功能代碼在被調(diào)用處重復(fù)編寫。代碼復(fù)用產(chǎn)生了另一個好處,當(dāng)更新函數(shù)功能時,所

7、有被調(diào)用處的功能都被更新。復(fù)用和模塊化 對象是程序的一種高級抽象方式,它將程序代碼組織為更高級別的類。對象包括表征對象特征的屬性和代表對象操作的方法。例如,汽車是一個對象,其顏色、輪胎數(shù)量、車型是屬性,代表汽車的靜態(tài)值;前進(jìn)、后退、轉(zhuǎn)彎等是方法,代表汽車的動作和行為。 在程序設(shè)計中,如果代表對象,獲取其屬性采用.,調(diào)用其方法采用.()。對象的方法具有程序功能性,因此采用函數(shù)形式封裝。復(fù)用和模塊化 簡單地,對象是程序擬解決計算問題的一個高級別抽象,它包括一組靜態(tài)值(屬性)和一組函數(shù)(方法)。從代碼行數(shù)角度,對象和函數(shù)都使用了一個容易理解的抽象邏輯,但對象可以凝聚更多代碼。因此,面向?qū)ο缶幊谈m合

8、代碼規(guī)模較大,交互邏輯復(fù)雜的程序復(fù)用和模塊化 面向過程是一種以過程描述為主要方法的編程方式,該方法要求程序員列出解決問題所需要的步驟,然后用函數(shù)將這些步驟一步一步實現(xiàn),使用時依次建立并調(diào)用函數(shù)或編寫語句即可。面向過程編程是一種基本且自然的程序設(shè)計方法,函數(shù)通過將步驟或子功能封裝實現(xiàn)代碼復(fù)用并簡化程序設(shè)計難度。 面向過程和面向?qū)ο笾皇蔷幊谭绞讲煌?、抽象級別不同,所有面向?qū)ο缶幊棠軐崿F(xiàn)的功能采用面向過程同樣能完成,兩者在解決問題上不存在優(yōu)劣之分復(fù)用和模塊化 當(dāng)程序的長度在百行以上,如果不劃分模塊就算是最好的程序員也很難理解程序含義。解決這一問題的最好方法是將一個程序分割成短小的程序段,每一段程序完

9、成一個小的功能。無論面向過程和面向?qū)ο缶幊蹋瑢Τ绦蚝侠韯澐止δ苣K并基于模塊設(shè)計程序是一種常用方法,被稱為“模塊化設(shè)計”。復(fù)用和模塊化 模塊化設(shè)計指通過函數(shù)或?qū)ο蟮姆庋b功能將程序劃分成主程序、子程序和子程序間關(guān)系的表達(dá)。模塊化設(shè)計是使用函數(shù)和對象設(shè)計程序的思考方法,以功能塊為基本單位,一般有兩個基本要求:緊耦合:盡可能合理劃分功能塊,功能塊內(nèi)部耦合緊密;松耦合:模塊間關(guān)系盡可能簡單,功能塊之間耦合度低。復(fù)用和模塊化 對比實例代碼2.1和實例代碼2.3,盡管后者通過函數(shù)封裝增多了代碼行數(shù),但采用drawSnake()函數(shù)封裝的功能理解起來更加容易。 觀察實例代碼7.1,采用函數(shù)封裝后,理解程序的

10、第一層次不再是直接閱讀語句,而是閱讀函數(shù)及其框架,有需要時再進(jìn)一步理解函數(shù)內(nèi)部語句。為了增強代碼可讀性,復(fù)用和模塊化 建議讀者采用實例代碼7.1中方式,將程序初始化或函數(shù)間過度語句封裝為main()函數(shù),使得全部代碼都由函數(shù)組成,最后通過main()語句執(zhí)行程序。 盡管函數(shù)和模塊化設(shè)計使整個程序看上去篇幅更長,但所增加的封裝代碼十分有益,它們?yōu)槌绦驇砹四K化的層次結(jié)構(gòu),使程序具有更好的可讀性。復(fù)用和模塊化28函數(shù)的遞歸 函數(shù)作為一種代碼封裝,可以被其他程序調(diào)用,當(dāng)然,也可以被函數(shù)內(nèi)部代碼調(diào)用。這種函數(shù)定義中調(diào)用函數(shù)自身的方式稱為遞歸。就像一個人站在裝滿鏡子的房間中,看到的影像就是遞歸的結(jié)果。

11、遞歸在數(shù)學(xué)和計算機應(yīng)用上非常強大,能夠非常簡潔的解決重要問題。遞歸的定義 數(shù)學(xué)上有個經(jīng)典的遞歸例子叫階乘,階乘通常定義為: 為了實現(xiàn)這個程序,可以通過一個簡單的循環(huán)累積去計算階乘。觀察5!的計算,如果去掉了5,那么就剩下計算4!,推廣來看,n!=n(n-1)!。遞歸的定義) 1).(2)(1(!nnnn 實際上,這個關(guān)系給出了另一種方式表達(dá)階乘的方式: 這個定義說明0的階乘按定義是1,其他數(shù)字的階乘定義為這個數(shù)字乘以比這個數(shù)字小1數(shù)的階乘。遞歸不是循環(huán),因為每次遞歸都會計算比它更小數(shù)的階乘,直到0!。0!是已知的值,被稱作遞歸的基例。當(dāng)遞歸到底了,就需要一個能直接算出值的表達(dá)式。遞歸的定義10

12、!(1)!nnn notherwise 階乘的例子揭示了遞歸的2個關(guān)鍵特征:(1)存在一個或多個基例,基例不需要再次遞歸,它是確定的表達(dá)式;(2)所有遞歸鏈要以一個或多個基例結(jié)尾。遞歸的定義 微實例微實例5.15.1:階乘的計算:階乘的計算遞歸的使用方法 fact()函數(shù)在其定義內(nèi)部引用了自身,形成了遞歸過程。 無限制的遞歸將耗盡計算資源,因此,需要設(shè)計基例使得遞歸逐層返回。fact()函數(shù)通過if語句給出了n為0時的基例,當(dāng)n=0,fact()函數(shù)不再遞歸,返回數(shù)值1,如果n!=0,則通過遞歸返回n與n-1階乘的乘積。遞歸的使用方法 由于負(fù)數(shù)和小數(shù)通過減1無法到達(dá)遞歸的基例,即n=0,代碼第

13、7行通過abs()和int()函數(shù)將用戶輸入轉(zhuǎn)變成非負(fù)整數(shù),該程序輸出效果如下:遞歸的使用方法 請輸入一個整數(shù): 103628800 請輸入一個整數(shù): 12.345479001600 遞歸遵循函數(shù)的語義,每次調(diào)用都會引起新函數(shù)的開始,表示它有本地變量值的副本,包括函數(shù)的參數(shù)。圖5.13給出了計算5!的遞歸調(diào)用過程,每次函數(shù)調(diào)用時,函數(shù)參數(shù)的副本會臨時存儲,遞歸中的各函數(shù)在運算自己的參數(shù),相互沒有影響。當(dāng)基例結(jié)束函數(shù)運算并返回值時,各函數(shù)逐層結(jié)束運算,向調(diào)用者返回計算結(jié)果。遞歸的使用方法遞歸的使用方法 對于用戶輸入的字符串s,輸出反轉(zhuǎn)后的字符串。 解決這個問題的基本思想是把字符串看作一個遞歸對象

14、。長字符串由較短字符串組成,每個小字符串也是一個對象。假如把一個字符串看成僅有兩部分組成:首字符和剩余字符串。如果將剩余字符串與首字符交換,就完成了反轉(zhuǎn)整個字符串,代碼如下。def reverse(s):def reverse(s):return reverse(s1:) + s0return reverse(s1:) + s0微實例5.2:字符串反轉(zhuǎn) 觀察這個函數(shù)的工作過程。s0是首字符,s1:是剩余字符串,將它們反向連接,可以得到反轉(zhuǎn)字符串。執(zhí)行這個程序,結(jié)果如下:遞歸的使用方法 這個錯誤表明系統(tǒng)無法執(zhí)行reverse()函數(shù)創(chuàng)建的遞歸,這因為reverse()函數(shù)沒有基例,遞歸層數(shù)超過了

15、系統(tǒng)允許的最大遞歸深度。默認(rèn)情況下,當(dāng)遞歸調(diào)用到1000層,Python解釋器將終止程序。 遞歸深度是為了防止無限遞歸錯誤而設(shè)計,當(dāng)用戶編寫的正確遞歸程序需要超過1000層時,可以通過如下代碼設(shè)定。遞歸的使用方法import sysimport syssys.setrecursionlimit(2000) #2000sys.setrecursionlimit(2000) #2000是新的遞歸層數(shù)是新的遞歸層數(shù)reverse()超過遞歸深度是因為沒有設(shè)計基例。字符串反轉(zhuǎn)中的遞歸調(diào)用總是使用比之前更短的字符串,因此,可以把基例設(shè)計為字符串的最短形式,即空字符串。遞歸的使用方法實例5.2的完整代碼和

16、結(jié)果微實例微實例5.25.2的結(jié)果的結(jié)果請輸入一個字符串請輸入一個字符串: : 唐詩宋詞唐詩宋詞詞宋詩唐詞宋詩唐43科赫曲線繪制 科赫曲線的基本概念和繪制方法如下:正整數(shù)n代表科赫曲線的階數(shù),表示生成科赫曲線過程的操作次數(shù)??坪涨€初始化階數(shù)為0,表示一個長度為L的直線。對于直線L,將其等分為三段,中間一段用邊長為L/3的等邊三角形的兩個邊替代,得到1階科赫曲線,它包含四條線段。進(jìn)一步對每條線段重復(fù)同樣的操作后得到2階科赫曲線。繼續(xù)重復(fù)同樣的操作n次可以得到n階科赫曲線,如圖5.14所示??坪涨€繪制科赫曲線繪制 科赫曲線屬于分形幾何分支,它的繪制過程體現(xiàn)了遞歸思想,繪制過程代碼如下科赫曲線繪

17、制科赫曲線繪制 n階科赫曲線的繪制相當(dāng)于在畫筆前進(jìn)方向的0度、60度、-120度和60度分別繪制n-1階曲線。實例代碼8.1中main()函數(shù)設(shè)置了一些初始參數(shù),如果希望控制繪制科赫曲線的速度,可以采用turtle.speed()函數(shù)增加或減少速度。 科赫曲線從一條直線繪制開始,如果從等邊三角形開始將更有趣。替換實例代碼8.1中的main()函數(shù),代碼如下。在給定初始圖形后,通過科赫曲線可以生成很多漂亮的圖形,請讀者探索和嘗試??坪涨€繪制科赫曲線繪制51Python內(nèi)置函數(shù) Python解釋器提供了68個內(nèi)置函數(shù),這些函數(shù)不需要引用庫直接使用,如表5.4所示。其中,前36個已經(jīng)或?qū)⒃诒緯谐霈F(xiàn),需要讀者掌握。Python內(nèi)置函數(shù)Python內(nèi)置函數(shù)部分函數(shù)說明如下,其他尚未遇到的函數(shù)將在后續(xù)章節(jié)中介紹并使用 all()函數(shù)一般針對組合數(shù)據(jù)類型,如果其中每個元素都是True,則返回True,否則返回False。需要注意,整數(shù)0、空字符串、空列表等都被當(dāng)作False。 any()函數(shù)與all()函數(shù)相反,只要組合數(shù)據(jù)類型中任何一個是True,則返回True,全部元素都是False時返回False。Python內(nèi)置函數(shù) hash(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論