動態參數 命名空間

動態參數:
用戶傳入到函數的實參數量不定時,或者是爲了之後拓展,此時要用到動態參數*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)
View Code
他們的順序:
位置參數,*arge,默認參數,**kwargs
1def func2(a, b,*args,sex=''):
    print(a)
    print(b)
    print(args)
    print(sex)
func2(1,2,5,6,7,8,9,sex='')
View Code
2def 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  字典的形式
3def func2(a,b,sex=''):
    print(a)    #1
    print(b)      #  2
    print(sex)    #
func2(1,2,'')
View Code
 
 
4def func2(a,b,sex='',*args):
    print(a)      #1
    print(b)       #2
    print(args)   #(55,66)
    print(sex)     #44
func2(1, 2, 44,  55, 66)
View Code
簡單的加法計算:
def sum1(*args):
    ret = 0
    for i in args:
        ret += i
    return ret
print(sum1(1,2,3))
View Code
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)
View Code
*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)
View Code
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)
View Code
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)
View Code
s1 = 'bfhfbdb'
s2 = 'jdfjdgsgg'
func3(*s1,*s2)
#tu1 = (1,2,3)
#tu2 = (11,22,33)
#func3(*tu1,*tu2)   #(1, 2, 3, 11, 22, 33)
View Code

 

當程序運行時,代碼從上至下一次讀取,遇到變量與值,
他會在內存中開闢一個空間,存放變量與值的內存地址的對應關係。
這樣存儲變量與值得對應關係的空間叫作名稱空間(命名空間)。
當解釋器遇到函數時,他會將函數名存儲在內存中,可是對於函數體莫不關心。
當函數執行時,他會經過函數名找到函數體,而後將函數體裏面的變量等對應關係存放在一個
臨時開闢的空間中,隨着函數的結束,臨時的空間關閉,這樣的空間叫作臨時名稱空間。
name = 'alex'
age = 1000

def func1():
    a = 2
    b = 3
func1()
View Code
內置名稱空間:
len() print() input() list
名稱空間:
內置名稱空間 全局名稱空間 局部名稱空間
加載順序內置名稱空間---->  全局名稱空間(程序運行時)------>局部名稱空間(函數執行時) 執行順序:當代碼執行時,從上至下一次執行。 做用域: 全局做用域:內置名稱空間 全局名稱空間 局部做用域:局部名稱空間
取值順序單項):局部名稱空間(函數執行時)--->所有名稱空間---->內置名稱空間
加載順序:
name = 'alex'
def func1():
    a = 3
func1()
View Code
取值順序:
1,
name = '老男孩'
def func1():
    name = 'alex'
    print(name)
func1()
View Code
name = '老男孩'
def func1():
    print(name)
func1()
View Code
sum = 666
name = '老男孩'
def func1():
    #sum = 555
    print(sum)
func1()
View Code
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()
View Code

練習題;面試

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
View Code
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
View Code
def func1():
    a = 666
    print(666)
View Code
def func2():
    name = 'taibai'
    print(name)
    func1()
View Code
print(333)
func2()
print(555)  #333  taibai  666   555
global
View Code
global:
def func1():
    name = 'alex'
    print(name)


print(name)     會報錯
View Code
1def func1():
    name = 'alex'
    print(name)
    return name
ret = func1()
print(ret)
2def func1():
    global name
    name = 'alex'
func1()
print(name)      # alex
3,
name = '老男孩'
def func1():
    global name
    name = 'alex'
func1()
print(name)     # alex
View Code
global:
在全局名稱空間裏獲得局部名稱空間的變量
1,return
2,global
   1),在局部做用域中聲明一個全局變量。
   2),在局部做用域中,更改一個全局變量。
(改變全局變量,遇到global,global下面變量的值將覆蓋全局變量的值)
補充:
對於可變的數據類型,函數中若是對其進行操做,改變全局不用引用global
函數中若是使用global + 變量 必須是第一次使用這個變量。
 
       
flag = True
def func1():
    if flag:
        print(333)
    global flag
    flag = False
func1()
View Code
 
         

做用域的問題:
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]
View Code
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()
View Code
 
         
def func1():
    name = 'alex'
    print(name)   # 1,alex
    def inner():
        nonlocal name
        name ='老男孩'
        print(name)   #2,老男孩
    inner()
    print(name)  # 3,   老男孩
func1()
View Code
def func1(*args,**kwargs):
    print(**kwargs)
func1(*[1,2,3],**{'name':'alex'})   #
print接收不了關鍵字參數,會報錯
View Code
二、寫函數,接收n個數字,求這些參數數字的和。(動態傳參)
def sum1(*args):
    ret = 0
    for i in args:
        ret += i
    return ret
print(sum1(1,2,3))
View Code
三、讀代碼,回答:代碼中,打印出來的值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
View Code
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
View Code
相關面試題
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']
View Code
相關文章
相關標籤/搜索