前面我們寫的Python程序代碼都沒有涉及到Python函數,所有的代碼都被順序安排在一起,程序的執行過程也是順序執行。
下面的代碼是計算自然數10以內的累加和:
代碼聲明了變量sum並初始化為零,然後連續9條語句求自然數1至自然數9的累加和,最後輸出sum變量。上面的程序代碼和程序的執行結果都沒有問題,但這不是最好的編程方式。因為上面代碼的重複語句太多,代碼看上去也不夠簡潔,需要使用更好的方法改變代碼結構,避免編寫大量的重複語句。
使用for循環語句避免重複代碼的編寫:
上面的程序使用for循環語句求自然數10以內的累加和,程序代碼看上去簡潔多了,也沒有了重複語句。這是應用Python的循環語句改變了代碼的結構,提高了代碼的復用性。
雖然使用循環語句可以解決一些代碼語句重複的問題,但是不能解決功能性代碼重複的問題。看下面的程序代碼:
上面的程序代碼完成兩個功能:一個功能是求自然數10以內的累加和並輸出;第二個功能是求自然數20以內的累加和並輸出。這兩個功能相同,代碼也幾乎完全相同,只是循環次數不同,這種情況就屬於功能性重複,循環可以解決代碼重複的問題,但解決不了功能性重複的問題。
我們可以設想一下,在上面的程序代碼中,如果我們把求自然數累加和的代碼單獨編寫為一個代碼塊,自然數作為代碼塊的一個參數傳入進去,該代碼塊對傳入的自然數求累加和,並把求和結果返回給調用這個代碼塊的語句,這樣就解決了程序中功能性重複的問題。
在Python語言中,Python提供了函數用來解決類似上面功能性重複的問題,其實函數的作用遠不止於解決功能性重複的問題,函數是對程序邏輯進行結構化或過程化的一種編程方法,它可以將能夠完成獨立功能的代碼塊封裝成易於管理的函數,這些函數可以被程序中的其它語句調用,而調用者可以把函數看成黑盒,不用考慮函數的內部結構和特性,只需傳入參數和接收返回值就可以了。
在Python語言中,函數分為三部分:第一部分是函數聲明,函數聲明佔一行語句,聲明語句開頭使用def關鍵字,在def關鍵字後面空格後緊跟函數的名稱,函數名稱後面是一對小括號,括號內是需要傳入的參數,參數可以為空;第二部分是函數體,函數體可以佔多行語句,函數體內包括函數注釋和代碼;第三部分是返回語句,如果函數沒有返回值可以省略第返回語句。下圖是Python函數結構圖。
在Python函數結構圖中,「functionname」表示函數的名稱,「parameters」表示傳入函數的參數,多個參數之間使用英文逗號分隔, 「函數_文檔字符串」是函數的注釋文檔,主要給出函數的功能、參數說明等信息(注釋文檔可以省略),「function_suite」是函數的代碼,「expression」是返回的表達式或數據。
我們了解了函數結構後,就可以使用函數來解決上面程序中求自然數累加和功能重複的問題。
上面的程序代碼就比前邊的程序代碼簡潔強大多了,它可以求任意自然數以內的累加和,而且編寫的代碼量也很少。程序定義了函數summation,該函數完成求給定自然數以內的累加和功能,自然數由函數的參數number指定。代碼語句調用函數時,直接寫上函數名稱即可,函數名稱後面是一對小括號,需要傳入的參數放在小括號內。因為summation函數返回傳入自然數的累加和,因此print語句輸出了函數的返回值。
現在我們已經初步掌握了Python函數的使用,後面我們會深入討論函數的參數。