python中的函式物件與閉包函式

2021-09-03 00:09:30 字數 3400 閱讀 5542

在python中,一切皆物件,函式也是物件

在python語言中,宣告或定義乙個函式時,使用語句:

def func_name(arg1,arg2,...):

func_suite

當執行流程遇到def語句時,會在記憶體中生成乙個函式物件。這個函式物件被定義為這個函式的名字。

當我們呼叫函式時就要指定函式的名字,通過函式名才能找到這個函式。

函式的**段在定義時是不會執行的,只有當這個函式被呼叫時,函式內部的**段才會被執行。

函式呼叫結束時,這個函式內部生成的所有資料都會被銷毀。

函式可以作為物件可以賦值給乙個變數,可以作為元素新增到集合物件中,可以作為引數值傳遞給其它函式,還可以當做函式的返回值被引用。

>>> def func():

... print("hello world")

...

>>> print(id(func))

140473814191912

>>> print(type(func))

>>> print(func)

>>> func()

hello world

如上所示,使用def語句來定義函式,func是函式名.

定義func這個函式後,函式裡面的列印語句並沒有執行,而是等待被呼叫 ,然後才會執行輸出語句。

使用id加函式名,可以列印func這個函式在記憶體中的身份位址;

使用type加函式名可以列印func這個函式的型別;

只輸入函式名,不加括號時,會輸出函式在記憶體中的位址;

只有輸入函式名加括號時,函式才會被呼叫。

把函式賦值給乙個變數時,就是把這個函式在記憶體中的位址繫結給這個變數,這樣引用這個變數時就是在呼叫這個函式

>>> def foo():

... print("hello world")

...>>> foo()

hello world

>>> f1=foo

>>> print(f1)

>>> print(foo)

>>> f1()

hello world

在這裡,定義乙個foo函式,函式的功能是列印"hello world"這名話,然後把foo函式賦值給f1這個變數,

分別列印f1這個變數和foo這個函式就會發現,它們指向的是同乙個記憶體位址.

使用f1變數名加括號就相當於是在呼叫foo這個函式

>>> def foo():

... print("hello world")

...

>>> def bar(func):

... print("hello python")

... func()

...

>>> foo()

hello world

>>> bar(foo)

hello python

hello world

在這裡先定義乙個foo函式,這個函式的作用是列印一行「hello world」

然後再定義乙個bar函式,bar函式會有乙個func的引數,在bar函式內部,列印「hello python」,然後引用func這個變數。

呼叫foo函式,輸出"hello world"

呼叫bar函式,foo函式會被當作引數傳遞到這裡,然後呼叫,輸出"hello world"和"hello python"

在函式內部呼叫並返回另乙個函式,或者函式的返回值是乙個函式時

>>> def foo():

... print("hello world")

...>>> def bar(func):

... return func

...>>> f1=bar(foo)

>>>

>>> print(f1)

>>> f1()

hello world

1.在函式內部定義乙個並呼叫這個函式

>>> name="egon"

>>> def f1(name):

... def f2():

... print("%s eat food"% name)

...

>>> def f1(name):

... def f2():

... print("%s eat food" %name)

... f2()

...

>>> f1(name)

egon eat food

2.在函式內部呼叫另乙個函式
>>> name="egon"

>>> def f1(name):

... print("%s eat food"%name)

...

>>> def f2(name):

... print("%s like python"%name)

... f1(name)

...

>>> f2(name)

egon like python

egon eat food

先定義乙個f1函式,然後定義函式f2,

在f2函式內部呼叫f1這個函式,然後再呼叫f2這個函式,得到返回值

在函式內部定義的函式,稱為內部函式.

內部函式包含對外部作用域,而非全域性作用域的變數的引用,這個內部函式稱為閉包函式

>>> item="linux"

>>> def func1():

... item="python"

... def func2():

... print(item)

... return func2

...

>>> func1()

.func2 at 0x7f246b2f9f28>

>>> f1=func1()

>>> f1()

python

在上面的例子中:

1.先乙個全域性變數item,item變數的值為"linux",

2.再定義乙個func1函式,在func1函式內部再定義乙個區域性變數item,

區域性變數item的值為"python".

3.然後在func1這個函式內部再宣告乙個函式func2,

此時func2這個函式就是乙個內部函式.

4.func2函式引用item變數,根據legb變數原則,func2這個內部函式會引用函式func1內部,func2外部的變數item,

所以返回func2這個內部函式時,呼叫func1這個外部函式,得到python這個值。

Python中的函式物件與閉包

函式在python中是第一類物件,可以當做引數傳遞給其他函式,放在資料結構中,以及作為函式的返回結果。下面的例子為接受另外乙個函式作為輸入並呼叫它 1 foo.py 2def callf func 3return func 使用上面的函式 1 import foo2 defhelloworld 3r...

python中的函式物件與閉包函式

在python中,一切皆物件,函式也是物件 在python語言中,宣告或定義乙個函式時,使用語句 def func name arg1,arg2,func suite當執行流程遇到def語句時,會在記憶體中生成乙個函式物件。這個函式物件被定義為這個函式的名字。當我們呼叫函式時就要指定函式的名字,通過...

Python 函式物件與閉包

函式物件指的是函式可以被當做 資料 來處理,具體可以分為四個方面的使用。def index print from index a index a def foo x,y,func print x,y func def bar print from bar foo 1,2,bar 1 2 from b...