Python核心編程與應用 課件 【ch05】函數(shù)_第1頁
Python核心編程與應用 課件 【ch05】函數(shù)_第2頁
Python核心編程與應用 課件 【ch05】函數(shù)_第3頁
Python核心編程與應用 課件 【ch05】函數(shù)_第4頁
Python核心編程與應用 課件 【ch05】函數(shù)_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Python核心編程與應用函數(shù)第五章新工科·數(shù)據(jù)科學與大數(shù)據(jù)系列01用戶自定義函數(shù)用戶自定義函數(shù)01函數(shù)的定義deffunctionname(parameters):"函數(shù)文檔字符串"function_suitereturn[expression]def:定義函數(shù)的關(guān)鍵字。functionname:函數(shù)名,用戶自定義的名字,命名規(guī)則與變量名相同,本質(zhì)上是變量。parameters:參數(shù)列表,需要傳遞給函數(shù)的數(shù)據(jù)或者條件。函數(shù)_文檔字符串:通常說明函數(shù)的功能和使用方法。functionsuite:函數(shù)功能體,若為空,則只需要寫上pass語句。expression:函數(shù)返回值。用戶自定義函數(shù)01函數(shù)的定義【例5-2】通過time模塊,輸出系統(tǒng)當前的準確時間。importtimedefshow_time():print(time.asctime())show_time()【例5-3】調(diào)用系統(tǒng)模塊訪問當前文件夾下的文件清單。importosdefget_file():forf

inos.list

dir('.'):print(f)get_file()

#調(diào)用函數(shù)用戶自定義函數(shù)01函數(shù)的調(diào)用函數(shù)的定義僅僅是聲明了一個函數(shù),真正的執(zhí)行發(fā)生在函數(shù)調(diào)用時,如show_time()、get_file()。自定義函數(shù)完成后,調(diào)用函數(shù)的方法與Python內(nèi)建函數(shù)的調(diào)用完全一樣,使用函數(shù)名加括號,如print(),調(diào)用時可以有參數(shù)也可以沒有參數(shù)。書寫時注意必須先定義函數(shù),然后才可以調(diào)用該函數(shù)?!纠?-4】自定義函數(shù)實現(xiàn)兩個數(shù)相加。#定義函數(shù)my_funcdefmy_func():print("thisismycustomfunction")#定義函數(shù)adddefadd():numl=int(input('pleaseenteranumber:'))num2=int(input('pleaseenteranumber:'))print('{}+{}={}'.format(num,num2,num1+num2))用戶自定義函數(shù)01函數(shù)的調(diào)用#函數(shù)調(diào)用add()my_func()運行結(jié)果:pleaseenteranumber:18pleaseenteranumber:1918+19=37thisismycustomfunction用戶自定義函數(shù)01函數(shù)的返回當函數(shù)體運行到retumn語句時,就返回到函數(shù)調(diào)用處,不再執(zhí)行retum后面的代碼。如果函數(shù)沒有retumn語,執(zhí)行完函數(shù)體最后一條語句后就返回None?!纠?-6】顯示今天是工作日或休息日。importdatetimedefget_day_of_week():dow=datetime.date.weekday(datetime.date.today())ifdowinrange(5):return'工作日'else:return'休息日'print(get_day_of_week())02函數(shù)實參傳遞函數(shù)實參傳遞02形參和實參函數(shù)定義時參數(shù)列表中的參數(shù)叫形式參數(shù),是用于接收外部數(shù)據(jù)的占位符。函數(shù)調(diào)用時給定的參數(shù)為實參,用于傳遞數(shù)據(jù)給形參?!纠?-7】與某人打招呼。defshow_hello(name):

#name是形參print('hello',name)showhello('xiaoming')

#'xiaoming'是實參運行結(jié)果:helloxiaoming函數(shù)調(diào)用時,把實參'xiaoming'傳遞給形參name。當實參為不同的人名時,就實現(xiàn)了與不同人打招呼。函數(shù)實參傳遞02形參和實參【例5-8】求兩數(shù)相加。defadd(num1,num2):

#形參num1、num2,只是占位符print('{}+{}={}'.format(numl,num2,num1+num2))add(12,3)

