當咱們在重複使用某一功能時,咱們可能會寫不少重複的代碼,例如咱們求圓的周長,當圓的直徑改變時,是否是咱們又要從新寫一遍計算過程呢?若是涉及到很複雜的過程,而下次使用僅僅改變參數,那麼咱們還有必要重複這一過程嗎?python
這時咱們能夠利用函數來解決這一問題。一個功能就像黑盒同樣,咱們不須要知道它是怎麼工做的,咱們只要知道接口(輸入,輸出)便可使用。編程
例如Python
的內置函數print
咱們只要知道它須要咱們提供哪些參數,以及它會給咱們怎樣的輸出便可。這就是所謂的抽象
,咱們不知道工做原理,但也能使用它。因此咱們能夠寫一個函數(黑盒),設置直徑爲輸入,周長爲輸出,當函數寫好後,咱們只要輸入直徑便可,不用考慮函數內部是如何計算的,咱們獲得輸出後,繼續作咱們想作的事情。ide
當咱們想作一道菜時,有人負責洗菜,有人切菜,有人炒菜,將這些人的工做合在一塊兒,就完成了作菜這個任務,這就是分解
的思想,咱們將這個任務當作是函數,許多函數在一塊兒完成了一件比較大的事情。函數
能夠簡單理解一塊可重複使用的代碼,咱們稱之爲函數(function)
,當咱們調用函數時,這個函數纔會執行。網站
如下是定義一個函數簡單的例子,注意函數內要有四個空格的縮進,若是沒有返回值的話,會默認返回None
:spa
#def是用來定義函數的關鍵字 #is_even是函數的名稱 #i是參數(參數能夠是任何類型) #三個引號括起來的是docstring #docstring下面的語句是函數體 #return後的是返回值 def is_even( i ): """ Input: i是一個正的int類型 Returns True 若是 i 是偶數, 不然返回 False """ print("inside is_even") return i%2 == 0 #調用函數,並用a接收返回值 a = is_even(2) print(a)
首先咱們先不涉及編程。高中的函數y = f(x)
,這個x就至關因而形參,指一種抽象,將咱們用f(3)
的時候,這個3
就是實參了,就是實際咱們使用的值,形參和實參大體就是這個意思,不要搞混了。例如:code
def f( x ):#x是形參 x = x + 1 print('in f(x): x =', x) return x #如下是調用函數 x = 3#初始化x z = f( x )#調用函數,傳入實參,將返回值給z
利用pythontutor
網站對代碼的執行進行可視化,我把全部步驟都截了下來,先看圖,右側反映了變量的變化狀況。blog
能夠看到函數內是一個做用域,外面是訪問不到的(通常狀況)。當進入一個函數時,一個新的做用域就被建立了。函數內的x
和外面的x
不是一個x
,x
是不可變量,這和以後的list
等數據類型不同,以後再說。接口
如下是是幾個例子,若是有不清楚,能夠進入 www.pythontutor.com(我推薦的代碼可視化網站)中嘗試運行。圖片
第一個例子,在外邊定義了一個x
,可是在f內又定義了一個x
,這兩個x
不是一個x
,函數內部使用的x
是函數內部定義的。
def f(y): x = 1 x += 1 print(x) x = 5 f(x) print(x)
第二個例子,在g
中使用的x
是外部定義的x
def g(y): print(x) print(x + 1) x = 5 g(x) print(x)
第三個例子,會報錯,不能在內部修改外部的值,UnboundLocalError: local variable 'x' referenced before assignment
def h(y): x += 1 x = 5 h(x) print(x)
參考了Mit 6.0001的課件