函式物件:
函式物件指的是函式可以被當做』資料』來處理,具體可以分為四個方面的使用,我們如下:
函式可以被引用:
>>> defadd(x,y):
...
return x+y
...
>>> func=add
>>> func(1,2)
3
函式可以作為容器型別的元素:
>>> dic=>>>dic
>>> dic['
add'](1,2)
3
函式可以作為引數傳入另外乙個函式:
>>> deffoo(x,y,func):
...
return
func(x,y)
...>>> foo(1,2,add)
3
函式的返回值可以是乙個函式:
defbar():
return
add
func=bar()
func(1,2)
3
閉與包基於函式物件的概念,可以將函式返回到任意位置去呼叫,但作用域的關係是在定義完函式時就已經被確定了的,與函式的呼叫位置無關。
x=1deff1():
deff2():
(x)
return
f2def
f3():
x=3f2=f1() #
呼叫f1()返回函式f2
f2() #
需要按照函式定義時的作用關係去執行,與呼叫位置無關
f3()
#結果為1
也就是說函式被當做資料處理時,始終以自帶的作用域為準。若內嵌函式包含對外部函式作用域(而非全域性作用域)中變數的引用,那麼該』內嵌函式』就是閉包函式,簡稱閉包(closures)
x=1defouter():
x=2def
inner():
(x)
return
inner
func=outer()
func()
#結果為2
可以通過函式的closure屬性,檢視到閉包函式所包裹的外部變數
>>> func.__closure__(,)>>> func.__closure__
[0].cell_contents
2
「閉」代表函式是內部的,「包」代表函式外』包裹』著對外層作用域的引用。因而無論在何處呼叫閉包函式,使用的仍然是包裹在其外層的變數。
閉包的用途
目前為止,我們得到了兩種為函式體傳值的方式,一種是直接將值以引數的形式傳入,另外一種就是將值包給函式
importrequests
#方式一:
defget(url):
return
requests.get(url).text
#方式二:
defpage(url):
defget():
return
requests.get(url).text
return get
#get('
')get(
'')get(
'')……#
python=page('
')python()
python()
python()
……
閉包函式的這種特性有時又稱為惰性計算。使用將值包給函式的方式,在接下來的裝飾器中也將大有用處
python 閉包函式 python函式物件和閉包
一 函式物件 函式物件指的是函式可以被當做 資料 來處理,具體可以分為四個方面的使用,我們如下 1.1 函式可以被引用 def add x,y return x y func add func 1,2 1.2 函式可以作為容器型別的元素 dic dicdic add 1.3 函式可以作為引數傳入另外...
函式物件和閉包
1.引用 func f1 print f1 f1 print func func func 2.當作容器類元素 lt f1,1,2,3 print lt 0 lt 0 print f1 f1 lt 0 3.當作函式引數 def f2 f2 f1 print f2 f1 f2 f1 f2 f1 f2 ...
12 函式物件和閉包函式
1 可以被賦值 func 記憶體位址 deffunc print from func f func 2 可以當成變數 deffunc return 3def foo x print x foo func 記憶體位址 3 可以當成返回值 deffunc return 3def foo x return...