Python電子教案5-1-函數和代碼復用_第1頁
Python電子教案5-1-函數和代碼復用_第2頁
Python電子教案5-1-函數和代碼復用_第3頁
Python電子教案5-1-函數和代碼復用_第4頁
Python電子教案5-1-函數和代碼復用_第5頁
已閱讀5頁,還剩53頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Python電子教案5-1-函數和代碼復用第一頁,共58頁。函數是一段具有特定功能的、可重用的語句組,用函數名來表示并通過函數名完成功能調用。函數也可以看作一段具有名字的子程序,可以在需要的地方調用執行,不需要在每個執行地方重復編寫這些語句。每次使用函數可以提供不同的參數作為輸入,以實現對不同數據的處理;函數執行后,還可以反饋相應的結果。函數能夠完成特定功能,與黑盒類似,對函數的使用不需要了解函數內部實現原理,只要了解函數的輸入輸出方式即可。嚴格說,函數是一種功能抽象。函數的定義第二頁,共58頁。有些函數是用戶自己編寫的,稱為自定義函數;Python安裝包也自帶了一些函數和方法,包括Python內置的函數(如abs()、eval())、Python標準庫中的函數(如math庫中的sqrt())等。函數的定義第三頁,共58頁。使用函數主要有兩個目的:降低編程難度和代碼重用。函數是一種功能抽象,利用它可以將一個復雜的大問題分解成一系列簡單的小問題,然后將小問題繼續劃分成更小的問題,當問題細化為足夠簡單時,就可以分而治之函數可以在一個程序中多個位置使用,也可以用于多個程序,當需要修改代碼時,只需要在函數中修改一次,所有調用位置的功能都更新了,這種代碼重用降低了代碼行數和代碼維護難度。函數的定義第四頁,共58頁。Python定義一個函數使用def保留字,語法形式如下:def<函數名>(<參數列表>):<函數體>return<返回值列表>函數的定義第五頁,共58頁。函數名可以是任何有效的Python標識符;參數列表是調用該函數時傳遞給它的值,可以有零個、一個或多個,當傳遞多個參數時各參數由逗號分隔,當沒有參數時也要保留圓括號。函數定義中參數列表里面的參數是形式參數,簡稱為“形參”。函數體是函數每次被調用時執行的代碼,由一行或多行語句組成。如果需要返回值,使用保留字return和返回值列表。函數可以沒有return語句,在函數體結束位置將控制權返回給調用者。函數的定義第六頁,共58頁。函數調用和執行的一般形式是:<函數名>(<參數列表>)此時,參數列表中給出要傳進入函數內部的參數,這類參數稱為實際參數,簡稱為“實參”。函數的定義第七頁,共58頁。編寫程序為Mike和Lily輸出生日歌。最簡單的實現方法是重復使用print()語句,對Mike的生日歌輸出如下:微實例5.1:生日歌第八頁,共58頁。其中,第1、2、4行代碼相同,假如需要將birthday改為newyear,則每處都要修改。為了避免這種情況,可以用函數printHappy()進行封裝。除了Mike,如果再對Lily輸出生日歌,除第3行有微小不同外與上述代碼一致,這會帶來重復代碼。如果再有Eric,Adam呢?為了能夠復用語句,采用函數方式完成功能,代碼如下微實例5.1:生日歌第九頁,共58頁。微實例5.1:生日歌第十頁,共58頁。該程序輸出效果如下:微實例5.1:生日歌第十一頁,共58頁。微實例5.1代碼中第3行定義了一個函數happyB(),括號中name是形參,用來指代要輸入到函數的實際變量,并參與完成函數內部功能。第8和10行兩次調用happyB()函數,輸入的"Mike"和"Lily"是實參,替換name,用于函數執行。微實例5.1:生日歌第十二頁,共58頁。程序調用一個函數需要執行以下四個步驟:(1)調用程序在調用處暫停執行;(2)在調用時將實參復制給函數的形參;(3)執行函數體語句;(4)函數調用結束給出返回值,程序回到調用前的暫停處繼續執行。函數的調用過程第十三頁,共58頁。對微實例5.1的生日歌程序跟蹤分析。第1到7行是函數定義,函數只有在被調用時才執行,因此,前7行代碼不直接執行。程序最先執行的語句是第8行的happyB("Mike")。當Python執行到這行時,由于調用了happyB()函數,當前執行暫停,程序用實參"Mike"替換happyB(name)中的形參name,形參被賦值為實參的值,類似執行了如下語句:name="Mike"函數的調用過程第十四頁,共58頁。然后,使用實參代替形參執行函數體內容。當函數執行完畢后,重新回到第8行,繼續執行余下語句。函數第8行的執行過程如圖5.1所示,這里函數happyB()的變量name被自動替換為"Mike"。函數的調用過程第十五頁,共58頁。當程序執行happyB()函數體時,第一條執行語句是happy()函數,這也是一個函數調用。因此,Python暫停執行happyB()函數,將控制傳遞給被調用的函數happy()。happy()函數體包含了一個簡單的print語句,該語句執行后函數體結束,程序重新返回調用happy()函數的位置。圖5.2給出了happy()函數調用和返回的執行過程。函數的調用過程第十六頁,共58頁。函數的調用過程第十七頁,共58頁。程序執行完happyB()函數體后,返回調用該函數的原始位置,繼續執行,如圖5.3所示。函數的調用過程第十八頁,共58頁。lambda用于定義一種特殊的函數——匿名函數,又稱lambda函數匿名函數并非沒有名字,而是將函數名作為函數結果返回<函數名>=lambda<參數列表>:<表達式>lambda函數與正常函數一樣,等價于下面形式:def<函數名>(<參數列表>):return<表達式>lambda函數第十九頁,共58頁。簡單說,lambda函數用于定義簡單的、能夠在一行內表示的函數,返回一個函數類型,實例如下。lambda函數第二十頁,共58頁。函數的參數傳遞第二十一頁,共58頁。在定義函數時,如果有些參數存在默認值,即部分參數不一定需要調用程序輸入,可以在定義函數時直接為這些參數指定默認值。當函數被調用時,如果沒有傳入對應的參數值,則使用函數定義時的默認值替代,例如:可選參數和可變數量參數第二十二頁,共58頁。由于函數調用時需要按順序輸入參數,可選參數必須定義在非可選參數的后面,即dup()函數中帶默認值的可選參數times必須定義在str參數后面。

