python 關於 函式物件與閉包
一、函式物件
在 Python 中萬物皆為物件,函式也不例外,函式作為物件可以賦值給一個變數、可以作為元素新增到集合物件中、可作為引數值傳遞給其它函式,還可以當做函式的返回值,這些特性就是第一類物件所特有的。
1、函式可以被引用
>>> def add(x,y):
... return x+y
...
>>> func=add
>>> func(1,2)
3
2、函式可以作為容器型別的元素
>>> dic={'add':add,'max':max}
>>> dic
{'add': , 'max': }
>>> dic['add'](1,2)
3
3、函式可以作為引數傳入另外一個函式
>>> def foo(x,y,func):
... return func(x,y)
...
>>> foo(1,2,add)
3
4、函式的返回值可以是一個函式
def bar():
return add
func=bar()
func(1,2)
3
5、應用案例
(1)最簡單的寫法
def login():
'''登入'''
print('登入成功')
def registry():
'''註冊'''
print('註冊成功')
def check_balance():
'''查詢餘額'''
print('餘額查詢成功')
def withdraw():
'''提現'''
print('提現成功')
print('''
1 登入
2 註冊
3 查詢餘額
4 提現
''')
choice = input('請輸入您要執行的操作編號:').strip()
if choice == '1':
login()
elif choice == '2':
registry()
elif choice == '3':
check_balance()
else:
withdraw()
缺點:如果函式很多,那麼冗餘太大,後期增加功能也不方便
(2)最佳化後的程式碼
def login():
'''登入'''
print('登入成功')
def registry():
'''註冊'''
print('註冊成功')
def check_balance():
'''查詢餘額'''
print('餘額查詢成功')
def withdraw():
'''提現'''
print('提現成功')
func = {
'0':('退出',None),
'1':('登入',login),
'2':('註冊',registry),
'3':('查詢餘額',check_balance),
'4':('提現',withdraw)
}
while True:
for i in func:
print(i,func[i][0])
choice = input('請輸入您要執行的操作編號:').strip()
if choice == '0':
break
elif choice not in func:
print('尊敬的使用者,您好!你需要執行的操作不存在,請重新選擇操作編號!')
continue 鄭州專業人流醫院
else:
func[choice][1]()
二、函式巢狀
再一個函式的函式體中又定義一個新函式。稱之為函式巢狀
1、應用案例一
對圓的所有操作函式我們都放進circle函式中去,透過指定action引數的值,從而來確定呼叫那個函式,執行那個操作(類似檔案處理中的指定r,w,a模式)。
2、閉包函式
(1)閉與包
函式被當做資料處理時,始終以本地的作用域為準。若內嵌函式包含對外部函式作用域(而非全域性作用域)中變數的引用,那麼該’內嵌函式’就是閉包函式,簡稱閉包(Closures)
x=1
def outer():
x=2
def inner():
print(x) #此處的x就是外部函式的變數x,因此inner為閉包函式
return inner
func=outer()
func() # 結果為2
可以透過函式的closure屬性,檢視到閉包函式所包裹的外部變數
>>> func.__closure__
(,)
>>> func.__closure__[0].cell_contents
2
“閉”代表函式是內部的,“包”代表函式外’包裹’著對外層作用域的引用。因而無論在何處呼叫閉包函式,使用的仍然是包裹在其外層的變數。
3、閉包函式的用途
目前為止,我們得到了兩種為函式體傳值的方式,一種是直接將值以引數的形式傳入,另外一種就是將值間接傳給閉包函式
import requests
#方式一:
def get(url):
return requests.get(url).text
#方式二:
def page(url):
def get():
return requests.get(url).text #url是外部函式的變數,因此get是閉包函式
return get
提示:requests模組是用來模擬瀏覽器向網站傳送請求並將頁面內容下載到本地,需要事先安裝:pip3 install requests
對比兩種方式,方式一在下載同一頁面時需要重複傳入url,而方式二隻需要傳一次值,就會得到一個包含指定url的閉包函式,以後呼叫該閉包函式無需再傳url
……
閉包函式的這種特性有時又稱為惰性計算。使用將值包給函式的方式,在接下來的裝飾器中也將大有用處。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2690410/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 函式物件、裝飾器、閉包函式函式物件
- 理解Python函式閉包Python函式
- 回撥函式 與 函式閉包函式
- Python 閉包函式說明Python函式
- Python基礎之閉包函式Python函式
- 函式閉包函式
- 3. 匿名函式與閉包函式
- 第一類物件(函式),閉包及迭代器物件函式
- JavaScript碎片———函式閉包(模擬物件導向)JavaScript函式物件
- js閉包與封閉函式與其他知識點JS函式
- Kotlin 之高階函式與Lambda表示式與閉包Kotlin函式
- go 閉包函式Go函式
- js函式閉包JS函式
- 閉包函式(匿名函式)的理解函式
- 關於Python閉包的一切Python
- 13. 閉包函式與裝飾器函式
- 函式閉包機制函式
- JS函式表示式——函式遞迴、閉包JS函式遞迴
- Python提高:關於閉包和裝飾器Python
- Golang閉包案例分析與普通函式對比Golang函式
- 【Go語言學習】匿名函式與閉包Go函式
- python關於函式形參Python函式
- Python程式執行緒協程GIL閉包與高階函式(五)Python執行緒函式
- 前端筆記之JavaScript(四)關於函式、作用域、閉包那點事前端筆記JavaScript函式
- python基礎知識之函式初階——閉包Python函式
- 『無為則無心』Python函式 — 35、Python中的閉包Python函式
- javascript變數物件函式呼叫棧作用域閉包等細解!JavaScript變數物件函式
- 給妹子講python-S01E19解析Python內嵌作用域與函式閉包Python函式
- JavaScript4:函式和閉包JavaScript函式
- 淺談匿名函式和閉包函式
- 立即執行函式(IIFE)&&閉包函式
- rust十三.1、匿名函式(閉包)Rust函式
- 【集合論】關係閉包 ( 關係閉包求法 | 關係圖求閉包 | 關係矩陣求閉包 | 閉包運算與關係性質 | 閉包複合運算 )矩陣
- 原型與原型鏈 - 物件與函式關係筆記原型物件函式筆記
- js中,函式的閉包、作用域跟[[Scopes]]的關係JS函式
- python closure閉包 lambda表示式Python
- 物件及函式相關物件函式
- Python學習之路26-函式裝飾器和閉包Python函式