動態參數: 用戶傳入到函數的實參數量不定時,或者是爲了之後拓展,此時要用到動態參數*args,**kwargs(萬能參數) *args 接收的是全部的位置參數(接收的是元組類型) **kwargs接收的是全部的關鍵字參數。(接收的是字典類型)
def func1(a,b,c): pass func1(1,2,3) func1(1,2,3,4,5,6) print() def func1(*args, **kwargs): print(args) print(kwaigs) func1(1,2,3,4) fnc1(x=4, y=5, z=6) #func1(1,2,3, x=4, y=5, z=6)
他們的順序:
位置參數,*arge,默認參數,**kwargs
1, def func2(a, b,*args,sex='男'): print(a) print(b) print(args) print(sex) func2(1,2,5,6,7,8,9,sex='女')
2, def func2(a, b,*args,sex='男',**kwargs): print(a) print(b) print(args) print(sex) print(kwargs) func2(1,2,5,6,7,8,9,sex='女',x=6, y=5, name='alex') ###### 1 2 (5, 6, 7, 8, 9) *args 元組的形式 女 {'x': 6, 'y': 5, 'name': 'alex'} **kwargs 字典的形式
3, def func2(a,b,sex='男'): print(a) #1 print(b) # 2 print(sex) #女 func2(1,2,'女')
4, def func2(a,b,sex='男',*args): print(a) #1 print(b) #2 print(args) #(55,66) print(sex) #44 func2(1, 2, 44, 55, 66)
簡單的加法計算:
def sum1(*args): ret = 0 for i in args: ret += i return ret print(sum1(1,2,3))
def func3(*args,**kwargs): 函數的定義,* 用意是聚合 print(args) #(1,2,3,11,21,32) print(**kwargs) l1 = [1,2,3] l2 = [11,21,32] func3(l1,l2) #[1,2,3],]11,21,32]
def func3(*args,**kwargs): 函數的定義,* 用意是聚合 print(args) #(1,2,3,11,21,32) print(**kwargs) l1 = [1,2,3] l2 = [11,21,32] func3(l1,l2) #[1,2,3],]11,21,32]
把上面的結果變成沒有列表形式
def func3(*args,**kwargs): 函數的定義,* 用意是聚合 l = [] for i in args: #([1,2,3],[11,21,32]) l.extend(i) args = tuple(l) print(args) #(1,2,3,11,21,32) print(kwargs) #{} l1 = [1,2,3] l1 = [1,2,3] l2 = [11,21,32] func3(l1,l2)
*args,**kwargs:函數的定義,* 用意是聚合。 在函數的執行時,*的用意是打散。
*的魔性用法:
def func3(*args,**kwargs): print(args) # (1,2,3,11,21,32) print(**kwargs) l1 = [1,2,3] l2 = [11,21,32] func3(*l1,*l2)###(1, 2, 3, 11, 21, 32) s1 = 'bfhfbdb' s2 = 'jdfjdgsgg' func3(*s1,*s2) #tu1 = (1,2,3) #tu2 = (11,22,33) #func3(*tu1,*tu2) #(1, 2, 3, 11, 22, 33)
def func3(*args,**kwargs): print(args) # (1,2,3,11,21,32) print(**kwargs) l1 = [1,2,3] l2 = [11,21,32] func3(*l1,*l2)###(1, 2, 3, 11, 21, 32) s1 = 'bfhfbdb' s2 = 'jdfjdgsgg' func3(*s1,*s2) #tu1 = (1,2,3) #tu2 = (11,22,33) #func3(*tu1,*tu2) #(1, 2, 3, 11, 22, 33)
def func3(*args,**kwargs): print(args) # (1,2,3,11,21,32) print(**kwargs) l1 = [1,2,3] l2 = [11,21,32] func3(*l1,*l2)###(1, 2, 3, 11, 21, 32)
s1 = 'bfhfbdb' s2 = 'jdfjdgsgg' func3(*s1,*s2) #tu1 = (1,2,3) #tu2 = (11,22,33) #func3(*tu1,*tu2) #(1, 2, 3, 11, 22, 33)
當程序運行時,代碼從上至下一次讀取,遇到變量與值,
他會在內存中開闢一個空間,存放變量與值的內存地址的對應關係。
這樣存儲變量與值得對應關係的空間叫作名稱空間(命名空間)。
當解釋器遇到函數時,他會將函數名存儲在內存中,可是對於函數體莫不關心。
當函數執行時,他會經過函數名找到函數體,而後將函數體裏面的變量等對應關係存放在一個
臨時開闢的空間中,隨着函數的結束,臨時的空間關閉,這樣的空間叫作臨時名稱空間。
name = 'alex' age = 1000 def func1(): a = 2 b = 3 func1()
內置名稱空間:
len() print() input() list
名稱空間: 內置名稱空間 全局名稱空間 局部名稱空間 加載順序:內置名稱空間----> 全局名稱空間(程序運行時)------>局部名稱空間(函數執行時) 執行順序:當代碼執行時,從上至下一次執行。 做用域: 全局做用域:內置名稱空間 全局名稱空間 局部做用域:局部名稱空間 取值順序(單項):局部名稱空間(函數執行時)--->所有名稱空間---->內置名稱空間
加載順序:
name = 'alex' def func1(): a = 3 func1()
取值順序:
1, name = '老男孩' def func1(): name = 'alex' print(name) func1()
name = '老男孩' def func1(): print(name) func1()
sum = 666 name = '老男孩' def func1(): #sum = 555 print(sum) func1()
L local (本地)
E eclose (關閉)
G global (全局變量)
B Built-in (內置)
sum = 666 # global def func1(): #sum = 555 #eclose def inner(): # sum = 111 # local print(sum) inner() func1()
練習題;面試
1, print(111) def func1(): name = 'alex' print(name) def inner(): a = 2 print(a) inner() print(333) func1() print(444) #111 333 alex 2 444
print(111) def func1(): name = 'alex' print(name) def inner(): a = 2 print(a) print(444) inner() print(555) func1() # 111 alex 444 2 555
def func1(): a = 666 print(666)
def func2(): name = 'taibai' print(name) func1()
print(333) func2() print(555) #333 taibai 666 555 global
global: def func1(): name = 'alex' print(name) print(name) 會報錯
1, def func1(): name = 'alex' print(name) return name ret = func1() print(ret) 2, def func1(): global name name = 'alex' func1() print(name) # alex 3, name = '老男孩' def func1(): global name name = 'alex' func1() print(name) # alex
global: 在全局名稱空間裏獲得局部名稱空間的變量 1,return 2,global 1),在局部做用域中聲明一個全局變量。 2),在局部做用域中,更改一個全局變量。 (改變全局變量,遇到global,global下面變量的值將覆蓋全局變量的值) 補充: 對於可變的數據類型,函數中若是對其進行操做,改變全局不用引用global
函數中若是使用global + 變量 必須是第一次使用這個變量。
flag = True def func1(): if flag: print(333) global flag flag = False func1()
做用域的問題:
1,globals()獲取全局做用域中的內容
2,locals() 獲取局部做用域中的內容app
locals():函數會以字典的類型返回當前位置的所有局部變量。
globals():函數以字典的類型返回所有全局變量。
def extendList(val,list=[]): list.append(val) print(locals()) #{'list': [1],'val':1] return list ret = extendList(1) print(globals()) #'ret':[1]
nonlocal:(改變全局會報錯) 1,不能改變一個全局變量。 2,在局部做用域中,對父級做用域(或者更外層做用域非全局做用域)的變革進行引用和修改,而且引用的哪層,從那層及如下此變量所有發生改變。 (nonlocal不能改變全局變量,若是改變父級(它的上一級),那麼如下執行的都是改變的值,與父級的值沒有關係。)
global和nonlocal global:尋找全局做用域中的內容 nonlocal:尋找上一級做用域中的內容,但不能是全局的 a = 10 #全局 def func(): #全局 a = 40 #局部 b = 20 #局部 def abc(): #局部 d = 30 #局部 print('哈哈') print(a,b) #這使得是局部做用域 # print(locals()) #打印全局做用域中的內容 func() # print(globals()) #打印全局做用域中的內容 a = 10 def func(): global a #全局 a = 20 print(a) func() print(a) #20 a=10 def func1(): a = 20 #30 print(a) #20 def func2(): nonlocal a a = 30 print(a) #30 func2() print(a) #30 func1() print(a) #20 30 30 10
name = '老男孩' # def func1(): nonlocal name print(name) func1() # 改變全局報錯
練習:
def add_b(): b = 42 def do_global(): b = 10 print(b) def dd_nonlocal(): nonlocal b b = b + 20 print(b) dd_nonlocal() print(b) do_global() print(b) add_b()
def func1(): name = 'alex' print(name) # 1,alex def inner(): nonlocal name name ='老男孩' print(name) #2,老男孩 inner() print(name) # 3, 老男孩 func1()
def func1(*args,**kwargs): print(**kwargs) func1(*[1,2,3],**{'name':'alex'}) #
二、寫函數,接收n個數字,求這些參數數字的和。(動態傳參)
def sum1(*args): ret = 0 for i in args: ret += i return ret print(sum1(1,2,3))
三、讀代碼,回答:代碼中,打印出來的值a,b,c分別是什麼?爲何?
a=10 b=20 def test5(a,b): print(a,b) c = test5(b,a) print(c) a = 10 , b = 20 , c = None
4、讀代碼,回答:代碼中,打印出來的值a,b,c分別是什麼?爲何?
a=10
a=10 b=20 def test5(a,b): a=3 b=5 print(a,b) c = test5(b,a) print(c) a = 3, b = 5, c = None
相關面試題
1,有函數定義以下: 二、Error、2四、八、10、Error def calc(a,b,c,d=1,e=2): return (a+b)*(c-d)+e 請分別寫出下列標號代碼的輸出結果,若是出錯請寫出Error。 print(calc(1,2,3,4,5))__2___ #print(calc(1,2))_Error___print(calc(e=4,c=5,a=2,b=3))_24_ print(calc(1,2,3))___8_ print(calc(1,2,3,e=4))_10__print(calc(1,2,3,d=5,4))_Error___ 2,下面代碼打印的結果分別是__#[10,'a']_______,_#[123]_______,__# [10,'a']______. def extendList(val,list=[]): list.append(val) return list list1 = extendList(10) list2 = extendList(123,[]) list3 = extendList('a') print('list1=%s'%list1) #[10,'a'] print('list2=%s'%list2) #[123] print('list3=%s'%list3) # [10,'a']