#調(diào)用時實參和形參一一對應運行結(jié)果:12+3=15注意:形參num1num2只是占位符,函數(shù)定義時是沒有值的,當調(diào)用函數(shù)add(12,3)時才把實參12傳遞給num1實參3傳遞給num2,然后程序的流程就轉(zhuǎn)入執(zhí)行add()函數(shù),運行完print()函數(shù)后返回。調(diào)用時,實參和形參從左到右一一對應傳遞值。函數(shù)實參傳遞02可變參數(shù)與不可變參數(shù)(1)不可變參數(shù)函數(shù)執(zhí)行后不會影響實參的值?!纠?-9】通過函數(shù)交換數(shù)據(jù)。defswap(num1,num2):num1,num2=num2,num1print('num1={},num2={}'.format(num1,num2))m,n=12,3swap(m,n)print('num1=[},num2=[}.format(m,n))運行結(jié)果:num1=3,num2=12num1=12,num2=3調(diào)用函數(shù)swap(m,n)時,實參m、n的值為12和3,整數(shù)是不可變對象,所以即便函數(shù)體內(nèi)修改了num1和num2的值,函數(shù)返回后,num1和num2的值保持不變。函數(shù)實參傳遞02可變參數(shù)與不可變參數(shù)(2)可變參數(shù)函數(shù)參數(shù)如果是可變類型,有可能在函數(shù)內(nèi)部直接影響函數(shù)外部的變量[例5-11]在列表中增加元素。defadd(names,name):names.append(name)print(names)names=['xiao','ming']add(names,'ramm')add(names,'derek')print(names)運行結(jié)果:['xiao','ming','ramm']['xiao','ming','ramm','derek']['xiao','ming','ramm','derek']因為列表是可變對象,所以在函數(shù)體內(nèi)改變了names列表對象后,函數(shù)返回后發(fā)現(xiàn)函數(shù)外的names列表對象也改變了。函數(shù)實參傳遞02參數(shù)傳遞類型(1)必備參數(shù)調(diào)用函數(shù)時,實參的個數(shù)和位置均需和形參相對應,既不能多也不能少,所以為必備參數(shù)。當需要傳遞多個實參時可以用序列替代,如seg是元組,*seq表示拆分元組,也稱為解包,把元組中的元素作為參數(shù)輸入。【例5-12】求兩數(shù)相減defsub(num1,num2):print('{}-{}={}.format(num1,num2,numl-num2))sub(12,3)sub(*(3,12))運行結(jié)果:12-3-93-12=-9函數(shù)調(diào)用sub(*(3,12))等價于sub(3,12),*表示拆分序列。函數(shù)實參傳遞02參數(shù)傳遞類型(2)關(guān)鍵字參數(shù)當參數(shù)比較多時,實參、形參按順序一一對應容易出現(xiàn)位置的差錯,關(guān)鍵字參數(shù)允許按名稱傳遞對應的參數(shù),即用參數(shù)名匹配替代位置匹配,因此使用關(guān)鍵字參數(shù)允許實參和形參的順序不一致?!纠?-13】輸出一串姓名。defget_fullname(firstname,lastname,middlename):print('{}{}{}'.format(firstname,middlename,lastname))get_fullname(firstname='ramm',middlename='derek',lastname='dxy')運行結(jié)果:rammderekdxy因為給定了參數(shù)名,所以實參順序firstname、middlename、lastmame與形參順序firstname、lastname、middlename可以不一樣。函數(shù)實參傳遞02參數(shù)傳遞類型(3)默認參數(shù)有些參數(shù)一般直接使用默認值,特殊情況下才需要傳值,這樣的參數(shù)被稱為默認參數(shù)?!纠?-16】根據(jù)單價、數(shù)量和折扣計算付款金額,默認不打折。defcount_money(price,count,discount=1.0):

#discount是默認參數(shù)print(price*count*discount)count_money(100,10)

#discount使用歌認值10count_money(100,10,0.8)

#discount使用實參值08運行結(jié)果:1000.0800.0注意:默認參數(shù)必須放在參數(shù)列表的最后,如果參數(shù)列表中出現(xiàn)了默認值,那么其后的所有參數(shù)都必須是默認值。函數(shù)實參傳遞02參數(shù)傳遞類型(4)可變長參數(shù)形參前面加上了*或**,將成為可變長參數(shù)。*args:表示形參個數(shù)可變,以元組方式接收數(shù)據(jù)。**kwargs:表示形參個數(shù)可變,以字典方式接收數(shù)據(jù)【例5-17】求序列中所有元素的和。defget_total(*args):

