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