您好,登錄后才能下訂單哦!
函數由若干語句組成的語句塊、函數名、參數列表構成。它是組織代碼的最小單元
目的:為了完成一定的功能
定義時,在形參后跟上一個值
缺省參數不指定,且傳參時沒有傳參則引起報錯
作用
參數的默認值可以在未傳入足夠的實參的時候,對沒有給定的參數賦值為默認值
參數非常多的時候,并不需要用戶都輸入所有參數,可以簡化函數調用
定義參數時:非缺省參數不能放在缺省參數之后,否則會報錯
位置參數的可變參數 (可變位置參數 args 盡可能多的收集位置參數) 類型是元祖
在形參之前使用表示該形參是可變參數,可以就收多個實參
收集多個實參為一個tuple
可變位置參數不允許使用關鍵字傳參方式傳入
關鍵字參數的可變參數 (可變關鍵字參數 kwargs 盡可能多的收集關鍵字參數) 類型字典 數據可以被修改
形參之前使用符號,表示可以接收多個關鍵字參數
收集的實參名稱和值組成一個字典
可變位置參數不允許使用關鍵字傳參方式傳入
關鍵字傳參時不允許出現重復的key,否則直接報錯SyntaxError
可變參數混合使用
def add(*nums):
print(type(nums),nums)
sum = 0
for i in nums:
sum += i
return sum
add(),add({1,2,3}),add((1,2,3)),add(*[1,2,3]),add(1,2,3,4,5)
<class 'tuple'> ()
<class 'tuple'> (1, 2, 3)
<class 'tuple'> (1, 2, 3)
<class 'tuple'> (1, 2, 3)
<class 'tuple'> (1, 2, 3, 4, 5)
可變參數總結
有位置可變參數和關鍵字可變參數
位置可變參數在形參之前使用一個星號*
關鍵字可變參數在形參之前使用兩個星號**
位置可變參數和關鍵字可變參數都可以收集若干個實參,位置可變參數收集行形成一個tuple,關鍵字可變參數收集形成一個dict
混合使用參數時,可變參數要放到參數列表的最后,普通參數需要放到參數列表之前,位置可變參數需要在關鍵字可變參數之前
參數默認值(缺省值)
keyword-only參數
如果在一個星號參數后,或者一個位置可變參數后,出現普通的參數,實際上已經不是普通參數了,而是keyword-only參數
當*args后面出現 keyword參數時,現在的keyword變成了 keyword-only 參數 必須要有參數出傳入,否則報錯TypeError
*args已經將所有的位置參數全部收集,而后面的keyword-only收集不到實參,產生報錯
位置參數、keyword-only可以設置缺省值,以免發生漏傳報錯
當有位置參數,且沒有指定缺省值時,必須傳入實參,否則報錯 且 實參與位置形參個數要對應
參數規則
參數列表一般順序:位置參數、帶有缺省值的位置參數、可變位置參數、keyword-only參數(可帶缺省值的keyword-only參數)、可變關鍵字參數
參數的結構
參數結構,顧名思義,只能用在參數部分
給函數提供實參時,可以在集合類型前使用*或則*,把集合類型的結構解開,提取里面的每個元素作為函數的實參
非字典類型使用號解構將類型轉換成位置參數
字典類型使用**解構 將類型解構成關鍵字參數,提取到字典來的vaalue值
提取出來的元素數目要和參數的要求匹配,也要和參數的類型匹配
函數的返回值與作用域
python函數使用return語句返回——“返回值”
所有函數都有返回值,沒有return語句,隱式會調用return Neno
return 語句并不一定是函數的語句塊的最后一條語句
一個函數可以存在多個return語句,但是只有一條可以被執行。如果沒有return語句被執行,隱式調用return Neno
如果有必要,可以顯示調用return Neno,可簡寫為return
如果函數執行了return語句,函數就會返回,當前被執行的return語句之后的語句就不會被執行
作用:
結束函數,返回——返回值
返回多個值
return 只能返回一個值,當你向返回多個值時,python 會以一種方式將其封裝為一個元素返回
函數不能同時返回多個值
return 1,2,3 看似返回多個值,其實隱式被python 轉換為了一個元組
x,y,z = showlist()#使用解構提取更為方便
函數的嵌套和作用域
在函數中定義另外一個函數叫做嵌套
函數有可見范圍,這就是作用于的概念
內部函數不能再外部直接使用,會拋出NameError異常,因為在外部直接找不大該函數 不可見
作用域
一個標識符的可見范圍,這就是標識符的作用域范圍。一般說是變量的作用域
全局作用域
在整個程序運行環境中都可見
局部作用域
在函數、類等內部可見
局部變量時候用范圍不能超過其所在的局部作用域
global全局變量
使用關鍵字global的變量,將 函數 內的聲明變量 聲明為使用那個外部的全局變量
全局作用域中,必須要有 變量的定義
賦值即定義,在內部作用域為一個外部作用域的的比那領賦值,不實在內部作用域定義一個洗呢變量,而是將新賦值的變量作用在全局,這里的變量作用域還是全局作用域
global總結
x+=1這種特殊形式產生的錯誤
x = x+1 當前x屬于賦值狀態,此時的x并沒有值,等號是先算右邊在賦值,此時的等號左邊x沒有值,沒有值的情況下+1 在賦值給x 顯然是不正確的,故在x += 1 時出現了報錯
是因為,先引用后賦值產生的,而python動態語言是賦值才算定義,才能被引用。解決辦法,在語句全增加一句輔助語句即可,或者使用global告訴內部作用域,去全局作用域查找變量定義
內部作用域使用的 變量 賦值語句 會重新定義局部作用域使用的變量,但是,一旦這個作用域中使用global聲明的變量為 全局的,那么相當于 在為全局作用域的變量賦值
global使用原則
外部作用域變量會在內部作用域可見,但也不雅在這個內部的局部作用于中被直接使用,因為函數的目的就是為了封裝,盡可能與外界隔離
如果函數需要使用外部全局變量,請使用函數的形參傳參解決
一句話:不用global
閉包
自由變量:
未在本地作用域定義的變量 即定義在內層函數之外的 外層函數作用域中的變量
閉包
就是一個概念,出現在嵌套函數中
內層函數引用了外層函數的自由變量,從而形成了閉包
使用global可以解決,但是這使用的是全局變量,而不是閉包
如果對普通變量閉包,python3 可以使用nonlocal
nonlocal關鍵字
使用nonlocal關鍵字,將變量標記為不再本地作用域定義,而在上級的某一級局部作用域中定義,但不能是全局作用域中的定義
默認值作用域
默認值的值是引用的它們在內存中的地址
當默認值的值為非引用類型時,他們的值是不變的。當他們為引用類型時,它們指向的是其內存中的地址,其中的值會發生變化,它們的默認值地址并沒有發生變化,還是引用的那個內存地址。這是的默認值就會發生變化
函數地址并沒有變,就是說函數這個對象沒有變,調用它,它的屬性defaultz在使用元祖保存默認值
xyz默認值是引用類型,引用類型元素的變動,并不是元組的變化
屬性defaults中使用元組保存所有位置參數默認值,它不會因為在函數體內使用了它而發生變化
屬性defaults中使用元組保存所有位置參數默認值
屬性kwdefaults中使用字典保存所有keyword-only參數的默認值
使用默認值的方法
一:使用影子拷貝創建一個新的對象,永遠不能改變傳入的參數
二:通過值得判斷就可以領過選擇創建或者修改傳入對象
這種方式,靈活、被廣泛應用
很多函數的定義,都可以看到適應None這個不可變的值作為默認參數,這是一種慣用法
變量名解析原則LEGB
local,本地作用域,局部作用域的local命名空間。函數調用時創建,調用結束消亡
Enclosing,實現了閉包,這個就是嵌套函數的外部函數的命名空間
Global全局作用域,即一個模塊的命名空間,模塊被import時,創建,解釋器退出時消亡
Build-in,內置模塊的命名空間,生命周期從python解釋器啟動時創建到解釋器退出時消亡
顧名思義 LEGB就是其查找的順序,就近原則
函數的銷毀
全局函數銷毀
重新定義同名函數、del語句刪除函數對象、程序結束時
局部函數銷毀
重新在上級作用域定義同名函數、del語句刪除函數名,函數對象的引用計數減1、上級作用域銷毀時
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。