函數python
說明:函數是以功能爲導向,封裝單一功能的代碼塊,可以被調用執行函數
優勢:函數可以下降代碼的重複率spa
提升代碼的可讀性3d
函數的定義:rest
def fun():內存
函數體作用域
函數的調用:it
fun()class
函數被調用了多少次,函數就執行多少次變量
函數的返回值:
經過return關鍵字將函數體的結果返回給函數的執行者
return的做用:
1. 結束函數
2. 函數中沒有或者只有一個return 函數返回一個None給函數執行者
3. return後面有一個值得時候,函數執行知將獲得這個值(不會改變數據類型)
4. return後面跟多個值得時候,多個值組成元組後返回給函數執行者
函數傳參: 實際就是實參傳給形參的行爲過程
形參:定義函數時括號中的參數,用於接收調用函數時傳過來的實參
分類:
位置參數 從左至右 按照順序 一一對應
默認參數 必定要在位置參數的後面,不傳實參默認使用形參的默認參數
動態參數
僅限關鍵字參數
實參:代用函數時指定的參數,用於傳給函數中的形參供函數體使用
分類:
位置參數 從左至又 一一對應
關鍵字參數 一一對應
動態參數 關鍵字參數必定要在位置參數後面 一一對應
*args : 可以接收實參角度的全部位置參數,獲得一個元組存儲到args中
**kwargs : 接收實參角度的全部關鍵字參數,獲得一個字典存儲在kwargs中
# def eat(food1,food2,food3):
# print(f'我請你吃:{food1},{food2},{food3}')
# eat('蒸羊羔','蒸熊掌','蒸鹿尾')
# 當給函數傳入的參數數目不定時,以前的傳參方式解決不了問題。
# 萬能參數,動態參數。 *args
# def eat(food1,food2,food3):
# print(f'我請你吃:{food1},{food2},{food3}')
# eat('蒸羊羔','蒸熊掌','蒸鹿尾','燒花鴨','燒企鵝')
def eat(*args): # 將實參角度:定義一個函數時,* 全部的位置參數聚合到一個元組中。
print(args)
print(f'我請你吃:{args}')
eat('蒸羊羔','蒸熊掌','蒸鹿尾','燒花鴨','燒企鵝')
函數中的打散和聚合
在函數的定義時 *起到的是聚合的做用
在函數的執行時 *起到的是打散的做用
處理剩下的元素
a,*b = (1, 2, 3, 4,)
print(a, b) # 1 [2, 3, 4]
*rest,a,b = range(5)
print(rest, a, b) # [0, 1, 2] 3 4
print([1, 2, *[3, 4, 5]]) # [1, 2, 3, 4, 5]
位置參數,*args,默認參數,**kwargs (僅限關鍵字參數在*args和**kwargs之間,和默認參數的位置不衝突)
緣由:
動態參數*args不能放在位置參數以前,這樣位置參數就接收不到任何實參了,都被*args搶去了
動態參數*args必定要在默認參數以前,由於放在默認參數後面就無法使用默認參數的默認值了
動態參數**kwargs必定要放在默認參數以後,若是在默認參數以前會報錯,由於默認參數的值永遠改變不了
僅限關鍵字參數是python3x更新的新特性,他的位置要放在*args後面,kwargs前面(若是有kwargs),也就是默認參數的位置,它與默認參數的先後順序無所謂,它只接受關鍵字傳的參數
也能夠把它當成沒有默認值的默認參數,只接受關鍵字參數,不傳就會報錯
全局名稱空間: py文件運行時開闢的,存放的是執行的py文件(除去函數內部)的全部的變量與值(地址)的對應關係,整個py文件結束以後,纔會消失。
臨時(局部)名稱空間: 函數執行時,在內存中臨時開闢的一個空間,存放的函數中的變量與值的對應關係,隨着函數的結束而消失。
內置名稱空間:存放python解釋器爲咱們提供的名字, list, tuple, str, int這些都是內置命名空間
內置命名空間(程序運行伊始加載)->全局命名空間(程序運行中:從上到下加載)->局部命名空間(程序運行中:調用時才加載
取值順序知足的就近原則,從小範圍到大範圍一層一層的逐步引用。
做用域就是做用範圍, 按照生效範圍來看分爲全局做用域和局部做用域
全局做用域:全局名稱空間,內置名稱空間。
局部做用域:局部名稱空間。
globals(): 以字典的形式返回全局做用域全部的變量對應關係。
locals(): 以字典的形式返回當前做用域的變量的對應關係。