本篇內(nèi)容介紹了“怎么理解關(guān)于python函數(shù)對(duì)象與閉包”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括曲水網(wǎng)站建設(shè)、曲水網(wǎng)站制作、曲水網(wǎng)頁制作以及曲水網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,曲水網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到曲水省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!一、函數(shù)對(duì)象
在 Python 中萬物皆為對(duì)象,函數(shù)也不例外,函數(shù)作為對(duì)象可以賦值給一個(gè)變量、可以作為元素添加到集合對(duì)象中、可作為參數(shù)值傳遞給其它函數(shù),還可以當(dāng)做函數(shù)的返回值,這些特性就是第一類對(duì)象所特有的。
1、函數(shù)可以被引用
>>> def add(x,y):
... return x+y
...
>>> func=add
>>> func(1,2)
3
2、函數(shù)可以作為容器類型的元素
>>> dic={'add':add,'max':max}
>>> dic
{'add': , 'max': }
>>> dic['add'](1,2)
3
3、函數(shù)可以作為參數(shù)傳入另外一個(gè)函數(shù)
>>> def foo(x,y,func):
... return func(x,y)
...
>>> foo(1,2,add)
3
4、函數(shù)的返回值可以是一個(gè)函數(shù)
def bar():
return add
func=bar()
func(1,2)
3
5、應(yīng)用案例
(1)最簡(jiǎn)單的寫法
def login():
'''登錄'''
print('登錄成功')
def registry():
'''注冊(cè)'''
print('注冊(cè)成功')
def check_balance():
'''查詢余額'''
print('余額查詢成功')
def withdraw():
'''提現(xiàn)'''
print('提現(xiàn)成功')
print('''
1 登錄
2 注冊(cè)
3 查詢余額
4 提現(xiàn)
''')
choice = input('請(qǐng)輸入您要執(zhí)行的操作編號(hào):').strip()
if choice == '1':
login()
elif choice == '2':
registry()
elif choice == '3':
check_balance()
else:
withdraw()
缺點(diǎn):如果函數(shù)很多,那么冗余太大,后期增加功能也不方便
(2)優(yōu)化后的代碼
def login():
'''登錄'''
print('登錄成功')
def registry():
'''注冊(cè)'''
print('注冊(cè)成功')
def check_balance():
'''查詢余額'''
print('余額查詢成功')
def withdraw():
'''提現(xiàn)'''
print('提現(xiàn)成功')
func = {
'0':('退出',None),
'1':('登錄',login),
'2':('注冊(cè)',registry),
'3':('查詢余額',check_balance),
'4':('提現(xiàn)',withdraw)
}
while True:
for i in func:
print(i,func[i][0])
choice = input('請(qǐng)輸入您要執(zhí)行的操作編號(hào):').strip()
if choice == '0':
break
elif choice not in func:
print('尊敬的用戶,您好!你需要執(zhí)行的操作不存在,請(qǐng)重新選擇操作編號(hào)!')
continue鄭州專業(yè)人流醫(yī)院 http://4g.zyfuke.com/
else:
func[choice][1]()
二、函數(shù)嵌套
再一個(gè)函數(shù)的函數(shù)體中又定義一個(gè)新函數(shù)。稱之為函數(shù)嵌套
1、應(yīng)用案例一
對(duì)圓的所有操作函數(shù)我們都放進(jìn)circle函數(shù)中去,通過指定action參數(shù)的值,從而來確定調(diào)用那個(gè)函數(shù),執(zhí)行那個(gè)操作(類似文件處理中的指定r,w,a模式)。
2、閉包函數(shù)
(1)閉與包
函數(shù)被當(dāng)做數(shù)據(jù)處理時(shí),始終以本地的作用域?yàn)闇?zhǔn)。若內(nèi)嵌函數(shù)包含對(duì)外部函數(shù)作用域(而非全局作用域)中變量的引用,那么該’內(nèi)嵌函數(shù)’就是閉包函數(shù),簡(jiǎn)稱閉包(Closures)
x=1
def outer():
x=2
def inner():
print(x) #此處的x就是外部函數(shù)的變量x,因此inner為閉包函數(shù)
return inner
func=outer()
func() # 結(jié)果為2
可以通過函數(shù)的closure屬性,查看到閉包函數(shù)所包裹的外部變量
>>> func.__closure__
(,)
>>> func.__closure__[0].cell_contents
2
“閉”代表函數(shù)是內(nèi)部的,“包”代表函數(shù)外’包裹’著對(duì)外層作用域的引用。因而無論在何處調(diào)用閉包函數(shù),使用的仍然是包裹在其外層的變量。
3、閉包函數(shù)的用途
目前為止,我們得到了兩種為函數(shù)體傳值的方式,一種是直接將值以參數(shù)的形式傳入,另外一種就是將值間接傳給閉包函數(shù)
import requests
#方式一:
def get(url):
return requests.get(url).text
#方式二:
def page(url):
def get():
return requests.get(url).text #url是外部函數(shù)的變量,因此get是閉包函數(shù)
return get
提示:requests模塊是用來模擬瀏覽器向網(wǎng)站發(fā)送請(qǐng)求并將頁面內(nèi)容下載到本地,需要事先安裝:pip3 install requests
對(duì)比兩種方式,方式一在下載同一頁面時(shí)需要重復(fù)傳入url,而方式二只需要傳一次值,就會(huì)得到一個(gè)包含指定url的閉包函數(shù),以后調(diào)用該閉包函數(shù)無需再傳url
……
閉包函數(shù)的這種特性有時(shí)又稱為惰性計(jì)算。使用將值包給函數(shù)的方式,在接下來的裝飾器中也將大有用處。
“怎么理解關(guān)于python函數(shù)對(duì)象與閉包”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!