IT培訓(xùn)網(wǎng)
IT在線學(xué)習(xí)
1、閉包函數(shù)的概念
閉包函數(shù)的語法格式如下:
def 外部函數(shù)名(外參數(shù)):
函數(shù)體(包含外局部變量)
def 內(nèi)部函數(shù)名(內(nèi)參數(shù)):
函數(shù)體(引用外局部變量或外參數(shù))
return 內(nèi)部函數(shù)名
由此可知,閉包函數(shù)是函數(shù)嵌套中內(nèi)函數(shù)可引用外函數(shù)的局部變量或參數(shù)的函數(shù)。在閉包函數(shù)中,外部函數(shù)的返回值是內(nèi)部函數(shù)名。
假設(shè)有一個(gè)登錄界面,需要記錄登錄次數(shù)。要實(shí)現(xiàn)登錄功能,首先定義login()函數(shù),這個(gè)函數(shù)有兩個(gè)參數(shù),第一個(gè)參數(shù)是用戶名,第二個(gè)參數(shù)是密碼。接著對用戶名和密碼進(jìn)行判斷,如果用戶名和密碼均正確,那么登錄成功,否則登錄失敗。在登錄功能的基礎(chǔ)上記錄登錄次數(shù),則需要在login()函數(shù)中定義一個(gè)變量,用于記錄登錄次數(shù),每次判斷成功后登錄次數(shù)加1。這樣做是得不到正確的登錄次數(shù)的,這是因?yàn)榇藭r(shí)登錄次數(shù)是函數(shù)內(nèi)的局部變量,隨著函數(shù)執(zhí)行完畢后釋放內(nèi)存,這樣沒有辦法一直使用這個(gè)局部變量。
要解決這個(gè)問題,可以使用閉包函數(shù),代碼如下:
- >>> def login(name, pwd):
- ... i = 0
- ... def fun():
- ... if name == 'admin' and pwd == '123456':
- ... nonlocal i
- ... i += 1
- ... print('歡迎登錄,這是您第%d次登錄' % i)
- ... else:
- ... print('登錄失。')
- ... return fun
- ...
- >>> f = login('admin', '123456')
- >>> f()
- 歡迎登錄,這是您第1次登錄
- >>> f()
- 歡迎登錄,這是您第2次登錄
在外部函數(shù)login()中已經(jīng)定義了變量i,而在內(nèi)部函數(shù)fun()中需要修改變量i的值,則需要在內(nèi)部函數(shù)fun()中使用關(guān)鍵字nolocal修飾變量i。
2、閉包函數(shù)的案例
下面介紹一個(gè)閉包函數(shù)的案例。使用閉包函數(shù)實(shí)現(xiàn)Bob與Will聊天功能,打印聊天記錄以及談話人說的是第幾句話。為了實(shí)現(xiàn)上述功能,設(shè)計(jì)一下編程思路:首先創(chuàng)建一個(gè)閉包函數(shù)person(),然后調(diào)用兩次閉包函數(shù),實(shí)現(xiàn)打印目的。需要注意的是,記錄說話次數(shù)的變量需要使用關(guān)鍵字nonlocal修飾。代碼如下:
- def person(name):
- n = 0
- def do(something):
- nonlocal n
- n += 1
- print('{} say:{} {}的第{}句話'.format(name, something, name, n))
- return do
- Bob = person('Bob')
- Will = person('Will')
- Bob('I am Bob!')
- Will('I am Will!')
- Bob('早上好,Will!')
- Will('早上好,Bob!')
建議將這個(gè)程序使用腳本模式運(yùn)行,運(yùn)行結(jié)果:
- Bob say:I am Bob! Bob的第1句話
- Will say:I am Will! Will的第1句話
- Bob say:早上好,Will! Bob的第2句話
- Will say:早上好,Bob! Will的第2句話
上述程序中,首先定義一個(gè)外部函數(shù)person(),參數(shù)為name,用于接收名字。然后定義一個(gè)內(nèi)部函數(shù)do(),參數(shù)為something,用于接收聊天內(nèi)容。內(nèi)部函數(shù)do()結(jié)束后,外部函數(shù)person()的return返回值是內(nèi)部函數(shù)名do。在do()函數(shù)中,使用format()方法打印輸出誰說了什么內(nèi)容。在這個(gè)程序中,關(guān)鍵是要記錄這是談話人說的第幾句話,需要將變量n初始化設(shè)在外部函數(shù)中,并在內(nèi)部函數(shù)中使用關(guān)鍵字nonlocal修飾變量n。實(shí)現(xiàn)了閉包函數(shù)后,定義2個(gè)閉包,分別傳入?yún)?shù)Bob和Will,并將返回值分別保存在變量Bob和Will中。由于外部函數(shù)的返回值是內(nèi)部函數(shù)名do,因此,Bob('I am Bob!')等價(jià)于調(diào)用內(nèi)部函數(shù)do('I am Bob!')。do()函數(shù)中,變量n先增加1,記錄是第幾句話,然后是一個(gè)打印語句,使用format()方法格式化打印字符串。下面3行代碼的功能也與這行代碼相同。
如果對Python開發(fā)感興趣或者想要深入學(xué)習(xí)的現(xiàn)在可以免費(fèi)領(lǐng)取學(xué)習(xí)大禮包哦(點(diǎn)擊領(lǐng)取80G課程資料 備注:領(lǐng)資料)。
>>本文地址:http://liujunjsxg.cn/zhuanye/2020/61385.html
聲明:本站稿件版權(quán)均屬中公教育優(yōu)就業(yè)所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
1 您的年齡
2 您的學(xué)歷
3 您更想做哪個(gè)方向的工作?