#*args表示參數(shù)個數(shù)任意print(sum(args))get_total(*(1,2,3,4))

#或者gettotal(1,2,3,4),參數(shù)以元組的方式傳遞運行結(jié)果:10函數(shù)實參傳遞02參數(shù)傳遞類型(5)函數(shù)參數(shù)函數(shù)也可以作為參數(shù)進行傳遞,實現(xiàn)函數(shù)的嵌套調(diào)用?!纠?-19】函數(shù)作為參數(shù)。defcalculator(func,numl,num2):

#形參func是函數(shù)名func(num1,num2)defadd(num1,num2):print(numl+num2)calculator(add,12,3)

#add是函數(shù),在此作為參數(shù)傳遞。注意add后面沒有()運行結(jié)果:1503函數(shù)不定長參數(shù)函數(shù)不定長參數(shù)03*var_args_tuple參數(shù)其基本語法如下:deffunction_name([formal_args,]*var_args_tuple):'函數(shù)文檔字符串'function_suitereturn[expression]根據(jù)語法格式,*varargstuple參數(shù)寫在正常參數(shù)的后面。【例5-20】向好朋友逐個打招呼defshow_hello(*names):

#*names表示可接收元組或列表fornameinnames:

#names是可迭代對象print('hello',name)show_hello('xiao','ming','ramm','derek')show_hello(('xiao','ming','ramm','derek'))show_hello(*('xiao','ming','ramm','derek'))函數(shù)不定長參數(shù)03*var_args_tuple參數(shù)運行結(jié)果:helloxiaohellominghellorammhelloderekhello('xiao','ming','ramm','derek')helloxiaohellominghellorammhelloDerek程序中寫了三種調(diào)用的方法,第一種和第三種調(diào)用的結(jié)果一樣,都是傳遞了4個參數(shù),即元組前加“*”表示元組解包,成為單個的參數(shù)。第二種調(diào)用方法showhello(('xiao','ming','ramm','derek'))表示只傳遞了一個參數(shù)(元組)給函數(shù)。函數(shù)不定長參數(shù)03*kwargs參數(shù)**kwargs參數(shù)是另一種不定長參數(shù),用于接收鍵值對,實參需用關(guān)鍵字參數(shù)?!纠?-23】用鍵值對方法顯示個人信息。defgree(**kwargs):

#kwargs是字典對象forkey,valueinkwargs.items():print('[}=[}.format(key,value))gree(name='xiaoming',age=18,gender=False)

#用關(guān)鍵字參數(shù)作實參運行結(jié)果:name=xiaomingage=18gender=False上例是用關(guān)鍵字參數(shù)作實參,與形參的字典對象匹配。注意:*args和**kwargs參數(shù)的書寫順序,在函數(shù)中,若同時使用標準參數(shù)、*args、**kwargs三種參數(shù),則按如下順序書寫:fnc(arg,*args,**kwargs),即先是必選參數(shù),再是以元組或列表形式的不定長參數(shù),最后是字典形式的不定長參數(shù)。Pvthon解釋器以這個順序依次匹配。函數(shù)不定長參數(shù)03不定長參數(shù)舉例【例5-24】顯示商品的類別名稱。northwindjson中的數(shù)據(jù)來自知名的示例數(shù)據(jù)庫,是一家貿(mào)易公司的供銷存系統(tǒng),其中的商品數(shù)據(jù)如圖5-2所示。#需要該腳本文件的同級目錄中存在northwindjson文件import

jsondefshow_categories(*cnames):print('所有類別名稱如下:',end='')fornameincnames:print(name,end='

')#測試代碼print('測試')show_categories(飲料類,調(diào)味品,水果)運行結(jié)果:測試所有類別名稱如下:飲料類調(diào)味品水果函數(shù)不定長參數(shù)03不定長參數(shù)舉例當要讀取真實數(shù)據(jù)時,將測試代碼修改為以下真實數(shù)據(jù)代碼。#獲取真實數(shù)據(jù)時withopen('northwind.json',r')

as

