標籤:play oca gif turn bsp display image 預設參數 數學函數
一.數學定義的函數與python中的函數
- 初中數學函數定義:一般的,在一個變化過程中,如果有兩個變數x和y,並且對於x的每一個確定的值,y都有唯一確定的值與其對應,那麼我們就把x稱為自變數,把y稱為因變數,y是x的函數。自變數x的取值範圍叫做這個函數的定義域
- python中函數定義:函數是邏輯結構化和過程化的一種編程方法。
二. 為何使用函數
1.解決代碼重用
2.保持一致性,易維護
3.可擴充性
三. 函數參數
1.形參:形參變數只有在被調用時才分配記憶體單元,在調用結束時,即刻釋放所分配的記憶體單元。因此,形參只在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變數,形參不佔用記憶體空間。
2.實參:可以是常量、變數、運算式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值。實參佔用記憶體空間。
3.位置參數和關鍵字:
位置參數形參和實參的位置須一一對應,關鍵字:位置無需固定
4.預設參數:
已經在形參中定義好的,無須在實參中再賦值
5.參數組:
*args 可以進行列表的賦值 **kwargs 可以進行字典的賦值
四. 局部變數與全域變數
1.在子程式中定義的變數稱為局部變數,在程式的一開始定義的變數稱為全域變數。
2.全域變數範圍是整個程式,局部變數範圍是定義該變數的子程式。
3.當全域變數與局部變數同名時:在定義局部變數的子程式內,局部變數起作用;在其它地方全域變數起作用。
五. 前向引用之‘函數即變數‘
函數就如同變數的定義,在定義變數時,須先在硬碟中開闢一塊空間來儲存變數,而函數也是如此,再定義函數時也須在硬碟中開闢一塊空間來儲存函數,在要用時調出來用。
在運行函數時,雖然你調用的函數可能已經在下面寫好,但程式還沒運行到那一步,硬碟中還未建立該函數的內容,因此你在之前調用該函數時程式就會出錯。
六. 嵌套函數
沒錯,函數還可以一層一層嵌套。
name = "阿貓"def n1(): name = "阿狗" def n2(): nonlocal name name = "alex" n2() print(name)print(name)n1()print(name)
最後輸出的結果是什麼呢?
八 遞迴
在函數內部,可以調用其他函數。如果一個函數在內部調用自己本身,那這個函數就是遞迴函式。
def calc(n): print(n) if int(n/2) ==0: return n return calc(int(n/2)) calc(10) 輸出:10521
import timeperson_list=[‘alex‘,‘wupeiqi‘,‘linhaifeng‘]def ask_way(person_list): print("-"*60) if len(person_list) == 0: return ‘沒人知道‘ person = person_list.pop(0) if person == ‘linhaifeng‘: return ‘%s說:我知道,老男孩就在沙河匯德商廈,下地鐵就是‘ % person print(‘hi 美男[%s],敢問路在何方‘ % person) print(‘%s回答道:我不知道,但念你慧眼識豬,你等著,我幫你問問%s...‘ % (person, person_list)) time.sleep(1) res = ask_way(person_list) print(‘%s問的結果是: %res‘ % (person, res)) return resres = ask_way(person_list)print(res)遞迴問路
遞迴特性:
1. 必須有一個明確的結束條件
2. 每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少
3. 遞迴效率不高,遞迴層次過多會導致棧溢出(在電腦中,函數調用是通過棧(stack)這種資料結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴調用的次數過多,會導致棧溢出)
Python基礎之函數,遞迴。