二 閉包函式
函式物件指的是函式可以被當做』資料』來處理,具體可以分為四個方面的使用
>>
>
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
def
bar():
return add
func=bar(
) func(1,
2)3
閉:封閉
包:包裹
簡而言之:外部函式把內部函式包裹起來,內部函式處於封閉狀態,內部函式引用了外部函式中的變數
def
outter()
: name =
'有dnf玩家嗎,我來自跨二,id:是兄弟砍我吧'
definner()
:# 外層函式包了個內層函式
print
(name)
# 內層函式引用了外層函式的變數
return inner # 外層函式返回內層函式的位址
f = outter(
)# 用f變數來接收inner函式的位址f()
# 呼叫inner()函式
print
(f.__closure__)
# (,)
"""判斷閉包函式的方法:__closure__內建屬性,輸出結果包含:,則說明此函式是乙個閉包函式
"""
基於函式物件的概念,可以將函式返回到任意位置去呼叫,但作用域的關係是在定義完函式時就已經被確定了的,與函式的呼叫位置無關。
x=
1deff1(
):deff2()
:print
(x)return f2
deff3()
: x=
3 f2=f1(
)#呼叫f1()返回函式f2
f2()#需要按照函式定義時的作用關係去執行,與呼叫位置無關
f3()
#結果為1
也就是說函式被當做資料處理時,始終以自帶的作用域為準。若內嵌函式包含對外部函式作用域(而非全域性作用域)中變數的引用,那麼該』內嵌函式』就是閉包函式,簡稱閉包(closures)
x=
1def
outer()
: x=
2def
inner()
:print
(x)return inner
func=outer(
)func(
)# 結果為2
可以通過函式的closure屬性,檢視到閉包函式所包裹的外部變數
>>
> func.__closure__
(:int
object at 0x10028cca0
>,)
>>
> func.__closure__[0]
.cell_contents
2
「閉」代表函式是內部的,「包」代表函式外』包裹』著對外層作用域的引用。因而無論在何處呼叫閉包函式,使用的仍然是包裹在其外層的變數。
目前為止,我們得到了兩種為函式體傳值的方式,一種是直接將值以引數的形式傳入,另外一種就是將值包給函式
import requests
#方式一:
defget
(url)
:return requests.get(url)
.text
#方式二:
defpage
(url)
:def
get():
return requests.get(url)
.text
return get
get(
'')get(
'')get(
'')……
python=page(
'')python(
)python(
)python()……
閉包函式的這種特性有時又稱為惰性計算。使用將值包給函式的方式,在接下來的裝飾器中也將大有用處
函式物件和閉包
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 ...
物件 巢狀和閉包函式
func 記憶體位址 def func print from func f func print f,func f def foo x x func的記憶體位址 print x x func foo func foo func的記憶體位址 def foo x x func的記憶體位址 return ...
函式物件 閉包
python一切皆物件,函式也可以看成是乙個函式物件。函式將作為乙個返回物件在另乙個函式中返回。def calc a,b c a b return c res calc 10,20 print res 乙個內部的函式引用了外部函式的變數,這種語法結構就形成了閉包 def calc test args...