Python程序設計基礎與實戰課件_第1頁
Python程序設計基礎與實戰課件_第2頁
Python程序設計基礎與實戰課件_第3頁
Python程序設計基礎與實戰課件_第4頁
Python程序設計基礎與實戰課件_第5頁
已閱讀5頁,還剩38頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第10章函數的高級特性迭代器和生成器匿名函數內置高階函數實戰15:答題闖關挑戰裝飾器實戰16:驗證用戶登錄信息了解迭代器和生成器的用法掌握匿名函數的用法理解高階函數的概念掌握常用的高階函數掌握裝飾器的概念和使用10.1迭代器和生成器迭代器規則創建生成器創建迭代器生成器表達式10.1迭代器和生成器10.1.1迭代器規則for循環可以對可迭代對象進行迭代,其中可迭代對象是指具有__iter__()方法的對象。而迭代器對象不僅擁有__iter__()方法,還具有__next__()方法,當調用__next__()方法時,迭代器會返回它的下一個值。當迭代器沒有值可以返回時,就會拋出StopIteration異常。可以用迭代器對象理解for循環的運行原理:for循環調用in后對象的__iter__()方法,將可迭代對象轉換為迭代器對象;調用迭代器對象的__next__()方法,將得到的返回值賦給in前面的變量,再執行循環體中的代碼;循環往復,直到取完迭代器中的值,自動捕捉StopIteration異常結束循環。10.1迭代器和生成器10.1.1迭代器規則list01=[1,2,3,4]foriteminlist01:print(item,end="")1234list01=[1,2,3,4]iterator=list01.__iter__()#將可迭代對象轉化為迭代器對象whileTrue:try:item=iterator.__next__()#不斷獲取迭代器對象的下一個值print(item,end="")#打印值exceptStopIteration:#當從迭代器對象中取不到值時,捕獲到StopIteration異常,結束循環Break1234for循環遍歷列表對for循環過程進行分解列表可以存放多個數據,通過索引也能獲取到每個值,那為什么還要有迭代器呢?迭代器規則的關鍵是什么呢?10.1迭代器和生成器10.1.2創建迭代器如果數據過多,將所有數據存入列表中,會占用大量內存。然而,迭代器能夠使用一個值時才去獲取一個值,不像列表一次性獲取所有的值,節約內存,更簡單優雅。classVector:def__init__(self,start,end):self.start=startself.end=enddef__iter__(self):returnself#返回對象本身def__next__(self):ifself.start<=self.end:number=self.startself.start+=1returnnumber#返回迭代器對象下一個的值else:raiseStopIteration#當迭代器中的值取完后,拋出異常v1=Vector(3,9)foriteminv1:print(item,end="")運行結果如下:345678910.1迭代器和生成器10.1.3創建生成器在Python中,函數中使用了yield語句即為生成器函數。當一個生成器函數被調用時,它返回一個稱為生成器的迭代器,該生成器控制生成器函數的執行。生成器是特殊的迭代器,不過,生成器的語法要比以上講解的迭代器簡潔。10.1迭代器和生成器10.1.3創建生成器list01=[2,3,19,34,12]defgenerator(alist):#定義生成器函數foriteminalist:ifitem%2==0:yielditemg01=generator(list01)#調用生成器函數foriteming01:#遍歷生成器print(item,end="")23412生成器獲得列表中所有的偶數10.1迭代器和生成器10.1.3創建生成器classVector:def__init__(self,start,end):self.start=startself.end=enddefget_num(self):whileTrue:ifself.start>self.end:breaknumber=self.startself.start+=1yieldnumberv1=Vector(3,9)foriteminv1.get_num():print(item,end="")3456789生成器產生連續數字10.1迭代器和生成器10.1.4生成器表達式list01=[2,3,19,34,12]g01=(itemforiteminlist01ifitem%2==0)#生成器表達式foriteming01:#遍歷生成器print(item,end="")23412list01=[2,3,19,34,12]g01=(itemforiteminlist01ifitem%2==0)#生成器表達式list02=list(g01)print(list02)[2,34,12]生成器表達式以圓括號為標志,結構類似于列表推導式。生成器可以通過list()函數轉化為列表形式10.2匿名函數函數作為參數匿名函數的使用10.2匿名函數10.2.1函數作為參數一個函數可以作為參數傳入另一個函數defoutput():print("打印一句話")defdisplay(func):func()display(output)打印一句話10.2匿名函數10.2.1函數作為參數defcondition1(item):#條件1:篩選偶數returnitem%2==0defcondition2(item):#條件2:大于10returnitem>10defcondition3(item):#條件3:能被3整除returnitem%3==0defchange_list(alist,condition):#處理列表的生成器函數foriteminalist:ifcondition(item):yielditemlist01=[12,22,43,55,9,33]l1=change_list(list01,condition1)#生成一個生成器l1foriteminl1:print(item)1222處理列表數據,得到列表中的偶數、大于10的數以及能被3整除的數像條件1、2、3這種只有一行代碼的函數能夠簡化嗎?——需要用到匿名函數10.2匿名函數10.2.2匿名函數的使用匿名函數是指沒有名稱的、臨時使用的微函數,用lambda表達式進行聲明。lambda參數列表:表達式其中“參數列表”表示函數的參數,“表達式”表示函數體。匿名函數的函數體中只能包含一個表達式,具備return語句的作用,計算結果作為函數的返回值。匿名函數中不能含有賦值語句等復雜的語句,但在表達式中可以調用其它函數。func=lambdax:f"得到的值為{x}"print(func(1))得到的值為1第1行代碼相當于:deffunc(x):returnf"得到的值為{x}"10.2匿名函數10.2.2匿名函數的使用defchange_list(alist,condition):foriteminalist:ifcondition(item):yielditemlist01=[12,22,43,55,9,33]l1=change_list(list01,lambdaitem:item%2==0)foriteminl1:print(item)1222使用匿名函數處理列表數據,得到列表中的偶數10.3內置高階函數filter()函數map()函數sorted()函數10.3內置高階函數10.3.1filter()函數filter()函數可以對可迭代對象進行過濾操作filter(function,iterable)function為函數名,也可以是匿名函數,function的返回值是布爾值,用于過濾可迭代對象iterable。function的返回值是True時,留下可迭代對象中的元素,否則過濾掉元素。filter()函數的返回值是迭代器對象,迭代器對象中為過濾后的元素,可以遍歷獲取,也可以用list()函數轉化為列表。list01=[1,2,3,4,5,6]f1=filter(lambdax:x%2==0,list01)foriteminf1:print(item,end="")24610.3內置高階函數10.3.2map()函數map()函數用于對可迭代對象中的每一個元素進行同一操作,返回對每一個元素處理后的結果,返回值是一個迭代器。map(function,iterable,...)function為函數名,也可以是匿名函數。map()函數的返回值是迭代器對象,迭代器對象中為function函數處理后的返回值,可以遍歷獲取,也可以用list()函數轉化為列表。list01=[1,2,3,4,5,6]m1=map(lambdax:x**2,list01)print(list(m1))[1,4,9,16,25,36]10.3內置高階函數10.3.2map()函數map()函數可以接受多個可迭代對象并進行處理,多個迭代對象會同時進行處理,當最短的可迭代對象處理完成后,處理終止。需要注意的是,迭代對象的個數需要與函數的參數保持一致。list01=[1,2,3,4]list02=[5,6,7]m1=map(lambdax,y:x**2+y**2,list01,list02)print(list(m1))[26,40,58]10.3內置高階函數10.3.3sorted()函數sorted()函數可以對所有可迭代對象進行排序,返回一個包含可迭代對象中所有元素升序排列的新列表。sorted(iterable,*,key=None,reverse=False)iterable表示可迭代對象,*表示其后的參數必須要采用關鍵字傳參的形式傳入。key代表一個帶參數的函數,可以是匿名函數,默認值為None,用于從iterable中選擇要排序的內容。reverse表示一個布爾值,當其值設置為True時,將會得到倒序排列的數據。student_list=[{"name":"小千","age":19},{"name":"小鋒","age":17},{"name":"小獅","age":18},]sort_list=sorted(student_list,key=lambdax:x["age"])print(sort_list)[{'name':'小鋒','age':17},{'name':'小獅','age':18},{'name':'小千','age':19}]10.4實戰15:答題闖關挑戰10.4實戰15:答題闖關挑戰第一關:定義學生類Student,設置屬性姓名、性別和分數,并重寫__str__()方法classStudent:def__init__(self,name,sex,score):=nameself.sex=sexself.score=scoredef__str__(self):returnf"學生姓名:{},性別:{self.sex},分數:{self.score}"10.4實戰15:答題闖關挑戰第二關:定義學生管理類StudentManager,設置屬性學生列表,用于添加Student類的對象。在StudentManager類中加入__iter__()和__next__()方法,使得此類的對象成為迭代器對象,可以循環遍歷獲取其中的Student對象。classStudent:def__init__(self,name,sex,score):=nameself.sex=sexself.score=scoredef__str__(self):returnf"學生姓名:{},性別:{self.sex},分數:{self.score}"classStudentManager:def__init__(self):self.number=-1self.student_list=[]defadd_student(self,student):self.student_list.append(student)def__iter__(self):returnselfdef__next__(self):ifself.number<len(self.student_list)-1:self.number+=1returnself.student_list[self.number]else:raiseStopIteration10.4實戰15:答題闖關挑戰第三關:創建StudentManager類的對象student_class,并向其屬性self.student_list中添加Student類對象,添加完成后,遍歷student_classclassStudent:"""與前文定義相同,此處省略"""classStudentManager:"""與前文定義相同,此處省略"""student_class=StudentManager()student_class.add_student(Student("小千","男",90))student_class.add_student(Student("小鋒","女",89))student_class.add_student(Student("小獅","男",87))student_class.add_student(Student("小明","女",93))foriteminstudent_class:print(item)學生姓名:小千,性別:男,分數:90學生姓名:小鋒,性別:女,分數:89學生姓名:小獅,性別:男,分數:87學生姓名:小明,性別:女,分數:9310.4實戰15:答題闖關挑戰第四關:對第三關的student_class中的Student對象按照分數進行排序,使用sorted()函數。classStudent:

