什麼是函數
在數學上,函數的定義爲從定義域到值域的映射。例如,將2映射到4,3映射到9,4映射到16,等等。在python中也有很多函數,如python中自帶的內置函數,以及通過import從其它庫中引用的一些函數。除此之外你還可以自己編寫一個用戶自定義函數。
那麼函數有什麼用呢?我們在程序設計中把世間萬物都當作一個個類來看待,如果說通過類把事物在計算機中抽象出來了,那麼函數則讓這類事物動起來活起來了。只要是有相同共性的一系‘列行爲動作’我們就可以將其劃分到一個函數中去,這樣做的目的就是儘量讓這類事物的活動更加的簡便。而且也可以代碼重用,避免了重複勞動,提高工作效率。
舉個例子,當我們抽象出一輛車的時候,我們可以爲其編寫一個啓動函數,那麼在調用時只需 xx車.啓動() 即可,具體如何啓動,這些都是函數要做的事情了。
當然如果想更深刻的理解它,還需要不斷地去積累,寫的多了,碼的多了,自然就無師自通了,所以學無止境。
變量
變量在本質上就是一個佔位符在python中我們命名變量時,變量名儘量小寫, 如有多個單詞,用下劃線隔開:
count = 0
student_name = ''
函數
命名規範
函數名一律小寫,如有多個單詞,用下劃線隔開:
def sum():
a+=b
def add_function():
pass
私有函數在函數前加一個下劃線_
class Person():
def _private_func():
pass
函數結構
讓我們先來看一下定義函數的格式:
def 函數名(參數1,參數2,...參數n):
函數體(語句塊)
說了這麼多還不如直接來個例子實在,
- 函數簽名(signature) 意思就是告知計算機,這裏要聲明一個函數,這個函數叫harmonic,需要一個n變量。
- 函數名稱(function name) 函數的名字
- 形式參數變量(parameter variable) 就是個佔位位置,因爲後面計算要用到一個變量,但這個變量是多少不知道,所以先找一個符號代替一下。當函數被調用時會傳入一個參數給n,當函數結束時,n也隨着函數的結束而銷燬,所以n只是走個形式而已。
- 局部變量(local variable) 在函數內部定義使用。隨函數運行結束而銷燬。
- return 語句 用於將控制權返回到程序的調用點。
- 返回值(return value) 返回函數的計算結果。可沒有。
在使用的時候我們僅需要調用該函數,將返回值綁定到一個變量上,即可。
sum = harmonic(100)
print(sum)
# 輸出結果
5.187377517639621
函數文檔
程序在大多數情況下是給人看的,只是偶爾被機器執行一下。所以在編程中要養成一個好習慣——寫註釋。那麼如何寫註釋呢?
規範的函數說明是寫在函數簽名後面。
def sum():
'''我們可以將函數說明寫在這裏'''
pass
是不是很神奇,在使用時我們能看到在函數定義中的函數說明,這對於大量開發過程中又便於瞭解之前函數的作用是十分必要的。
雜項
參數、變量
對於大多數初學者來說,可能對於什麼是參數、變量傻傻的分不清楚。爲此博主做了一張圖。希望能夠讓你多少懂一些,不過不懂也沒關係,就像開篇說函數一樣,有些東西積累到一定程度了自然而然就懂了。
全局變量、局部變量
全局變量和局部變量都是作用域的不同,更詳細準確的介紹請參見類(基礎)中的作用域。
- 局部變量就是定義在一個函數體內部的變量
- 全局變量是定義在外面的變量
例如:
x=1
def function():
y=2
其中x
是全局變量,y
是局部變量。我們只能在函數體內使用y在函數體外使用x。
那麼如何在函數體內使用全局變量呢?
我們如果在函數體內直接對全局變量進行修改時,python的第一反應就是找這個變量,找得到就用找不到就創建,所以在函數體內的y=2
時,python認爲是對y
這個局部變量賦值,因此創建了一個值爲2的int對象並將其綁定到局部變量y
上。因此我們可以使用global來顯示的表明這是個全局變量。
- global關鍵字
x,y=1,1
def func():
global x
x,y=2,2
func()
print(x,y)
# 運行結果
2,1
當然,我們如果在函數內部不去修改而是直接去用這個全局變量會怎麼樣呢? 這時候python的第一反應雖然還是找這個變量,但在函數內部沒有找到,因此轉向函數外面去尋找。所以是能夠找到的。
x=5
def func():
a=x+2
print(a)
func()
# 輸出結果
7
- 列表修改
之所以在函數內部修改全局變量會有誤,是因爲優先把改被修改變量當作局部變量,所以對於不可變數據類型,就直接像上面的y
那樣,python認爲是對y
這個局部變量賦值。對於可變數據類型,在修改時python則會報錯。
x=[1,2]
def func():
x+=[3]
print(a)
func()
# 運行結果
UnboundLocalError: local variable 'x' referenced before assignment
有什麼辦法呢?當然有,可以通過可變對象的方法。以列表爲例,我們在調用x.pop()
時,先做的是使用x
變量,但在函數內部沒有找到,因此轉向函數外面去尋找。當找到後再傳入pop()
中。(對於任何可變數據類型使用方法都是可行的) 原地址上修改也不會報錯,原理類似,都是先用再改。
x=[1,2]
def func():
x.pop()
x.extend([3,4,5])
x[0]=9
func()
print(x)
# 運行結果
[9,3,4,5]
return
值得一說的是return,當函數執行到return時,真個函數就已經結束了,之後的代碼是不運行的。
def return_func ():
'''return演示'''
print("在return前面")
return
print("在return後面")
return_func()
# 運行結果
在return前面