Day 10 函式形參: 萬能引數:引數順序:僅限關鍵字引數:名稱空間:載入取值順序:函式巢狀
阿新 • • 發佈:2020-07-12
1 今日內容大綱
- 學習方法:
- 安裝環境
- 專案需求提問
- 自學能力,獨立解決問題
- 形參角度:
- 萬能引數
- *的魔性用法
- 僅限關鍵字引數(瞭解為主)
- 形參的最終順序
- 名稱空間
- 全域性名稱空間,區域性.....
- 載入順序,取值順序.
- 作用域
- 函式的巢狀(高階函式)
- 內建函式:globals locals
- 關鍵字:nonlocal,global
2 昨日內容回顧作業講解
-
函式以功能為導向,減少重複程式碼,提高程式碼的可讀性
def func(): 函式體
-
函式的呼叫
func() func() func()
-
函式返回值:
- return
- 終止函式
- return單個值 ----- 單個值
- return多個值 ------ 元組
- return
-
函式的引數:
- 實參角度:位置引數,關鍵字引數,混合引數
- 形參角度:位置引數,預設引數
-
3 今日內容
-
如何在工作中不讓別人看出你是培訓出來的?
- 第一天安裝環境等,小白各種問
- 專案需求不清晰,也不敢問
- 六個月內學會自主學習,自己解決問題
-
形參角度:
-
萬能引數
-
*的魔性用法
# 形參角度 # 萬能引數 def eat(a,b,c,d): print('我請你吃:%s,%s,%s,%s'%(a,b,c,d)) eat('蒸羊羔','蒸熊掌','燒花鴨','燒子鵝') def eat(a,b,c,d,e,f): #寫死了 print('我請你吃:%s,%s,%s,%s,%s,%s'%(a,b,c,d,e,f)) eat('蒸羊羔', '蒸熊掌', '蒸鹿邑','燒花鴨','燒雛雞','燒子鵝') # 急需要一種形參,可以接受所有的實參 # 萬能引數: *args,約定俗成 # 函式定義時,*代表聚合.他將所有的位置引數,聚合成一個元組,賦值給args def eat(*args): print(args)#('蒸羊羔', '蒸熊掌', '蒸鹿邑', '燒花鴨', '燒雛雞', '燒子鵝') print('我請你吃:%s,%s,%s,%s,%s,%s'% args) eat('蒸羊羔', '蒸熊掌', '蒸鹿邑','燒花鴨','燒雛雞','燒子鵝') # 寫一個函式:計算你傳入函式的所有的數字的和 def func(*args): s = 0 for i in args: s += i return s print(func(1,2,3,4,5)) # **kwargs # 函式的定義時: **將 所有的關鍵字引數聚合到一個字典中,將這個字典賦值給了kwargs!!!!!!!!!!! def func(**kwargs): print(kwargs) func(name='alex',age='29',sex='boy')#{'name': 'alex', 'age': '29', 'sex': 'boy'} # 萬能引數:*args,**kwargs, def func(*args,**kwargs): print(args)#() print(kwargs)#{} func() # 在函式的呼叫時,*代表打散 def func(*args,**kwargs): print(args) #(1, 2, 3, 11, 22, 33, 44) print(kwargs) #{} # func(*[1,2,3],*[11,22,33,44]) # func(*'laskfjka',*'lklkla') #('l', 'a', 's', 'k', 'f', 'j', 'k', 'a', 'l', 'k', 'l', 'k', 'l', 'a') 相當於輸入單個元素 func(**{'name':'alex'},**{'age':'29'}) #{'name': 'alex', 'age': '29'} 相當於輸入鍵值對
-
形參的最終順序(瞭解僅限關鍵字引數):
# 形參角度的引數順序: # *args 的位置? def func(*args,a,b,sex = '男'): print(a,b) func(1,2,3,4) #func() missing 2 required keyword-only arguments: 'a' and 'b' ###報錯!!1 # args得到實參的前提,sex必須被覆蓋 def func(a,b,sex = '男',*args): print(a,b) #1 2 print(sex) #3 print(args) #(4, 5, 6, 7, 8, 9) func(1,2,3,4,5,6,7,8,9) def func(a,b,*args,sex = '男'): print(a,b) #1 2 print(args) #(3, 4, 5, 6, 7, 8, 9) print(sex) #女 func(1,2,3,4,5,6,7,8,9,sex='女') # **kwargs 的位置? def func(a,b,*args,sex ='男',**kwargs): print(a,b) # 1 2 print(args) # (3, 4, 5, 6, 7, 8) print(sex) # 女 print(kwargs) # {'name': 'alex', 'age': '29', 'edu': '小學'} func(1,2,3,4,5,6,7,8,sex='女',name='alex',age='29',edu= '小學') #形參角度的第四個引數:僅限關鍵字引數(瞭解) def func(a,b,*args,sex = '男',c,**kwargs): print(a, b) #1 2 print(args) #(3, 4, 5, 6, 7, 8) print(sex) #女 print(c) #6666666666 #僅限關鍵字引數!!!! print(kwargs) #{'name': 'alex', 'age': '19', 'edu': '小學'} func(1,2,3,4,5,6,7,8,sex='女',name='alex',age='19',edu='小學',c='6666666666') func(1,2,3,4,5,6,7,8,sex='女',name='alex',age='19',c='6666666666',edu='小學')#結果一致 #形參角度的最終順序: 位置引數 , *args , 預設引數 , 僅限關鍵字引數 , **kwargs
-
-
名稱空間(示意圖見Day 10.pdf)
- 全域性名稱空間
- 區域性名稱空間
- 內建名稱空間
# 名稱空間:名稱空間 a = 1 b = 2 def func(): f = 5 print(f) c = 3 func() # 5 #內建名稱空間:python原始碼給你提供了一些內建的函式:print,input # print(666) # python分為三個空間: #內建名稱空間(builtins.py) #全域性名稱空間(當前py檔案) #區域性名稱空間(函式,函式執行時才開闢,函式結束執行,空間消失) # 載入順序: # 內建名稱空間---->全域性名稱空間------->區域性名稱空間(函式執行時) def func(): pass func() a = 5 print(666) # 取值順序(就近原則)並且單項不可逆 # LEGB 原則 input = '太白金星' def func(): input = 'alex' print(input) func() #alex #(從區域性找時)區域性名稱空間 ----> 全域性名稱空間 ----> 內建名稱空間 #(從全域性找時)全域性名稱空間 ----> 內建名稱空間
-
作用域
# 作用域: # 兩個作用域: # 1.全域性作用域:內建名稱空間 + 全域性名稱空間 # 2.區域性作用域:區域性名稱空間 # # 區域性作用域 可以引用 全域性作用域的變數 data = '週五' def func(): a = 666 print(data) # print(a) func() # print(a) # 區域性變數不能改變全域性變數. count = 1 def func(): count += 2 print(count) func() #UnboundLocalError: local variable 'count' referenced before assignment # 區域性作用域不能改變全域性作用域的變數. 因為 當python直譯器讀取到區域性作用域時,發現了你對一個變數進行修改的操作, # 直譯器會認為你在區域性已經定義過這個區域性變量了,他就會從區域性找這和變數,就會報錯 # 使用可以,帶不能改變 def func(): count = 1 def inner(): print(count) inner() func() def func(): count = 1 def inner(): count += 1 print(count) #報錯 inner() func()
-
函式的巢狀(高階函式)(圖解見pdf):
# 例1 def func1(): print('in func1') print(3) def func2(): print('in func2') print(4) func1() print(1) func2() print(2) # in func1,3,1,in func2,4,2 # 例2: def func1(): print('in func1') print(3) def func2(): print('in func2') func1() print(4) print(1) func2() print(2) # 1,in func2,in func1,3,4,2 # 例3: def fun2(): print(2) def fun3(): print(6) print(4) fun3() print(8) print(3) fun2() print(5) # 3,2,4,6,8,5
-
內建函式 globals locals
''' 本檔案:研究內建函式:globals locals ''' a = 1 b = 2 def func(): name = 'alex' age = 73 sex = 'boy' print(globals()) # 返回的是字典:字典裡面的鍵值對:全域性作用域的所有內容。 print(locals())# 返回的是字典:字典裡面的鍵值對:當前作用域的所有的內容。 func() print(globals()) # 返回的是字典:字典裡面的鍵值對:全域性作用域的所有內容。 print(locals())# 返回的是字典:字典裡面的鍵值對:當前作用域的所有的內容。
-
關鍵字nonlocal global.
4 今日總結
- 引數:
- 形參角度:
- 萬能引數
- 僅限關鍵字引數(瞭解)
- 引數的順序
- *的魔性用法:聚合,打散
- 形參角度:
- 名稱空間,作用域,取值順序,載入順序
- globals(),locals()
- 高階函式執行順序
5 下週預習內容
- 函式名的運用,迭代器
- 生成器