標籤:位置 stack 無法 內部使用 全域 多個 大寫 多個參數 函數名
數學中函數的定義: 一般的 在一個變化過程中, 如果有兩個變數 x 和 y 並且 對於 x的每一個確定的值,y都有唯一確定的值與 其對應, 那麼我們就把 x 成為 自變數 把y成為 因變數 y是x的函數。自變數x的取值範圍叫這個函數的定義域
y = 2*x
python 中函數 是一種邏輯結構化和過程化的一種變成方法
python中函數定義的方法:
1 def test(x):2 "the function deinitions"3 x += 14 return x
def 定義函數的關鍵字
test: 函數名
() 內可定義形參
"" 注釋 注釋是函數不可缺少的一部分****
x += 1 : 泛指代碼塊或程式處理邏輯
return 定義傳回值
調試運行:可以帶參數也可不帶
函數名()
函數的優點:
1.代碼重用
2. 保持一致性,易維護
3. 可擴充性
Python中函數與過程:
過程的定義: 過程就是簡單特殊 沒有傳回值
也就是 沒有傳回值的函數
函數傳回值:
傳回值 =0 返回None
傳回值 =1 返回 object
傳回值 >= 1 返回 tuple
函數參數
1 形參 只有被調用時分配記憶體單元, 調用結束釋放單元
2 實參 在函數調用時 他們必須是確定的值,這些值傳給形參 因此要 預先賦值
1 def test(x,y,z):2 print(x,y,z)
位置 參數 需要一一對應 缺一不行 多一也不行
test(1,2,3)
關鍵字參數 無需一一對應 缺一不行 多一也不行
test(x=1,z=2,y=3)
位置參數必須在關鍵字參數左邊
test(1,3,y=2) 報錯
test(1,3,z=2) True
參數組 (**字典 *列表
如果沒有 加* 就代表把整個列表當作一個整體
加*則 遍曆後當作 多個參數傳遞
test(1,y=2,z=3,z=3) 一個參數不能傳兩個值
1 def test(*args, *kwargs):2 print(args)3 print(kwargs)
全域變數 和 局部變數
全域變數 一般在 檔案最頂端定義 全域可用 全域變數字母全部大寫
局部變數 在子程式中定義 只在子程式內部使用 局部變數 變數名小寫
在子程式中定義的 全域變數的關鍵字 global
如果 函數的內容 無 global關鍵字 優先讀取 局部變數 只能讀取全域變數 無法對全域變數重新賦值
如果函數中有global 關鍵字 變數本質時 全域變數 函數內 可讀取可賦值
函數 == 變數????
1 def foo():2 print(‘this is foo‘)3 bar()4 def bar():5 print(‘this is bar‘)6 7 foo()
先載入完的函數 不會報錯
1 def foo():2 print(‘this is foo‘)3 bar()4 foo()5 def bar():6 print(‘this is bar‘)
但 函數執行時 bar函數 未被載入到 記憶體中 會報錯 所以就 引申出了 函數==變數
函數的遞迴:
特性:
1必須有一個明確的結束條件
2每次進入更深一層遞迴時,問題規模相比上次遞迴都應有減少
3遞迴效率不高,遞迴層數過多會導致 棧溢出(在電腦中,函數調用是通過棧(stack)這種資料結構 ,每進入一次 函數 調用,棧會加一層棧幀,每當函數返回時,棧較少一層棧幀。由於棧的大小不是無限的,所以,遞迴調用的次數越多,會導致棧溢出
Python函數基礎與函數遞迴