一篇文章帶你深入學(xué)習(xí)Python函數(shù)
函數(shù)的特性:
- 函數(shù)是對象
- 函數(shù)可以刪除
- 函數(shù)名字和函數(shù)本身完全是分開的
- 函數(shù)因為是對象,可以結(jié)合數(shù)據(jù)結(jié)構(gòu)使用
- 函數(shù)因為是對象,可以作為函數(shù)參數(shù)
- 函數(shù)因為是對象,可以在嵌套在函數(shù)體內(nèi)
- 內(nèi)層函數(shù)對象能夠記憶住父函數(shù)的變量
- 所有的函數(shù)都是對象,但是所有的對象并不一定都是函數(shù)
對象成為函數(shù)需要實現(xiàn)__call__協(xié)議
函數(shù)是對象:
# 函數(shù)是對象:支持賦值操作。 def test1(n): print(f"hello, {n}!") # test1的函數(shù)名賦值給 new1 new1 = test1 new1("tom") # hello, tom!
函數(shù)可以刪除:
# 函數(shù)可以刪除 def test2(n): print(f"hello, {n}!") del test2 # test2("tom") # NameError: name 'test2' is not defined
函數(shù)名字和函數(shù)本身完全是分開的:刪除test3,不影響已經(jīng)賦值的new3的調(diào)用
# 函數(shù)名字和函數(shù)本身完全是分開的:刪除test3,不影響已經(jīng)賦值的調(diào)用 def test3(n): print(f"hello, {n}!") new3 = test3 del test3 new3("Jam") # hello, Jam!
函數(shù)因為是對象,可以結(jié)合數(shù)據(jù)結(jié)構(gòu)使用:
# 函數(shù)因為是對象,就可以結(jié)合數(shù)據(jù)結(jié)構(gòu)使用 def test4(n): print(f"hello, {n}!") data = [1, "a", {"name": "tom"}, test4] for i in data: from types import FunctionType if type(i) == FunctionType: test4("Lily") # hello, Lily!
函數(shù)因為是對象,可以作為函數(shù)參數(shù):
# 函數(shù)因為是對象,就可以作為函數(shù)參數(shù) def test5(n): print("原始函數(shù)執(zhí)行") print(f"hello, {n}") def new5(n): n("Golang") new5(test5) # 原始函數(shù)執(zhí)行 hello, Golang
函數(shù)因為是對象,可以在嵌套在函數(shù)體內(nèi):
# 函數(shù)因為是對象,可以在嵌套在函數(shù)體內(nèi) def test6(n): def inner1(m): new = m + "!!!" return new def inner2(m): new = m + "***" return new if n > 3: return inner2 else: return inner1 result6 = test6(3) print(result6("tom")) # tom!!!
內(nèi)層函數(shù)對象能夠記憶住父函數(shù)的變量:也稱為閉包
# 內(nèi)層函數(shù)對象能夠記憶住父函數(shù)的變量 def test7(n): def inner(m): return m + n return inner result7 = test7(7) print(result7(6)) # 13
所有的函數(shù)都是對象,但是所有的對象并不一定都是函數(shù):
# 所有的函數(shù)都是對象,但是所有的對象并不一定都是函數(shù) class A: pass a = A() def test8(): pass from types import FunctionType print(isinstance(a, A)) # True print(isinstance(test8, FunctionType)) # True print(isinstance(a, FunctionType)) # False 所有的對象并不一定都是函數(shù)
對象成為函數(shù)需要實現(xiàn)__call__協(xié)議:
# 對象成為函數(shù)需要實現(xiàn)__call__協(xié)議 class B: def __init__(self, n): self.n = n def __call__(self, m): return self.n + m b = B(9) print(b(9)) # 18
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
人工智能學(xué)習(xí)Pytorch張量數(shù)據(jù)類型示例詳解
這篇文章主要為大家介紹了人工智能學(xué)習(xí)Pytorch張量數(shù)據(jù)類型的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11python3 requests庫文件上傳與下載實現(xiàn)詳解
這篇文章主要介紹了python3 requests庫文件上傳與下載實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08Python如何使用Eel和HTML開發(fā)桌面應(yīng)用
這篇文章主要介紹了Python使用Eel和HTML開發(fā)桌面應(yīng)用問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01