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

下載本文檔

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

文檔簡介

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

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

由于調(diào)用函數(shù)時指定了參數(shù)名稱,所以參數(shù)之間的順序可以任意調(diào)整。參數(shù)的位置和名稱傳遞第二十七頁,共58頁。return語句用來退出函數(shù)并將程序返回到函數(shù)被調(diào)用的位置繼續(xù)執(zhí)行。return語句同時可以將0個、1個或多個函數(shù)運算完的結(jié)果返回給函數(shù)被調(diào)用處的變量,例如。變量的返回值第二十八頁,共58頁。函數(shù)可以沒有return,此時函數(shù)并不返回值,如微實例5.1的happy()函數(shù)。函數(shù)也可以用return返回多個值,多個值以元組類型保存變量的返回值第二十九頁,共58頁。一個程序中的變量包括兩類:全局變量和局部變量。全局變量指在函數(shù)之外定義的變量,一般沒有縮進,在程序執(zhí)行全過程有效。局部變量指在函數(shù)內(nèi)部使用的變量,僅在函數(shù)內(nèi)部有效,當(dāng)函數(shù)退出時變量將不存在。例子如下。函數(shù)對變量的作用第三十頁,共58頁。函數(shù)對變量的作用第三十一頁,共58頁。這個例子說明,當(dāng)函數(shù)執(zhí)行完退出后,其內(nèi)部變量將被釋放。如果函數(shù)內(nèi)部使用了全局變量呢?例子如下。函數(shù)對變量的作用第三十二頁,共58頁。函數(shù)func()內(nèi)部使用了變量n,并且將變量參數(shù)b賦值給變量n,為何n值沒有改變?函數(shù)func()有自己的內(nèi)存空間,它將n=b語句理解為生成一個局部變量n,并將參數(shù)b賦值給它,此時func()函數(shù)沒有將n當(dāng)作全局變量。所以,函數(shù)退出后,局部變量n被釋放,全局變量n的值沒有修改。函數(shù)對變量的作用第三十三頁,共58頁。如果希望讓func()函數(shù)將n當(dāng)作全局變量,需要在變量n使用前顯式聲明該變量為全局變量,代碼如下。函數(shù)對變量的作用第三十四頁,共58頁。如果此時的全局變量不是整數(shù)n,而是列表類型ls,會怎么樣呢?理解如下代碼。函數(shù)對變量的作用第三十五頁,共58頁。請讀者注意,奇跡產(chǎn)生了,全局列表變量在函數(shù)func()調(diào)用后竟然發(fā)生了改變!列表等組合數(shù)據(jù)類型由于操作多個數(shù)據(jù),所以它們在使用中有創(chuàng)建和引用的分別。當(dāng)列表變量被方括號([],無論是否為空)賦值時,這個列表才被真實創(chuàng)建,否則只是對之前創(chuàng)建列表的一次引用。函數(shù)對變量的作用第三十六頁,共58頁。上述代碼func()函數(shù)的ls.append(b)語句執(zhí)行時需要一個真實創(chuàng)建過的列表,此時func()函數(shù)專屬的內(nèi)存空間中沒有已經(jīng)創(chuàng)建過且名稱為ls的列表,因此,func()函數(shù)進一步去尋找全局內(nèi)存空間,自動關(guān)聯(lián)全局ls列表,并修改其內(nèi)容。當(dāng)func()函數(shù)退出后,全局ls列表中的內(nèi)容被修改。簡單說,對于列表類型,函數(shù)可以直接使用全局列表而不需要采用global進行聲明。函數(shù)對變量的作用第三十七頁,共58頁。如果func()函數(shù)內(nèi)部存在一個真實創(chuàng)建過且名稱為ls的列表,則func()函數(shù)將操作該列表而不會修改全局變量,例子如下。函數(shù)對變量的作用第三十八頁,共58頁??偨Y(jié)一下,Python函數(shù)對變量的作用遵守如下原則:簡單數(shù)據(jù)類型變量無論是否與全局變量重名,僅在函數(shù)內(nèi)部創(chuàng)建和使用,函數(shù)退出后變量被釋放,如有全局同名變量,其值不變;簡單數(shù)據(jù)類型變量在用global保留字聲明后,作為全局變量使用,函數(shù)退出后該變量保留且值被函數(shù)改變;函數(shù)對變量的作用第三十九頁,共58頁。對于組合數(shù)據(jù)類型的全局變量,如果在函數(shù)內(nèi)部沒有被真實創(chuàng)建同名變量,則函數(shù)內(nèi)部可以直接使用并修改全局變量的值;如果函數(shù)內(nèi)部真實創(chuàng)建了組合數(shù)據(jù)類型變量,無論是否有同名全局變量,函數(shù)僅對局部變量進行操作,函數(shù)退出后局部變量被釋放,全局變量值不變。函數(shù)對變量的作用第四十頁,共58頁。datetime庫的使用第四十一頁,共58頁。以不同格式顯示日期和時間是程序中最常用到的功能。Python提供了一個處理時間的標(biāo)準(zhǔn)函數(shù)庫datetime,它提供了一系列由簡單到復(fù)雜的時間處理方法。datetime庫可以從系統(tǒng)中獲得時間,并以用戶選擇的格式輸出。datetime庫以格林威治時間為基礎(chǔ),每天由3600*24秒精準(zhǔn)定義。該庫包括兩個常量:datetime.MINYEAR與datetime.MAXYEAR,分別表示datetime所能表示的最小、最大年份,值分別為1與9999。datetime庫概述第四十二頁,共58頁。datetime庫以類的方式提供多種日期和時間表達方式:datetime.date:日期表示類,可以表示年、月、日等。datetime.time:時間表示類,可以表示小時、分鐘、秒、毫秒等datetime.datetime:日期和時間表示的類,功能覆蓋date和timedatetime.timedelta:時間間隔有關(guān)的類。datetime.tzinfo:與時區(qū)有關(guān)的信息表示類。datetime庫概述第四十三頁,共58頁。由于datetime.datetime類表達形式最為豐富,主要介紹這個類的使用。使用datetime類需要用import保留字,具體引用datetime類的方式如下:fromdatetimeimportdatetimedatetime庫概述第四十四頁,共58頁。datetime類(datetime.datetime類,以下簡稱為datetime類)的使用方式是首先創(chuàng)建一個datetime對象,然后通過對象的方法和屬性顯示時間。創(chuàng)建datetime對象共包括3個方法datetime.now()datetime.utcnow()datetime.datetime()datetime庫解析第四十五頁,共58頁。datetime.now()作用:返回一個datetime類型,表示當(dāng)前的日期和時間,精確到微秒。參數(shù):無datetime庫解析第四十六頁,共58頁。調(diào)用該函數(shù),執(zhí)行結(jié)果如下:datetime庫解析第四十七頁,共58頁。使用datetime.utcnow()獲得當(dāng)前日期和時間對應(yīng)的UTC(世界標(biāo)準(zhǔn)時間)時間對象,使用方法如下:datetime.utcnow()作用:返回一個datetime類型,表示當(dāng)前日期和時間的UTC表示,精確到微秒。參數(shù):無datetime庫解析第四十八頁,共58頁。調(diào)用該函數(shù),執(zhí)行結(jié)果如下:datetime庫解析第四十九頁,共58頁。datetime.now()和datetime.utcnow()都返回一個datetime類型的對象,也可以直接使用datetime()構(gòu)造一個日期和時間對象,使用方法如下:datetime(year,month,day,hour=0,minute=0,second=0,microsecond=0)作用:返回一個datetime類型,表示指定的日期和時間,可以精確到微秒。datetime庫解析第五十頁,共58頁。參數(shù):year:指定的年份,MINYEAR<=year<=MAXYEARmonth:指定的月份,1<=month<=12day:指定的日期,1<=day<=月份所對應(yīng)的日期上限hour:指定的小時,0<=hour<24minute:指定的分數(shù),0<=minute<60second:指定的秒數(shù),0<=second<60microsecond:指定的微秒數(shù),0<=microsecond<1000000datetime庫解析第五十一頁,共58頁。調(diào)用datetime()函數(shù)直接創(chuàng)建一個datetime對象,表示2016年9月16日22:33,32秒7微秒,執(zhí)行結(jié)果如下:datetime庫解析第五十二頁,共58頁。到此,程序已經(jīng)有了一個datetime對象,進一步可以利用這個對象的屬性顯示時間,為了區(qū)別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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論