f:data=json.loads(f.read())categories=tuple({p['類別]

forp

indata})show_categories(*categories)運行結(jié)果:所有類別名稱如下,奶制品果醬水果和蔬菜罐頭飲料點心谷類土豆片/快餐湯焙烤食品果和堅果意大利面食調(diào)味品谷類/麥片肉罐頭說明:ip['類別']forpidata)是集合推導式,即獲取所有商品的類別。04函數(shù)調(diào)用和嵌套函數(shù)調(diào)用和嵌套04函數(shù)的返回值函數(shù)通過retum語返回結(jié)果。代碼執(zhí)行時遇到retum語,將終止函數(shù)內(nèi)部代碼的執(zhí)行,退出并返回數(shù)據(jù)到函數(shù)調(diào)用處,若return后沒有返回值,則默認返回None?!纠?-26】利用函數(shù)求加法運算defadd(numl,num2):returnnum1+num2print('1+2+3={}'.format(add(add(1,2),3)))運行結(jié)果:1+2+3=6函數(shù)add(1,2)的返回值再次作為參數(shù)調(diào)用add()函數(shù),實現(xiàn)函數(shù)的重復調(diào)用。函數(shù)調(diào)用和嵌套04多次調(diào)用函數(shù),實現(xiàn)代碼復用以圖書管理為例,常用的功能模塊有查找圖書和新增圖書,對應的功能拆解為:①根據(jù)標題查找圖書getby_title(title);②新增圖書addbook(titleauthor,price);③批量新增圖書addbooks(*books)。根據(jù)需求,規(guī)定新增圖書前,需要根據(jù)標題查找該圖書,如果不存在,那么新增該圖書;當批量新增圖書時,可以重復調(diào)用新增一本圖書的函數(shù)?!纠?-28】查找和新增圖書。①初始化圖書集合books=[dict(title='紅樓夢',author='曹雪芹',price=10),dict(title='西游記',author='吳承恩',price=20),dict(title='水滸傳',author='施耐',price=30),dict(title='三國演義',author='羅貫中',price=40)]函數(shù)調(diào)用和嵌套04多次調(diào)用函數(shù),實現(xiàn)代碼復用②根據(jù)標題查找圖書,若找到,則返回圖書信息,否則返回Nonedefget_by_title(title):forbinbooks:ifb['title']==title:returnbprint(get_by_title('三國演義'))print(get_by_title('三國志'))

#沒找到,返回None運行結(jié)果:{'title':'三國演義','author':'羅貫中','price':40}None函數(shù)調(diào)用和嵌套04多次調(diào)用函數(shù),實現(xiàn)代碼復用③新增圖書。新增前先判斷圖書是否存在,不存在則增加。defadd_book(t,a,p):ifnotget_by_title(t):books.append(dict(title=t,author=a,price=p))add_book('python','guido',40)

#新增圖書print(get_by_title('python'))運行結(jié)果:['title':'python','author':'guido','price':40)函數(shù)調(diào)用和嵌套04多次調(diào)用函數(shù),實現(xiàn)代碼復用④批量新增圖書時,只需重復調(diào)用新增單一圖書的方法defadd_books(bs):forb

