1. 程式人生 > >函式 / 名稱空間 / 閉包

函式 / 名稱空間 / 閉包

三元運算子

def my_max(a,b):
    return a if a>b else b     #當a>b成立返回a,否則返回b

引數:

實參 : 1.位置引數 2. 關鍵字引數 3. 混合引數

形參 : 1.位置引數 2. 預設值引數  

動態傳參:

1. 動態接收位置引數

def func(a, b, *arg):    #動態接受引數是:動態引數必須在位置引數之後
    pass     

2.接收預設值引數

def fruit(a, b, c='apple', *food): 
    
pass

三種引數順序 : 位置引數, 動態引數*, 預設值引數 

3.動態接受關鍵詞引數

def func(**kwargs):
    pass
func(a=1, b=2, c=3) 
func(a=1, b=2) 

最終順序(*):    位置引數 >  *args > 預設值引數 > **kwargs

名稱空間(儲存變數)

分類

1.全域性名稱空間  → 直接在py檔案中,函式外宣告的變數都屬於全域性名稱空間

2.區域性名稱空間  → 在函式中宣告的變數會放在區域性名稱空間

3.內建名稱空間  → 存放python直譯器為我們提供的名字,list,tuple,str,int這些都是內建名稱空間

取值順序:

  1.區域性名稱空間

  2.全域性名稱空間

  3.內建名稱空間

作用域(作用範圍)

分類

1.全域性作用域 : 全域性名稱空間 + 內建名稱空間

2.區域性作用域 : 區域性名稱空間 

globals()   # 列印全域性作用域中的內容

locals()    #列印區域性作用域中的內容

global 和 nonlocal

global表示不再使用區域性作用域的內容,而改用全域性作用域中的變數

a = 100 
def func():   
    global a    #可以修改全域性變數a,僅限當前函式使用
    a = 28    
    print(a) 

func() 
print(a)    # ===>>28   28

nonlocal表示在區域性作用域中,呼叫父級名稱空間的變數

函式名的運用

1.函式名的記憶體地址 print(func)   ==>   <function func at 0x1101e4ea0>

2.函式名可以賦值給其他變數

3.函式名可以當做容器類的元素

4.函式名可以當做函式的引數

5.函式名可以作為函式的返回值

閉包 內層函式,對外層函式(非全域性)的變數的引用

def outer():    
    name = "Amy"    
    # 內部函式    
    def inner():        
        print(name)    
    return inner   #外部函呼叫內部函式
    
fn = outer()   # 訪問外部函式, 獲取到內部函式的函式地址
fn()    

閉包好處: 在外界可以訪問內部函式; 內部函式訪問了外層函式的變數.這個變數將會常駐記憶體,供後面的程式使用

from urllib.request import urlopen
def web_content():
    content = urlopen('https://tieba.baidu.com/').read().decode("utf-8")
    def get_content():
        return content     #儲存content的內容,方便後續使用
    return get_content

fn = web_content()
content = fn()
print(content)