天天看點

十、函數進階

形參中的動态參數

def func(a,b,*args,c='f',**kwargs):
    print(a)
    print(b)
    print(args)
    print(c)
    print(kwargs)
func(9,2,3,4,45,6,c='3',d=45,f='pp')
#9
 2
 (3, 4, 45, 6)
 3
 {'d': 45, 'f': 'pp'}      

args  是把實參中多餘的的位置參數放到一個元祖中     

kwargs  是把實參中多餘的關鍵字參數放到一個字典中

最終的形參的排列順序:位置參數,*args,預設參數,**kwargs

*   在函數的調用執行時,輸入的參數為可疊代對象可以将元素意義添加到args

**  再函數調用執行時,可以将字典的所有的鍵值對放到一個字典中給kwargs(這種方式的字典的鍵必須是字元串)

def func(*args,**kwarg):
    print(args)
    print(kwarg)
dic1 = {2:'dsd','4':"dfaf"}
dic2 = {'3':'rerre','5':'vxcvxvcx'}
func(*[2,3,4,4,5],*dic1,**dic2)
#(2, 3, 4, 4, 5, 2, '4')
   {'3': 'rerre', '5': 'vxcvxvcx'}
      

命名空間一共分為三種:

  全局名稱空間

  局部名稱空間

  内置名稱空間

*内置命名空間中存放了python解釋器為我們提供的名字:input,print,str,list,tuple...它們都是我們熟悉的,拿過來就可以用的方法。

三種命名空間之間的加載與取值順序:

加載順序:内置命名空間(程式運作前加載)->全局命名空間(程式運作中:從上到下加載)->局部命名空間(程式運作中:調用時才加載)

取值順序:不能逆向取值

  在局部調用:局部命名空間->全局命名空間->内置命名空間

  在全局調用:全局命名空間->内置命名空間

綜上所述,在找尋變量時,從小範圍,一層一層到大範圍去找尋。

作用域

作用域就是作用範圍,按照生效範圍可以分為全局作用域和局部作用域。

全局作用域:包含内置名稱空間、全局名稱空間,在整個檔案的任意位置都能被引用、全局有效

局部作用域:局部名稱空間,隻能在局部範圍内生效

globals()   locals()  的用法

a = 2
b = 3
def func():
    c = 4
    d = 5
    print(globals())
    print(locals())
func()
#{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000020251399588>, '__spec__': None, 
'__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'H:/pycharm檔案/day10/課堂練習.py', '__cached__': None, 'a': 2, 'b': 3, 'func': <function func at 0x000002024F501E18>}
{'d': 5, 'c': 4}      将變量和對應的值用字典表示出來
      

  

global  在局部變量中聲明一個全局變量  并且改變全局變量

nonlocal   在函數嵌套中通過在局部作用域中,對父級作用域(或者更外層作用域非全局作用域)的變量進行引用和修改,并且引用的哪層,從那層及以下此變量全部發生改變。