inbs:add_book(b['title'],b['author'],b['price'])add_books([{'title':'白雪公主','author':'安徒生','price':10}{'title':'灰姑娘','author':'安徒生','price':20}{'title':'海的女兒','author':'格林','price':30}])print(books)程序運行后,將三本新書白雪公主、灰姑娘、海的女兒都加入了books列表。函數(shù)調(diào)用和嵌套04函數(shù)嵌套聲明Python除了在函數(shù)中調(diào)用其他函數(shù),即嵌套調(diào)用外,還允許在函數(shù)中再定義函數(shù),即嵌套定義?!纠?-29】函數(shù)套聲明。defouter_func():print('thisisfromouterfunction')definnerfunc():print('thisisfrominnerfunction')inner_func()outer_func()運行結(jié)果:thisisfromouterfunctionthisisfrominnerfunction注意:函數(shù)可以嵌套定義,但不能交叉定義,即不能在外部函數(shù)和內(nèi)部函數(shù)之間相互調(diào)用否則會引發(fā)死循環(huán)。05變量的作用域變量的作用域05變量的作用域變量作用域指的是變量的有效范圍或者變量能被訪問的范圍。變量只能在有效的作用范圍內(nèi)被訪問。變量創(chuàng)建后,其作用域就確定了?!纠?-33】函數(shù)內(nèi)創(chuàng)建的變量只能被函數(shù)內(nèi)的代碼訪問。deffunc():name='xiaoming'print(name)運行結(jié)果:NameError:name'name'isnotdefined系統(tǒng)報錯,因為變量name只能在函數(shù)func()內(nèi)部訪問。變量的作用域05變量作用域法則(1)變量賦值Python中所有變量都是在第一次賦值時創(chuàng)建,作用域也隨之確定。變量只有賦值后才能被應用。(2)函數(shù)內(nèi)的所有變量的作用域僅限該函數(shù)內(nèi)具體含義包括:①函數(shù)內(nèi)定義的變量,只能被函數(shù)內(nèi)的代碼使用,不能在函數(shù)外部引用這些變量。②函數(shù)內(nèi)定義的變量與函數(shù)外的變量同名,代表兩個不同的變量,遵循本地優(yōu)先原則。③函數(shù)內(nèi)的代碼可以引用函數(shù)外的變量,前提是函數(shù)內(nèi)沒有對該變量賦過值。④函數(shù)內(nèi)的變量作用域,只有在函數(shù)內(nèi)代碼執(zhí)行時才能訪問。變量的作用域05變量作用域法則(3)函數(shù)定義的本地作用域和程序模塊定義的全局作用域的關(guān)系①每個模塊(即一個Pvthon文件)都有一個全局作用域。②全局作用域的作用范圍僅限單個文件。③每次對函數(shù)調(diào)用都創(chuàng)建一個新的本地作用域。④被賦值的變量除非聲明為全局或者非本地變量,否則都是本地變量。(4)Python變量名搜索和解析Python查找一個變量,遵循LEGB原則:本地作用域L(Local)上一層結(jié)構(gòu)中的本地作用域E(Enclosing)全局作用域G(Global)內(nèi)置作用域B(Built-in)。Python以L一E-GB的規(guī)則查找變量,即:在局部找不到,會去局部外的局部找,再找不到,會去全局找,最后去內(nèi)置中找,如果還找不到,就提示變量不存在錯誤,如圖5-3所示。變量的作用域05變量作用域法則變量的作用域05全局變量全局變量位于模塊文件頂層,其作用域為全文件,若想在函數(shù)內(nèi)部修改這個全局變量的值,方法是用關(guān)鍵字global在函數(shù)內(nèi)部聲明變量為全局變量。定義全局變量的語法格式如下global變量名1,變量名2,···【例5-39】全局變量使用舉例。下面4段代碼顯示了全局變量的使用方法,注意它們的區(qū)別代碼1:x=99

#此X為全局變量deffunc():X=100

#此X為局部變量print(x)

#運行結(jié)果:99func()print(x)

#運行結(jié)果:99變量的作用域05nonlocal語句nonlocal的含義是非本地,即所聲明的變量不在本地查找,去上一層函數(shù)體中查找。所以,nonlocal使用在嵌套函數(shù)中,不能用在頂層函數(shù)中,且聲明的變量必須已經(jīng)創(chuàng)建?!纠?-40】nonlocal使用舉例下面四段代碼顯示了nonlocal變量的使用方法,注意它們的區(qū)別代碼一:deffunc1():x=100deffunc2():x=200print(x)#運行結(jié)果:100func2()print(x)#運行結(jié)果:100func1()注意:func1中的x和func2中的x各自獨立,在各自的命名空間中,是兩個不同的變量。變量的作用域05nonlocal語句nonlocal語句小結(jié):①nonlocal語句必須使用在嵌套函數(shù)中,聲明變量為非本地變量。②用nonlocal說明的變量需要去上一層函數(shù)中查找此變量。③用nonlocal說明的變量必須在上一層函數(shù)中已經(jīng)定義過,即賦過值。④通常只有在子函數(shù)中想修改上一層函數(shù)的變量時,才使用nonlocal說明該變量。⑤使用nonlocal理論上可以加快變量的搜索速度。06偏函數(shù)和高階函數(shù)偏函數(shù)和高階函數(shù)06改造標準函數(shù)為自定義函數(shù)int()函數(shù)可以把字符串轉(zhuǎn)換為整數(shù),當僅輸入字符串時,int()函數(shù)默認按十進制轉(zhuǎn)換,如int(12345=12345,將字符串12345轉(zhuǎn)為十進制數(shù)值12345。int()函數(shù)還有一個base參數(shù),默認值為10。如果傳入base參數(shù),那么可以進行N進制轉(zhuǎn)十進制的運算。如int(10101base-2)表示將二進制字符串10101轉(zhuǎn)換為十進制數(shù),結(jié)果為21。同理,int(123458)把八進制轉(zhuǎn)十進制,結(jié)果為5349。假設(shè)需要重復轉(zhuǎn)換二進制字符串,每次調(diào)用int(x,base=2)時,必須傳入?yún)?shù)based=2,非常麻煩,這時可以定義一個int2()函數(shù),默認傳入?yún)?shù)base=2?!纠?-42】設(shè)置默認值參數(shù)。def

