第四章 函式總結
1、函式返回值return總結:
2、(函式)作用域:乙個識別符號的可見範圍,這就是識別符號的作用域。一般常說的是變數的作用域;
全域性作用域:在整個程式執行環境中都可見;
區域性作用域:(1)在函式、類等內部可見;
(2)區域性變數使用範圍不能超過其所在的區域性作用域;
eg:
x = 5
def foo():
x += 1
foo()
將會報unboundlocalerror
3、作用域關鍵字
全域性變數 global;
(1)使用 global 關鍵字的變數,將foo內的 x變數 宣告為外部的全域性作用域中定義的 x;
(2)全域性作用域中必須有 x 的定義,否則就需要在函式內自己賦值定義變數(注意該變數有關鍵字global);
(3)但是如果全域性作用域中沒有變數 x 的話,在函式內部賦值及定義,在內部作用域為乙個外部作用域的變數 x 賦值,不是在內部作用域定義個新變數,所以 x += 1不會報錯。注意:這裡的 x 的作用域還是全域性的;
global總結:
答:先引用後賦值,而python動態語言是賦值才算定義,才能被引用。解決辦法,在這條語句前增加 x = 0 之類的賦值語句,或者使用 global 告訴內部作用域,去全域性作用域查詢變數定義;
global 使用原則
2. nonlocal 關鍵字
使用了nonlocal關鍵字,表示該區域性變數中的變數使用的是上級作用域中的變數;注意該上級不能是外部的全域性變數;
3、預設值的作用域
注意:使用可變型別作為預設值,就可能修改這個預設值;
預設值的修改
使用影子拷貝建立乙個新的物件,永遠不能改變傳入的引數;
通過值得判斷就可以靈活得選擇建立或者修改傳入物件;
這種方式靈活,應用廣泛;
很多函式得定義,都可以看到使用none這個不可變得值作為預設引數,可以說這是一種慣用法;
4、閉包
注意:如果變數使用的是global關鍵字,但這是使用的是全域性變數,而不是閉包;如果要對普通變數的閉包,可以使用nonlocal;
5、函式的銷毀
全域性函式的銷毀
區域性變數的銷毀
6、函式執行流程(壓棧過程):可以解釋函式區域性變數在函式呼叫是建立,在呼叫結束消亡;
全域性記憶體中生成 foo1 、foo2 、foo3 、main函式物件;
main函式呼叫壓棧;
main 中查詢內建函式 print 壓棧,將常量字串壓棧,呼叫函式,彈出棧頂;(函式彈出的是返回值,此時棧底只有main 函式);
main 中全域性查詢函式 foo1 壓棧,將常量 100、101壓棧,呼叫函式 foo1 ,建立棧幀。print 函式壓棧,字串和變數 b、b1 壓棧,呼叫函式,彈出棧頂,返回值,foo1 函式結束呼叫彈出棧頂;
main 中全域性查詢 foo2 壓棧,將常量 200 壓棧,呼叫 foo2 ,建立棧幀。
foo3 函式壓棧,變數 c 引用壓棧,
呼叫 foo3 ,建立棧幀。foo3 完成 print 函式呼叫後返回,彈出棧頂;
foo2 恢復呼叫,執行 print 後,返回值。main 中 foo2 呼叫結束後彈出棧頂;
繼續執行 main 中的 print 函式呼叫,彈出棧頂。main 函式返回結束呼叫,彈出棧頂;
def foo1(b,b1=3):
print("foo1 called",b,b1)
def foo2(c):
foo3(c)
print("foo2 called",c)
def foo3(d):
print("foo3 called",d)
def main():
print("main called")
foo1(100,101)
foo2(200)
print("main ending")
main()
python函式小結
函式的定義 1.關鍵字 def 引數傳遞方式 1.定長引數 如 def printinfo name,age 35 列印任何傳入的字串 print name name print age age return 呼叫printinfo函式 printinfo age 50,name miki prin...
python函式小結歸納
總結了幾種函式的形式,大致有 1.無參函式 2.有參函式 3.有參預設函式 4.有參無序函式 5.函式動態引數,乙個 是元組 6.函式動態引數,兩個 是字典 無參函式 deffun a 5 b 3print 無參函式結果 print a b fun 有參預設函式 不在實參中傳入值的情況 parame...
python小結 python小結
c python33新增到你的path 環境變數中,你可以在dos 視窗中 輸入以下命令 set path path c python33 id 方法的返回值就是物件的記憶體位址。在 行 首行 後插入至少一行特殊的注釋行來定義原始檔的編碼。coding encoding sys.modules 模組...