Python程序設計(含視頻分析) 課件 第4章 函數和模塊_第1頁
Python程序設計(含視頻分析) 課件 第4章 函數和模塊_第2頁
Python程序設計(含視頻分析) 課件 第4章 函數和模塊_第3頁
Python程序設計(含視頻分析) 課件 第4章 函數和模塊_第4頁
Python程序設計(含視頻分析) 課件 第4章 函數和模塊_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Python程序設計第4章函數和模塊第4章函數和模塊4.1引言4.2函數的基本概念4.3參數傳遞4.4參數類型4.5返回值4.6結構化程序設計4.7命名空間與作用域4.8匿名函數4.9內置函數4.10模塊4.11遞歸4.12在turtle中使用函數第4章函數和模塊4.1引言4.1引言函數是程序中執(zhí)行特定任務的一組語句。使用函數封裝每個任務所編寫的程序稱為模塊化程序。使用函數模塊化程序的好處:可讀性好代碼重用易于測試便于團隊合作Python中的函數包括:內置函數標準庫函數自定義函數第4章函數和模塊4.2函數的基本概念4.2函數的基本概念4.2.1函數的定義函數三要素:輸入、輸出和處理函數定義的一般形式:函數體中的所有語句具有相同的縮進。def函數名(參數表):

函數體4.2函數的基本概念4.2.2函數的調用調用函數時,解釋器跳轉到該函數,并執(zhí)行對應語句塊中的語句。當到達語句塊的末尾時,解釋器跳回到當初調用該函數的位置,并在該處恢復執(zhí)行。第4章函數和模塊4.3參數傳遞4.3參數傳遞形參:定義函數時,函數名后面的小括號內的變量實參:調用函數時,函數名后面提供的值或變量不可變類型參數:字符串、元組和數值。如果在函數內部修改參數的值,則會生成一個新的對象,并不會影響到函數外變量的值。defchange(a):#這里a是形參,是不可變類型參數print(id(a))#指向的是同一個對象a=10print(id(a))#一個新對象a=1print(id(a))change(a)#這里a是實參###################################程序輸出4379369136437936913643793691244.3參數傳遞可變類型參數:列表和字典。在函數內修改可變類型參數,函數外的對應變量也會受影響。defchangeme(mylist):mylist.append([1,2,3,4])print("函數內取值:",mylist)mylist=[10,20,30]changeme(mylist)print("函數外取值:",mylist)###################################程序輸出函數內取值:[10,20,30,[1,2,3,4]]函數外取值:[10,20,30,[1,2,3,4]]第4章函數和模塊4.4參數類型4.4參數類型調用函數時,可使用的參數類型有:位置參數關鍵字參數默認參數不定長參數4.4參數類型4.4.1位置參數也稱必須參數,指參數必須以正確順序傳入函數,調用時數量必須和聲明的數量一致。如果不一致,執(zhí)行后會出錯。例如:defprintme(str):print(str)#調用printme函數,不加參數會報錯printme()###################################程序輸出Traceback(mostrecentcalllast):File"C:\programming\Python\test.py",line6,in<module>printme()TypeError:printme()missing1requiredpositionalargument:'str'4.4參數類型4.4.2關鍵字參數指在函數調用時通過傳遞參數名=傳遞參數值的形式來傳入參數。使用關鍵字參數允許函數調用時參數順序與聲明時不一致。defprintinfo(name,age):print("名字:",name)print("年齡:",age)printinfo(age=50,name="小明")###################################程序輸出名字:小明年齡:504.4參數類型4.4.3默認參數定義函數時給參數賦默認值,這個參數就成了默認參數。調用函數時,默認參數可以不寫,此時默認參數會使用默認值。defprintinfo(name,age=35):print("名字:",name)print("年齡:",age)#調用printinfo函數printinfo(age=50,name="lsy")print("------------------------")printinfo(name="lsy")###################################輸出結果名字:lsy年齡:50------------------------名字:lsy年齡:354.4參數類型可以將參數值變化小的設置為默認參數。默認參數一般是不可變對象。如果是可變對象,在多次調用函數時,默認參數都指向同一對象。如果在函數內改變了默認參數的值,會在下次調用時使用上次默認參數的結果。4.4參數類型4.4.4不定長參數如果一個函數能處理比聲明時更多的參數,這些參數就叫做不定長參數。不定長參數在聲明時不會命名。不定長參數有兩種導入類型:元組形式:加一個*號的參數會以元組的形式導入,存放所有未命名的參數。例如:defprintinfo(arg1,*vartuple):print("輸出:")print(arg1)print(vartuple)#調用printinfo函數printinfo(70,60,50)###################################輸出結果70(60,50)4.4參數類型字典形式:加了兩個星號**的參數會以字典的形式導入。例如:defprintinfo(arg1,**vardict):print("輸出:")print(arg1)print(vardict)#調用printinfo函數printinfo(1,a=2,b=3)###################################輸出結果1{‘a’:2,’b’:3}4.4參數類型4.4.5命名關鍵字參數聲明函數時,參數中*可以單獨出現。若單獨出現*,*右側參數必須用關鍵字傳入。此時這些參數也叫命名關鍵字參數。例如:>>>deff(a,b,*,c):...returna+b+c...>>>f(1,2,3)#報錯Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:f()takes2positionalargumentsbut3weregiven>>>f(1,2,c=3)#正常6>>>4.4參數類型4.4.5命名關鍵字參數聲明函數時,參數中*可以單獨出現。若單獨出現*,*右側參數必須用關鍵字傳入。此時這些參數也叫命名關鍵字參數。例如:>>>deff(a,b,*,c):...returna+b+c...>>>f(1,2,3)#報錯Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:f()takes2positionalargumentsbut3weregiven>>>f(1,2,c=3)#正常6>>>4.4參數類型4.4.5命名關鍵字參數聲明函數時,參數中*可以單獨出現。若單獨出現*,*右側參數必須用關鍵字傳入。此時這些參數也叫命名關鍵字參數。例如:>>>deff(a,b,*,c):...returna+b+c...>>>f(1,2,3)#報錯 Traceback(mostrecentcalllast): File"<stdin>",line1,in<module> TypeError:f()takes2positionalargumentsbut3weregiven>>>f(1,2,c=3)#正常6>>>第4章函數和模塊4.5返回值4.5返回值有返回值的函數必須有一個return語句來將值返回到調用它的程序部分。return語句形式如下:returnexpression其中expression可以是任意值、變量或具有值的表達式。例如:defis_odd(n):returnn%2==0print(is_odd(7))###################################False4.5返回值在Python中,函數并不局限于返回一個值,可以在return語句后使用逗號分隔的多個表達式返回多個值。形式如下:returnexpression1,expression2,…舉例如下:調用返回多個值的函數時,賦值號左邊的變量的個數和順序必須和函數返回值的個數和順序相同。defget_name():first=input(‘Enteryourfirstname:’)last=input(‘Enteryourlastname:’)returnfirst,last###################################first_name,last_name=get_name()print('Yourname:',first_name,last_name)4.5返回值IPO圖是程序員用來設計和注釋函數的一種簡單有效的工具。IPO分別代表了Input、Processing和Output,描述了函數的輸入、處理和輸出三個要素。例如:函數is_odd輸入處理輸出一個整數判斷輸入整數是否偶數返回判斷結果,是返回True,不是返回False第4章函數和模塊4.6結構化程序設計4.6結構化程序設計結構化程序設計由著名計算機科學家E.W.Dijkstra于1969年提出,它強調程序設計的風格和程序結構的規(guī)范化,其基本思路是將一個復雜問題的求解過程劃分為若干階段,每個階段要處理的問題都易于理解和處理。它包含以下三個步驟:自頂向下問題分析方法模塊化設計結構化編碼后續(xù)的講解基于以下的例子:開發(fā)一個學生成績統計程序,輸入一批學生的5門課程的成績,要求輸出每個學生的平均分和每門課程的平均分,找出平均分最高的學生。4.6結構化程序設計4.6.1自頂向下問題分析方法面對一個復雜的問題,首先進行上層整體分析,按組織或功能將問題分解成子問題,如果子問題仍然十分復雜,再做進一步分解,直到處理對象相對簡單、容易解決為止。當所有子問題都得到了解決,整個問題也就解決了。在這個過程中,每一次的分解都是對上一層問題進行細化和逐步求精,最終形成一種類似樹形的層次結構來描述分析的過程。上述例子用自頂向下方法分析后,層次結構圖如下所示:4.6結構化程序設計4.6.2模塊化設計在這個階段,需要將模塊組織成良好的層次系統,頂層模塊調用下層模塊以實現程序的完整功能,每個下層模塊再調用更下層的模塊,最下層的模塊完成最具體的功能。模塊化設計時要遵循模塊獨立性的原則,模塊之間的聯系應盡量簡單。模塊化設計使程序結構清晰,易于設計和理解。有利于大型軟件的開發(fā),程序員可以分工編寫不同的模塊。在Python中,這里的模塊一般通過函數來實現,一個模塊對應一個函數。函數中包含的語句一般不要超過50行。4.6結構化程序設計對上述例子進行模塊化設計:defmain():input_stu()calc_data()highest()output_stu()definput_stu():passdefcalc_data():avr_stu()avr_cor()defhighest():passdefoutput_stu():passdefavr_stu():passdefavr_cor():passmain()4.6結構化程序設計4.6.3結構化編碼結構化編碼主要原則:1)經模塊化設計后,每個模塊都可以獨立編碼。編程時應選擇順序、選擇和循環(huán)3種控制結構。對于復雜問題則可以通過這3種結構的組合嵌套實現。2)對變量、函數等命名時,要見名知義,有助于對變量含義或函數功能的理解。3)在程序中添加必要的注釋,增加程序可讀性。4)要有良好的程序視覺組織,利用好縮進格式,一行寫一條語句。5)程序要清晰易懂,語句結構要簡單直接。在效率要求不太高的場合,在不影響功能的前提下,做到結構清晰第一,效率第二。6)有良好交互性,盡量采取統一整齊的格式。第4章函數和模塊4.7命名空間和作用域4.7命名空間和作用域4.7.1命名空間命名空間(namespace)是從名稱到對象的映射。大部分命名空間通過字典來實現,它提供了在項目中避免名字沖突的一種方法。各個命名空間是獨立的,在一個命名空間中不能有重名,但不同命名空間可以重名。一般有三種命名空間:1)內置命名空間(built-innamespace):python語言內置的名稱;2)全局命名空間(globalnamespace):模塊中定義的名稱,包括函數、類、其他導入的模塊、模塊級的變量和常量;3)局部命名空間(localnamespace):函數中定義的名稱,包括函數參數和局部定義的變量,類中定義的也是。Python查找變量a的順序:局部命名空間-》全局命名空間-》內置命名空間4.7命名空間和作用域4.7.2作用域作用域是Python程序可以直接訪問命名空間的正文區(qū)域。共有四種作用域:Local:最內層,包含局部變量。比如一個函數/方法內部;Enclosing:包含非局部(non-local)也非全局(non-global)的變量。比如函數A中包含了函數B,對于B中的名稱來說A中的作用域就是non-local;Global:當前腳本的最外層。比如當前模塊的全局變量;Built-in:包含了內建的變量/關鍵字等;查找順序:L->E->G->B。4.7命名空間和作用域內置作用域通過一個名為builtin的標準模塊來實現的,但這個變量名自身并沒有放入內置作用域內,必須導入這個文件才能使用它。Python中只有模塊、類以及函數才會引入新的作用域,其他的代碼塊(如if-elif-else、try-except、for/while等)不會引入新的作用域,也就是說這些語句內定義的變量,外部也可以訪問。4.7命名空間和作用域4.7.3全局變量和局部變量定義在函數內部的變量擁有一個局部作用域,定義在函數外的擁有全局作用域。局部變量只能在其被聲明的函數內部訪問,全局變量可以在整個程序范圍內訪問。局部變量和全局變量都不能被函數中出現在它之前的代碼訪問。函數內部的局部變量會覆蓋同名的函數外的全局變量。如果要在內部作用域修改外部作用域的變量,要用到global和nonlocal關鍵字。第4章函數和模塊4.8匿名函數4.8匿名函數所謂匿名,即不使用def語句這樣標準的形式定義函數。在Python中使用lambda表達式創(chuàng)建匿名函數。lambda只是一個表達式,看起來只能寫一行,不是一個代碼塊,只能在表達式中封裝有限的邏輯;lambda有自己的命名空間,不能訪問自己參數列表之外或全局命名空間中的參數;lambda函數的語法只包含一個語句:lambda[arg1[,arg2,...,argn]]:expressionsum=lambdaarg1,arg2:arg1+arg2#調用sum函數print("相加后的值為:",sum(10,20))print("相加后的值為:",sum(20,20))###################################輸出結果:相加后的值為:30相加后的值為:40第4章函數和模塊4.9內置函數4.9內置函數內置函數就是Python提供的可以直接使用的函數,一般使用頻率比較頻繁或者是元操作,比如print()、input()等。截止Python3.6.2,一共提供了68個內置函數。分類如下表所示。4.9內置函數1.