int2(x,base=2):

#設(shè)置默認值參數(shù)returnint(x,base)print(int2('10010'))

#函數(shù)調(diào)用運行結(jié)果:18偏函數(shù)和高階函數(shù)06偏函數(shù)Python的functools模塊提供了很多有用的函數(shù)工具其中包括偏函數(shù)functools.partial創(chuàng)建的偏函數(shù)imnt20)比自定義的函數(shù)imt2)更加方便?!纠?-43】創(chuàng)建偏函數(shù)。import

functoolsint2=functools.partial(int,base=2)

#創(chuàng)建一個偏函數(shù)int2print(int2('10000000'),int2('1010101'))運行結(jié)果:12885所以,functoolspartial的作用是通過設(shè)置默認參數(shù)的方法把一個函數(shù)的某些參數(shù)固定,然后返回一個新的函數(shù),調(diào)用這個新函數(shù)使應用更簡單。在創(chuàng)建偏函數(shù)時,實際上可以接收更多的默認參數(shù),使用*args和**kw接收不定長的參數(shù)。偏函數(shù)和高階函數(shù)06高階函數(shù)高階函數(shù)是把函數(shù)作為參數(shù)傳入,或者將函數(shù)作為返回值的一種函數(shù)表達方式。Python中,函數(shù)本身就是一個可變數(shù)據(jù)類型,指向一個對象,所以函數(shù)名就是變量名。變量可以指向函數(shù),還可以把函數(shù)作為實參傳遞給形參。(1)指向函數(shù)的變量指向函數(shù)的變量表示函數(shù)本身賦值給變量,變量即指向了該函數(shù)。(2)函數(shù)名作為變量使用(3)函數(shù)名作為實參傳遞把函數(shù)名作為實參傳遞給形參,也稱傳入函數(shù)。(4)map()函數(shù)map()函數(shù)是映射函數(shù),可接收兩個參數(shù):函數(shù)和可選代對象(iterable)。map()函數(shù)將傳入的函數(shù)依次作用到可迭代對象的每個元素,把結(jié)果作為新的可迭代對象返回。偏函數(shù)和高階函數(shù)06高階函數(shù)(5)reduce()函數(shù)reduce()函數(shù)的作用是把一個函數(shù)(假設(shè)為累加)作用在一個序列[x1,x2,x3]上,執(zhí)行時,先從x1、x2兩個參數(shù)開始,得到累加結(jié)果,然后繼續(xù)與x3元素累加,依次類推,直至全部元素累加完。寫成數(shù)學格式就是:reduce(f,[x1,x2,x3,x4])=f(f(f(x1,x2),x3),x4)(6)filter()函數(shù)filter()函數(shù)是過濾函數(shù)把傳入的函數(shù)依次作用于每個元素,根據(jù)返回值是True還是False來決定保留還是丟棄該元素。與map0)函數(shù)不同,filter()函數(shù)不僅把函數(shù)映射到每一個元素,還決定元素的去留,返回的結(jié)果也只是元素本身。(7)sorted()函數(shù)sorted()函數(shù)可以對list列表排序,默認升序,也可以使用參數(shù)reverse改為降序。07匿名函數(shù)匿名函數(shù)07所謂匿名,就是沒有名字,匿名函數(shù)就是定義一個沒有函數(shù)名的函數(shù)。Python用lambda表達式創(chuàng)建匿名函數(shù),語法格式如下:lambda