在函數定義時,也可以設計可變數量參數,通過參數前增加星號(*)實現。帶有星號的可變參數只能出現在參數列表的最后。調用時,這些參數被當作元組類型傳遞到函數中,實例如下??蛇x參數和可變數量參數第二十三頁,共58頁。vfunc()函數定義了可變參數b,調用vfunc()函數時輸入的(2,3,4,5)被當作元組傳遞給b,與a累加后輸出。第6.1節將詳細介紹元組類型,這里請讀者將元組理解為一組元素。可選參數和可變數量參數第二十四頁,共58頁。函數調用時,實參默認采用按照位置順序的方式傳遞給函數,例如dup("knock~",4)中第一個實參默認賦值給形參str,第二個實參賦值給形參times。但當參數很多時,這種調用參數方式可讀性較差。假設func()函數有6個參數,它的定義如下,參數分別表示2組三維坐標值。func(x1,y1,z1,x2,y2,z2):return參數的位置和名稱傳遞第二十五頁,共58頁。它的一個實際調用如下: result=func(1,2,3,4,5,6,)如果僅看實際調用而不找到函數定義,很難理解這些輸入參數的含義。在規模稍大的程序中,函數定義可能在函數庫中,也可能與調用相差很遠,帶來較差的可讀性。參數的位置和名稱傳遞第二十六頁,共58頁。為了解決上述問題,Python提供了按照形參名稱輸入實參的方式,函數調用如下: result=func(x2=4,y2=5,z2=6,x1=1,y1=2,z1=3)