"""與前文定義相同,此處省略"""classStudentManager:

"""與前文定義相同,此處省略"""student_class=StudentManager()student_class.add_student(Student("小千","男",90))student_class.add_student(Student("小鋒","女",89))student_class.add_student(Student("小獅","男",87))student_class.add_student(Student("小明","女",93))sort_student=sorted(student_class,key=lambdaitem:item.score)foriteminsort_student:print(item)學生姓名:小獅,性別:男,分數:87學生姓名:小鋒,性別:女,分數:89學生姓名:小千,性別:男,分數:90學生姓名:小明,性別:女,分數:9310.4實戰15:答題闖關挑戰第五關:篩選出第三關student_class中性別為女的Student對象,使用filter()函數。classStudent:

"""與前文定義相同,此處省略"""classStudentManager:

"""與前文定義相同,此處省略"""student_class=StudentManager()student_class.add_student(Student("小千","男",90))student_class.add_student(Student("小鋒","女",89))student_class.add_student(Student("小獅","男",87))student_class.add_student(Student("小明","女",93))filter_student=filter(lambdaitem:item.sex=="女",student_class)foriteminfilter_student:print(item)學生姓名:小鋒,性別:女,分數:89學生姓名:小明,性別:女,分數:9310.4實戰15:答題闖關挑戰第六關:將StudentManager類中的__iter__()和__next__()方法去掉,改為生成器函數的形式。classStudent:def__init__(self,name,sex,score):=nameself.sex=sexself.score=scoredef__str__(self):returnf"學生姓名:{},性別:{self.sex},分數:{self.score}"classStudentManager:def__init__(self):self.number=-1self.student_list=[]defadd_student(self,student):self.student_list.append(student)defstudent_generator(self):foriteminself.student_list:yielditemstudent_class=StudentManager()student_class.add_student(Student("小千","男",90))student_class.add_student(Student("小鋒","女",89))student_class.add_student(Student("小獅","男",87))student_class.add_student(Student("小明","女",93))foriteminstudent_class.student_generator():print(item)print("student_class中的Student對象按照分數排序后:")sort_student=sorted(student_class.student_generator(),key=lambdaitem:item.score)foriteminsort_student:print(item)print("篩選出student_class中性別為女的Student對象:")filter_student=filter(lambdaitem:item.sex=="女",student_class.student_generator())foriteminfilter_student:print(item)10.5裝飾器閉包創建裝飾器帶參數的裝飾器10.5裝飾器10.5.1閉包返回值是函數的函數屬于高階函數deffunc01():print("func01()函數")deffunc02():print("func02()函數")returnfunc01func=func02()func()func02()函數func01()函數將func01()函數定義在func02()函數的內部,能夠直接調用func01()嗎?10.5裝飾器10.5.1閉包將func01()函數定義在func02()函數的內部deffunc02():print("func02()函數")deffunc01():print("func01()函數")returnfunc01func=func02()func()func02()函數func01()函數10.5裝飾器10.5.1閉包函數嵌套函數時,內部函數只能訪問外部函數的參數,不能進行修改。與函數的簡單嵌套不同,外部函數返回內部函數的函數名的情況下,就變得不一樣了deffunc02(x):deffunc01():returnx+2returnfunc01func=func02(1)print(func())3內部函數對外部函數參數進行操作的情況10.5裝飾器10.5.1閉包如果內部函數引用了外部函數的變量(包括其參數),并且外部函數返回內部函數名,這種函數架構稱為閉包。閉包必須滿足以下三個條件:內部函數的定義嵌套在外部函數中;內部函數引用外部函數的變量;外部函數返回內部函數名。def外部函數名(參數):外部變量def內部函數名(參數):使用外部變量return內部函數名10.5裝飾器10.5.2創建裝飾器deffunc02(func):deffunc01():x=func()returnx+1returnfunc01deffunc():print("func()函數")return1print(func())decorated=func02(func)print(decorated())deffunc02(func):deffunc01():returnfunc()+1returnfunc01deffunc():print("func()函數")return1func=func02(func)print(func())增加func()函數的功能簡化代碼運行結果:func()函數1func()函數2運行結果:func()函數210.5裝飾器10.5.2創建裝飾器裝飾器可以讓其它函數在不做修改的前提下增加額外功能。裝飾器的本質是一個嵌套函數,外部函數的參數是需要被裝飾的函數名,內部函數用于增加被裝飾函數的新功能。@符號可以將裝飾器函數與被裝飾函數聯系起來。deffunc02(func):deffunc01():returnfunc()+1returnfunc01@func02deffunc():print("func()函數")return1print(func())func()函數210.5裝飾器10.5.2創建裝飾器裝飾器可以裝飾有參數的函數deffunc02(func):deffunc01(a,b):returnfunc(a+1,b+1)returnfunc01@func02deffunc(a,b):print("func()函數")returna**2+b**2print(func(1,1))func()函數810.5裝飾器10.5.2創建裝飾器當被裝飾的函數中參數有多個時,裝飾器函數通常寫成以下形式。deffunc02(func):deffunc01(*args,**kwargs):需要添加的新功能returnfunc(與func()函數中的參數相對應)returnfunc01@func02deffunc(參數):函數體10.5裝飾器10.5.3帶參數的裝飾器裝飾器的本質是一個函數,也可以帶有參數,此時裝飾器需要再多一層內嵌函數。defouter(arg):deffunc02(func):deffunc01(x):print(arg)print("裝飾器發揮作用")returnfunc(x)**2returnfunc01returnfunc02@outer("這是一個帶參數的裝飾器")deffunc(x):print("調用func()函數")returnxprint(func(2))defouter(arg):deffunc02(func):deffunc01(x):print(arg)print("裝飾器發揮作用")returnfunc(x)**2returnfunc01returnfunc02deffunc(x):print("調用func()函數")returnxfunc02=outer("

溫馨提示

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

評論

0/150

提交評論