參數(shù)1,參數(shù)2,···:表達式lambda表達式的含義:對給定的若參數(shù)用后面的表達式進行計算并返回值。lambda表達式創(chuàng)建的匿名函數(shù)只能包含一條語句,沒有retum語,函數(shù)返回值就是表達式的值。lambda表達式由三部分組成:①關(guān)鍵字lambda;②參數(shù),多個參數(shù)之間用“,”分隔;③表達式,參數(shù)與表達式之間用“:”分隔。匿名函數(shù)07lambda的參數(shù)類型lambda表達式的參數(shù)相當于函數(shù)的形參,寫函數(shù)時可以沒有形參,也可以有很多不同形式的形參。lambda

參數(shù)1,參數(shù)2,···:表達式lambda表達式中參數(shù)的形式(假設(shè)有a、b兩個以及其他參數(shù))如下。a,b:必備參數(shù)。a=1,b=2:默認值參數(shù)。*args:元組形式的不定長參數(shù)**kwargs:字典形式的不定長參數(shù)。a,b=1*args:多種類型混合使用的參數(shù)空:無參數(shù)。匿名函數(shù)07lambda的表達式類型lambda參數(shù)1,參數(shù)2,·.·:表達式該表達式是lambda的返回值,前面默認省略了一個關(guān)鍵字return。表達式類型如下:①1,字面值常量;②None,空值;③a+b,運算表達式;④sum(a),返回函數(shù)值;⑤1if

a>10

else

0,返回邏輯判斷的結(jié)果。【例5-63】表達式類型為字面值常量。func=Lambda:'Helloxiaoming'print(func())運行結(jié)果:Helloxiaoming08遞歸函數(shù)遞歸08遞歸與循環(huán)有一定的相似之處,循環(huán)是在滿足條件時重復執(zhí)行代碼塊,而遞歸是滿足條件時重復執(zhí)行自身。所以遞歸是自我調(diào)用,常常用在函數(shù)中構(gòu)成遞歸函數(shù),遞歸函數(shù)就是直接或間接地調(diào)用自身的函數(shù)。函數(shù)遞歸時,為了避免無限地調(diào)用自身而陷入死機,必須有一個遞歸結(jié)束條件。Python在處理遞歸調(diào)用時要用到一個特殊的數(shù)據(jù)結(jié)構(gòu):棧棧是函數(shù)或程序運行時系統(tǒng)為其分配的一段內(nèi)存區(qū)域,具有后進先出的特性。棧的空間大小受系統(tǒng)內(nèi)存空間大小的限制,因為函數(shù)遞歸調(diào)用意味著每調(diào)用自身一次,就在內(nèi)存復制一份該函數(shù),所以Python有一個可用的遞歸深度的限制,以避免耗盡計算機中的內(nèi)存,默認深度是1000。遞歸08【例5-76】計算斐波那契數(shù)列斐波那契數(shù)列又稱為黃金分割數(shù)列,指的是這樣一個數(shù)列:1、1、2、3、5、8、13、21···,它的遞歸定義如下求解fb(n)的值需要求解fib(n-1)fib(n-2)而要求解fib(n-1)需要求解fib(n-2)fib(n-3);同理,求解fib(n-2)需要求解fib(n-3)fib(n-4),依次遞推,直至求fib(2)=fib(1)+fib(0),而fib(1)-1,fib(0)-1是已知的,再從fib(1)fib(0)回推得到fib(2),根據(jù)fib(2)fib(1)回推得到fib(3),一路回推得到fib(4)、fib(5),直至fib(n)。這就是求斐波那契數(shù)列的遞歸思想。遞歸08程序如下:deffoo(n):ifn==1or

n==0:

#遞歸出口return1returnfoo(n-1)+foo(n-2)

#遞歸print(foo(30))運行結(jié)果:1346269遞歸的優(yōu)點:遞歸使代碼看起來更加整潔、優(yōu)雅,可以將復雜任務(wù)分解成更簡單的子問題。遞歸的缺點:遞歸的邏輯很難調(diào)試、遞歸算法解題的運行效率較低。在遞歸調(diào)用的過程中系統(tǒng)開辟了棧來存儲每層的返回點、

溫馨提示

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

評論

0/150

提交評論