由于調用函數時指定了參數名稱,所以參數之間的順序可以任意調整。參數的位置和名稱傳遞第二十七頁,共58頁。return語句用來退出函數并將程序返回到函數被調用的位置繼續執行。return語句同時可以將0個、1個或多個函數運算完的結果返回給函數被調用處的變量,例如。變量的返回值第二十八頁,共58頁。函數可以沒有return,此時函數并不返回值,如微實例5.1的happy()函數。函數也可以用return返回多個值,多個值以元組類型保存變量的返回值第二十九頁,共58頁。一個程序中的變量包括兩類:全局變量和局部變量。全局變量指在函數之外定義的變量,一般沒有縮進,在程序執行全過程有效。局部變量指在函數內部使用的變量,僅在函數內部有效,當函數退出時變量將不存在。例子如下。函數對變量的作用第三十頁,共58頁。函數對變量的作用第三十一頁,共58頁。這個例子說明,當函數執行完退出后,其內部變量將被釋放。如果函數內部使用了全局變量呢?例子如下。函數對變量的作用第三十二頁,共58頁。函數func()內部使用了變量n,并且將變量參數b賦值給變量n,為何n值沒有改變?函數func()有自己的內存空間,它將n=b語句理解為生成一個局部變量n,并將參數b賦值給它,此時func()函數沒有將n當作全局變量。所以,函數退出后,局部變量n被釋放,全局變量n的值沒有修改。函數對變量的作用第三十三頁,共58頁。如果希望讓func()函數將n當作全局變量,需要在變量n使用前顯式聲明該變量為全局變量,代碼如下。函數對變量的作用第三十四頁,共58頁。如果此時的全局變量不是整數n,而是列表類型ls,會怎么樣呢?理解如下代碼。函數對變量的作用第三十五頁,共58頁。請讀者注意,奇跡產生了,全局列表變量在函數func()調用后竟然發生了改變!列表等組合數據類型由于操作多個數據,所以它們在使用中有創建和引用的分別。當列表變量被方括號([],無論是否為空)賦值時,這個列表才被真實創建,否則只是對之前創建列表的一次引用。函數對變量的作用第三十六頁,共58頁。上述代碼func()函數的ls.append(b)語句執行時需要一個真實創建過的列表,此時func()函數專屬的內存空間中沒有已經創建過且名稱為ls的列表,因此,func()函數進一步去尋找全局內存空間,自動關聯全局ls列表,并修改其內容。當func()函數退出后,全局ls列表中的內容被修改。簡單說,對于列表類型,函數可以直接使用全局列表而不需要采用global進行聲明。函數對變量的作用第三十七頁,共58頁。如果func()函數內部存在一個真實創建過且名稱為ls的列表,則func()函數將操作該列表而不會修改全局變量,例子如下。函數對變量的作用第三十八頁,共58頁??偨Y一下,Python函數對變量的作用遵守如下原則:簡單數據類型變量無論是否與全局變量重名,僅在函數內部創建和使用,函數退出后變量被釋放,如有全局同名變量,其值不變;簡單數據類型變量在用global保留字聲明后,作為全局變量使用,函數退出后該變量保留且值被函數改變;函數對變量的作用第三十九頁,共58頁。對于組合數據類型的全局變量,如果在函數內部沒有被真實創建同名變量,則函數內部可以直接使用并修改全局變量的值;如果函數內部真實創建了組合數據類型變量,無論是否有同名全局變量,函數僅對局部變量進行操作,函數退出后局部變量被釋放,全局變量值不變。函數對變量的作用第四十頁,共58頁。datetime庫的使用第四十一頁,共58頁。以不同格式顯示日期和時間是程序中最常用到的功能。Python提供了一個處理時間的標準函數庫datetime,它提供了一系列由簡單到復雜的時間處理方法。datetime庫可以從系統中獲得時間,并以用戶選擇的格式輸出。datetime庫以格林威治時間為基礎,每天由3600*24秒精準定義。該庫包括兩個常量:datetime.MINYEAR與datetime.MAXYEAR,分別表示datetime所能表示的最小、最大年份,值分別為1與9999。datetime庫概述第四十二頁,共58頁。datetime庫以類的方式提供多種日期和時間表達方式:datetime.date:日期表示類,可以表示年、月、日等。datetime.time:時間表示類,可以表示小時、分鐘、秒、毫秒等datetime.datetime:日期和時間表示的類,功能覆蓋date和timedatetime.timedelta:時間間隔有關的類。datetime.tzinfo:與時區有關的信息表示類。datetime庫概述第四十三頁,共58頁。由于datetime.datetime類表達形式最為豐富,主要介紹這個類的使用。使用datetime類需要用import保留字,具體引用datetime類的方式如下:fromdatetimeimportdatetimedatetime庫概述第四十四頁,共58頁。datetime類(datetime.datetime類,以下簡稱為datetime類)的使用方式是首先創建一個datetime對象,然后通過對象的方法和屬性顯示時間。創建datetime對象共包括3個方法datetime.now()datetime.utcnow()datetime.datetime()datetime庫解析第四十五頁,共58頁。datetime.now()作用:返回一個datetime類型,表示當前的日期和時間,精確到微秒。參數:無datetime庫解析第四十六頁,共58頁。調用該函數,執行結果如下:datetime庫解析第四十七頁,共58頁。使用datetime.utcnow()獲得當前日期和時間對應的UTC(世界標準時間)時間對象,使用方法如下:datetime.utcnow()作用:返回一個datetime類型,表示當前日期和時間的UTC表示,精確到微秒。參數:無datetime庫解析第四十八頁,共58頁。調用該函數,執行結果如下:datetime庫解析第四十九頁,共58頁。datetime.now()和datetime.utcnow()都返回一個datetime類型的對象,也可以直接使用datetime()構造一個日期和時間對象,使用方法如下:datetime(year,month,day,hour=0,minute=0,second=0,microsecond=0)作用:返回一個datetime類型,表示指定的日期和時間,可以精確到微秒。datetime庫解析第五十頁,共58頁。參數:year:指定的年份,MINYEAR<=year<=MAXYEARmonth:指定的月份,1<=month<=12day:指定的日期,1<=day<=月份所對應的日期上限hour:指定的小時,0<=hour<24minute:指定的分數,0<=minute<60second:指定的秒數,0<=second<60microsecond:指定的微秒數,0<=microsecond<1000000datetime庫解析第五十一頁,共58頁。調用datetime()函數直接創建一個datetime對象,表示2016年9月16日22:33,32秒7微秒,執行結果如下:datetime庫解析第五十二頁,共58頁。到此,程序已經有了一個datetime對象,進一步可以利用這個對象的屬性顯示時間,為了區別datetime庫名,采用上例中的someday代替生成的datetime對象,常用屬性如表5.1所示datetime庫解析第五十三頁,共58頁。datetime庫解析屬性描述屬性someday.min固定返回datetime的最小時間對象,datetime(1,1,1,0,0)someday.minsomeday.max固定返回datetime的最大時間對象,datetime(9999,12,31,23,59,59,999999)someday.maxsomeday.year返回someday包含的年份someday.yearsomeday.month返回someday包含的月份someday.monthsomeday.day返回someday包含的日期someday.daysomeday.hour返回someday包含的小時someday.hoursomeday.minute返回someday包含的分鐘someday.minutesomeday.second返回someday包含的秒鐘someday.secondsomeday.microsecond

溫馨提示

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

評論

0/150

提交評論