1. 程式人生 > >函數定義,返回值,傳參,命名空間,閉包

函數定義,返回值,傳參,命名空間,閉包

pan 定義變量 結果 動態 lex 動態傳參 代碼 name 作用

函數的返回值: return是返回給函數的調用者 函數外面的代碼想要獲取函數的執行結果,就可以在函數裏,用return語句把結果返回. 註意:在函數的執行過程中主要遇到return語句,就會停止執行並返回結果, so可以理解為return語句代表著函數的結束 如果未在函數中指定return,那這個函數的返回值為none 函數的返回值,可以返回一個函數名(可以將嵌套函數裏的執行結果return給函數體外,進行執行) return永遠且只能返回一個值,,如果返回多各值呢? def func1(name,age): return [name,age] #這裏加上[]就可以返回[‘alex‘, 18],元祖,字典同理
start = func1(‘alex‘,18) print(start) 返回:[‘alex‘, 18] 關於函數的返回值 def wraaper(): def inner(): print(666) return inner wraaper()() #將inner這個函數的值返回給waaper然後給打印出來 age = 19 def func1(): def func2(): print(age) age = 73 func2() func1() 返回:73 函數什麽時候執行?函數調用的時候執行, 函數嵌套:代碼從上至下執行,調用函數.函數裏面從上至下執行. print(111)
def func1(): print(333) def func2(): print(444) def func3(): print(555) func2() func1() print(222) 返回:111,333,222 嵌套函數哦執行順序 函數內部可以再次被定義,執行需要被調用才執行 age = 19 def func1(): age = 73 print(age) def func2(): print(age) func2() func1() 返回:73,73 說明,在執行finc2的時候改函數裏面沒有定義age的變量,所以他就開始一級一級的往上去找. age = 19 def func1(): print(age) def func2(): print(age) func2() func1() 返回:19,19 加深印象說明函數嵌套情況下,他是一級一級往外面去找的,你看,函數裏面(局部作用域)沒有了,就在函數外面(全局作用域)去找.
函數傳參:
  • 實參角度:
1.位置傳參,按順序,一一對應. 2.關鍵字傳參,不按順序,一一對應 3.混合傳參,關鍵字參數永遠在位置參數的後面
  • 形參角度
1.位置傳參,按照順序,一一對應 2.默認參數,傳參則覆蓋,不傳則默認,默認參數永遠在位置參數的後面 3.動態傳參:又叫萬能傳參.args,kwargs只是一個變量名,但一般情況下都這麽寫
  • *args 接收的是實參對應的,所有位置參數(剩余,無意義),並將其,放在元祖中,
def func1(age,*args): print(args) #(3, 6, 9, 4) print(age) #18 func1(18,3,6,9,4,) 只是舉例說明,*args接受的參數有哪些,並返回的是元祖
  • **kwargs 他講所有的關鍵字參數(無意義)放到一個字典中
def func2(a,b,c,**kwargs): print(kwargs) func2(12,23,34,b1=1,b2=3,c3=6) #返回;{‘b1‘: 1, ‘b2‘: 3, ‘c3‘: 6} 這裏print(kwargs)返回的是一個字典 總結:形參角度來說分,位置傳參,默認參數,動態傳參,那麽他們之間的優先級先後順序是什麽呢?看例題: def func3(a,b,c,d,*args,e =‘男‘,**kwargs): print(args) #返回:(5, 6, 7) print(kwargs) #返回:{‘v‘: 3, ‘m‘: 7, ‘h‘: 9} print(e) #返回:女 func3(1,2,3,4,5,6,7,v = 3,m = 7,h = 9,e = ‘女‘) 分析結果:對應傳參關系是: a->1,b->2,c->3,d->4,(這是位置參數) *args -> 5,6,7 (*args接受剩余無意義的位置參數) e = ‘男‘->e = ‘女‘ (e= ‘男‘對應,e =‘女‘,如果關鍵字參數傳參給默認參數,關鍵字參數將默認參數的值覆蓋,不傳參則默認參數保持不變.) 作用域: python中函數就是一個作用域,局部變量防止在其作用域中 代碼定義完成後,作用域已經生成,作用域鏈向上查找,(從裏想外查找 age = 18 def func1(): age = 73 def func2(): print(age) return func2 #函數名也可以被當做變量,return給函數的調用者 val = func1() val() 返回:73,這說明嵌套函數內當返回一個函數名的時候,而func2又沒有定義變量,他就從裏面往向上找, 加入這裏的func1,func2都沒有定義變量的話,那麽,他講會往上,到全局作用域去找. 五,閉包:就是內層函數對外層函數(非全局)變量的引用 如何判斷:內層函數名 ._closure_ 返回cell就是等於閉包 理解閉包 def wraaper(): name = "老男孩" def inner(): print(name) 該代碼沒有打印結果,這print(name)就是內層對外層函數變量的引用 #可以輸出的代碼 def wraaper1(): name = "老男孩" def inner(): print(name) inner() print(inner.__closure__) wraaper1() 裏層沒有變量,要引用外層的name,打印出結果為 老男孩,這就叫閉包 閉包的作用:當函數開始執行時,如果遇到閉包,他有一個機制,他會永遠開辟一個內存空間, #將閉包中的變量等值放入其中,不會隨著函數的執行完畢而消失.

函數定義,返回值,傳參,命名空間,閉包