標籤:

Python的函數是第一類對象(函數特性總結)

本文對Python中的函數做了一個系統的總結。但涉及到的有一些概念並不會具體展開。

前段時間我在學習閉包,而後又接觸了裝飾器。我在學習裝飾器時經常被函數的嵌套搞的暈頭轉向——不都說Python好學,可這裝飾器為啥這麼難懂/(ㄒoㄒ)/~~。後來通過了解,我認識到了問題出在函數身上,對於它的某些特性我還是非常陌生。痛定思痛之後我系統的學習了函數,也就有了下面的這篇文章。

plus:如果你還不了解閉包或者裝飾器,那麼這篇文章也能為你了解它們做個鋪墊。

1.第一類對象

說到函數不得不先引出這個概念。

維基百科上的定義是這樣的:第一類對象(英語:First-class object)在計算機科學中指可以在執行期創造並作為參數傳遞給其他函數或存入一個變數的實體。將一個實體變為第一類對象的過程叫做「物件化」(Reification)

定義是不是看不懂,沒事,下面給出第一類對象的性質,並分別作介紹(介紹完你就清楚了):

第一類對象

  • 可以被存入變數或其他結構
  • 可以被作為參數傳遞給其他函數
  • 可以被作為函數的返回值
  • 可以在執行期創造,而無需完全在設計期全部寫出
  • 即使沒有被繫結至某一名稱,也可以存在

1.1.可以被存入變數或其他結構

Python中的函數可以被賦值給變數。你可以像使用其他變數一樣使用函數。

def f1(): passa = f1 # 建立了a對函數f1的一個引用 a() 被引用的函數也可以是內建函數:b = abs()

函數可以被存放於容器之中,在python中這類容器變數有list,tuple,set,dict。

def f1(): passdef f2(): passa,b = [f1, f2] # 函數f1,f2存在在列表中,並分別被變數a,b引用

1.2.可以被作為參數傳遞給其他函數

def foo(func): print("Hello") func()def func(): print("world")foo(func) Helloworld

1.3.可以被作為函數的返回值

def foo(func): print("Hello") return funcdef func(): print("world")foo(func)Hello<function __main__.func>

1.4.可以在執行期創造,而無需完全在設計期全部寫出

def f1(): x = 1 def f2(): print(x) return f2a = f1()a() # 1# 函數f1內嵌套了函數f2,當執行f1時,f2才被定義。

1.5.即使沒有被繫結至某一名稱,也可以存在

最典型的例子莫過於lambda函數了。

>>>lambda x:x*x <function __main__.<lambda>>a = lambda x:x*xa(2) # 4

# 2.函數是第一類對象

你可以發現,上面我舉的例子中都是以函數作為例子,沒錯,在Python中,函數是第一類對象

如果你接觸過C或其他編程語言,你就會發現,Python中的函數擁有這些編程語言所不具有的可作為參數,可作為返回值,可以嵌套等特性。這也解釋了為什麼Python能夠支持像裝飾器這樣的強大功能。

知道了這些,你再去了解閉包,裝飾器,相信就會輕鬆的多了。

推薦閱讀:

使用python驗證socks5
如何學習SDN中的編程部分(python)?
怎樣才算是大神級代碼?
opencv庫的python版為啥比c++版小這麼多?是功能有區別嗎?
Python進階課程筆記(四)

TAG:Python |