數字相關bool()int()float()complex()

bin()otc()hex()max()min()abs()divmode()round()pow()sum()2.

數據結構相關list()tuple()reversed()slice()str()format()bytes()ord()chr()ascii()repr()dict()set()frozenset()len()sorted()enumerate()all()any()zip()filter()map()bytearray()

3.

面向對象相關object()classmethod()staticmethod()isinstance()issubclass()property()setattr()getattr()hasattr()delattr()super()vars()type()

4.

作用域相關locals()globals()

5.

迭代器/生成器相關range()next()iter()

6.

字符串類型代碼執(zhí)行eval()exec()compile()

7.

輸入輸出input()print()

8.

內存相關hash()id()

9.

其他open()__import__()help()callable()dir()memoryview()

第4章函數和模塊4.10模塊4.10模塊模塊是一個包含所有定義的函數和變量的文件,其后綴名是.py。要使用模塊中的函數,需要事先用import導入。4.10.1導入模塊和函數語法如下:不管執(zhí)行多少次import,一個模塊只會被導入一次。這樣可以防止模塊被重復導入。如果經常使用一個函數,可以賦一個本地的名稱:importmodule1[,module2[,...moduleN]print_f=support.print_funcprint_f("lsy")4.10模塊4.10.2指定別名如果模塊名字太長,可以用as指定簡短的別名。其語法為:例如:from語句可以導入指定部分到當前命名空間。語法如下:例如:importmodule_nameasnew_nameimportcatascc.eat(‘fish’)frommodulenameimportname1[,name2,…,nameN]fromcatimport*eat(‘fish’)4.10模塊4.10.3常用模塊介紹序號模塊名描述1os對操作系統進行處理,包括文件目錄操作,文件操作的時間及系統環(huán)境變量的存取2glob提供了一個函數用于從目錄通配符搜索中生成文件列表3sys有關python運行環(huán)境的變量和函數4time提供與時間相關的函數5datetime重新封裝了time模塊,提供更多接口6re為高級字符串處理提供了正則表達式工具7math為浮點運算提供了對底層C函數庫的訪問8random用來獲得隨機數9json和pickle專門處理json格式的模塊10ElementTreepython的XML處理模塊,它提供了一個輕量級的對象模型。在Python2.5以后成為Python標準庫的一部分11hashlib提供字符加密功能,將md5和sha模塊整合到了一起,支持md5,sha1,sha224,sha256,sha384,sha512等算法12urllib.request用于處理從urls接收的數據13smtplib用于發(fā)送電子郵件14zlib,gzip,bz2,zipfile,以及tarfile數據壓縮15logging內置的標準模塊,主要用于輸出運行日志,可以設置輸出日志的等級、日志保存路徑、日志文件回滾等16subprocessPython2.4中新增的一個模塊,它允許你生成新的進程,連接到它們的input/output/error管道,并獲取它們的返回碼17configparser用來解析配置文件的模塊,并且內置方法和字典非常接近18shutil對os中文件操作的補充,高級的文件、文件夾、壓縮包處理

溫馨提示

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

評論

0/150

提交評論