萬能參數。python
*和**的魔性用法。函數
# 萬能參數 # 下面的例子至關於寫死了程序,將來添加功能不方便 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 # 函數定義時,*表明聚合。他將全部的位置參數聚合成一個元組,賦值給了args。 def eat(*args): print(args) print('我請你吃:%s,%s,%s,%s,%s,%s' % args) eat('蒸羊羔', '蒸熊掌', '蒸鹿邑','燒花鴨','燒雛雞','燒子鵝') # 寫一個函數:計算你傳入函數的全部的數字的和。 def func(*args): count = 0 for i in args: count += i return count print(func(1,2,3,4,5,6,7)) # **kwargs # 函數的定義時:** 將全部的關鍵字參數聚合到一個字典中,將這個字典賦值給了kwargs. def func(**kwargs): print(kwargs) func(name='jarvis',age=18,sex='boy') # 萬能參數:*args, **kwargs, def func(*args,**kwargs): print(args) print(kwargs) func() print() # * **在函數的調用時,*表明打散。 def func(*args,**kwargs): print(args) # (1,2,3,22,33) print(kwargs) func(*[1,2,3],*[22,33]) # func(1,2,3,22,33) 將兩個列表打散 func(**{'name': 'jarvis'},**{'age': 18}) # func(name='jarvis',age='18') 將兩個字典打散
僅限關鍵字參數(瞭解)學習
形參的最終順序ui
# 形參角度的參數的順序 # *args 的位置? # 錯誤的位置 def func(*args,a,b,sex= '男'): print(a,b) func(1,2,3,4) # args獲得實參的前提,sex必須被覆蓋了。 # 方法一 def func(a,b,sex= '男',*args,): print(a,b) print(sex) print(args) func(1,2,3,4,5,6,7,) #方法二 def func(a,b,*args,sex= '男'): print(a,b) print(sex) print(args) func(1,2,3,4,5,6,7,sex='女') # **kwargs 位置? def func(a,b,*args,sex= '男',**kwargs,): print(a,b) print(sex) print(args) print(kwargs) func(1,2,3,4,5,6,7,sex='女',name='jarvis',age=80) # 形參角度第四個參數:僅限關鍵字參數 (瞭解) # 僅限關鍵字參數必須在*args和**kwargs中間,而且只能經過關鍵值參數進行傳值 def func(a,b,*args,sex= '男',c,**kwargs,): print(a,b) print(sex) print(args) print(c) print(kwargs) func(1,2,3,4,5,6,7,sex='女',name='Alex',age=80,c='666') # 形參角度最終的順序:位置參數,*args,默認參數,僅限關鍵字參數,**kwargs
在python解釋器開始執行以後, 就會在內存中開闢一個空間, 每當遇到一個變量的時候, 就把變量名和值之間的關係記錄下來, 可是當遇到函數定義的時候, 解釋器只是把函數名讀入內存, 表示這個函數存在了, 至於函數內部的變量和邏輯, 解釋器是不關心的. 也就是說一開始的時候函數只是加載進來, 僅此而已, 只有當函數被調用和訪問的時候, 解釋器纔會根據函數內部聲明的變量來進行開闢變量的內部空間. 隨着函數執行完畢, 這些函數內部變量佔用的空間也會隨着函數執行完畢而被清空.code
咱們首先回憶一下Python代碼運行的時候遇到函數是怎麼作的,從Python解釋器開始執行以後,就在內存中開闢裏一個空間,每當遇到一個變量的時候,就把變量名和值之間對應的關係記錄下來,可是當遇到函數定義的時候,解釋器只是象徵性的將函數名讀入內存,表示知道這個函數存在了,至於函數內部的變量和邏輯,解釋器根本不關心。內存
等執行到函數調用的時候,Python解釋器會再開闢一塊內存來儲存這個函數裏面的內容,這個時候,才關注函數裏面有哪些變量,而函數中的變量回儲存在新開闢出來的內存中,函數中的變量只能在函數內部使用,而且會隨着函數執行完畢,這塊內存中的全部內容也會被清空。作用域
咱們給這個‘存放名字與值的關係’的空間起了一個名字-------命名空間。input
代碼在運行伊始,建立的存儲「變量名與值的關係」的空間叫作全局命名空間;源碼
在函數的運行中開闢的臨時的空間叫作局部命名空間也叫作臨時名稱空間。class
# 名稱空間;命名空間。 a = 1 #開闢全局名稱空間 b = 2 #放入全局名稱空間 def func(): #放入全局名稱空間 f = 5 #放入局部名稱空間 print(f) #執行完局部名稱空間消失 c = 3 #放入全局名稱空間 func() #開闢局部名稱空間 # 內置名稱空間:python源碼給你提供的一些內置的函數,print input # python分爲三個空間: # 內置名稱空間(builtins.py) # 全局名稱空間(當前py文件) # 局部名稱空間(函數,函數執行時纔開闢) # 加載順序: # 內置名稱空間 ---> 全局名稱空間 ----> 局部名稱空間(函數執行時) def func(): #放入全局名稱空間 pass func() #開闢局部名稱空間 a = 5 #放入全局名稱空間
# 取值順序(就近原則) 單向不可逆 # (從局部找時)局部名稱空間 ---> 全局名稱空間 ---> 內置名稱名稱空間 # LEGB原則 # L:local # E:enclosed # G:global # B:built-in name = '1234' def func(): name = 'jarvis' print(name) func()
做用域
# python兩個做用域: # 全局做用域:內置名稱空間 全局名稱空間 # 局部做用域:局部名稱空間 # 局部做用域能夠引用(沒法改變)全局做用域的變量 date = '週五' def func(): a = 666 print(date) print(a) func() # 局部做用域不能改變全局變量。 count = 1 def func(): count += 2 print(count) func() # local variable 'count' referenced before assignment # 局部做用域不能改變全局做用域的變量,當python解釋器讀取到局部做用域時,發現了你對一個變量進行修改的操做,解釋器會認爲你在局部已經定義過這個局部變量了,他就從局部找這個局部變量,報錯了。 # 使用能夠,不能改變 # local variable 'count' referenced before assignment def func(): count = 1 def inner(): count += 1 print(count) inner() func()
函數的嵌套(高階函數)
# 練習題 # 例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) # 例3(分別打印什麼) def fun2(): print(2) def fun3(): print(6) print(4) fun3() print(8) print(3) fun2() print(5)
內置函數 globals() locals()
""" 本文件:研究內置函數:globals locals """ a = 1 b = 2 def func(): name = 'jarvis' age = 18 print(globals()) # 返回的是字典:字典裏面的鍵值對:全局做用域的全部內容。 print(locals()) # 返回的是字典:字典裏面的鍵值對:當前做用域的全部的內容。 print(globals()) # 返回的是字典:字典裏面的鍵值對:全局做用域的全部內容。 print(locals()) # 返回的是字典:字典裏面的鍵值對:當前做用域的全部的內容。 func()