014 函式物件和閉包

2021-10-11 21:11:38 字數 2452 閱讀 1054

二 閉包函式

函式物件指的是函式可以被當做』資料』來處理,具體可以分為四個方面的使用

>>

>

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...