Python學習日記day10
阿新 • • 發佈:2017-12-27
1.2 命名 get input div 原則 ret 同名 傳值
6.1nonlocal a #聲明了一個上面第一層局部變量
1,參數陷阱
如果默認參數的只是一個可變數據類型,那麽每一次調用的時候,如果不傳值就共用這個數據類型的資源。2,三元運算
c=a if a>b else b#如果a》b返回a,否則,返回b 變量 =條件返回True的結果 if 條件 else 條件返回False的結果 必須要有結果 必須要有if和else 只能是簡單的情況 def func(a,b): a if a>b else b print(func(5,1))3,命名空間與作用域
3.1命名空間的種類
命名空間有三種 內置、全局與局部 3.1.1#內置命名空間-----python解釋器 #就是python解釋器一啟動就可以使用的名字存儲在內置命名空間中 #內置的名字在啟動解釋器的時候被加載進內存裏 3.1.2#全局命名空間----我們寫的代碼但不是函數中的代碼 #是在程序從上到下被執行的過程中一次被執行進內存的 #放置了我們設置的所有變量名和函數名 3.1.3#局部命名空間----函數 #就是函數內部定義的名字(定義在函數裏的名字) #當調用函數的時候在會產生這個名稱空間,隨著函數執行的結束,這個命名空間就又消失了。 #在局部:可以使用全局、也可以使用內置命名空間中的名字 #在全局:可以使用內置命名空間中的名字,但不能使用局部命名空間中的名字 #在內置:不能使用局部和全局的名字的 3.1.4內置命名空間、全局命名空間與局部命名空間的關系:依賴倒置原則:上層模塊應該依賴下層模塊,不能反向依賴
在正常情況下,直接使用內置的名字。 當我們在全局定義了和內置名字空間中同名的名字時,會使用全局的名字。 當只有的時候,就不會找上一級要 如果自己沒有就找上一級要 如果上一級沒有,就再向上一級要 多個函數擁有多個獨立的局部明明空間,不互相共享def input(): print(‘in input now‘) def func(): input() func()
4,作用域有兩種
全局作用域與局部作用域
#全局作用域--->作用在全局----內置和全局名字空間中的名字都屬於全局作用域--globals() #局部作用域--->作用在局部----函數(局部名字空間中的名字屬於局部作用域-----locals()a =1 def#對於不可變數據類型在局部可以查看全局作用域中的變量,但是不能直接修改 #如果想要修改需要在程序的一開始添加global聲明 #如果在一個局部內(函數)內聲明了一個global變量,這個變量在局部的所有操作將對全局變量有效func(): global a a+=1 func() print(a)
# a = 1 # b = 2 # def func(): # x = ‘aaa‘ # y = ‘bbb‘ # print(locals()) # print(globals()) # # func() # print(globals()) ##globals 永遠打印全局的名字 #locals輸出什麽 根據locals所以在的位置print(locals()) #本地的--->在函數體的外部使用locals,作用與globals是相同的
a =1 b =2 print(globals()) print(locals())
5,函數的嵌套調用
def max(a,b) return a if a>b else b def the_max(x,y,z): c =max(x,y) return max(c,z) print(the_max(1,2,3))
在一個函數的函數體內調用另一個函數叫做函數的嵌套調用
6,函數的嵌套定義
內部函數可以使用外部函數的變量叫做函數的嵌套
def outer(): def inner(): print(‘inner‘) def inner2(): a+=1 #不可變數據類型的修改 print(a,b) print(‘inner2‘) inner2() inner() outer()
def outer(): a =1 def inner(): b =2 print(a) print(‘inner‘) def inner2(): a+=1 print(‘inner2‘) inner2() inner() print(‘**a**:‘,a) outer()
6.1nonlocal a #聲明了一個上面第一層局部變量
a =1 def outer(): a=1 def inner(): b=2 print(a) print(‘inner‘) def inner2(): nonlocal a a+=1 inner2() inner() print(‘**a**:‘,a) outer() print(‘全局:‘,a)#nonlocal 只能用於局部變量,找上層中離當前函數最近一層的局部變量 #生命了nonlocal的內部函數的變量修改會影響到離當前函數最近一層的局部變量 對全局無效 對局部也只對最近的一層有影響
7,作用域鏈
在內部函數適用變量的時候,是從小局部到大局部到全局到內置名字的過程,一級一級往上找,找到最近的一個就使用一一作用域鏈a =0 def outer(): def inner(): def inner2(): print(a) inner2() inner() outer()函數名的本質--------第一類對象 7.1函數名可以賦值
def func(): print(123) func2 =func func2()
7.2數名可以作為容器類型的元素
def func(): print(123) func() #函數名就是內存地址 func2 = func #函數名可以賦值 func2() l = [func,func2] #函數名可以作為容器類型的元素 print(l) for i in l: i()7.3函數名可以作為函數的參數和返回值:
def func(): print(123) def wahaha(f) f() wahaha(func)
7.4函數名可以作為函數的返回值
def func(): print(123) def wahaha(f) f() return f qqxing =wahaha(func) qqxing()
8,閉包:嵌套函數,且內部函數要調用外部函數的變量
def outer(): a =1 def inner():#--->inner是一個閉包 print(a) print(inner._closure_) outer常見的閉包函數形式
def outer(): a =1 def inner():#--->inner是一個閉包 print(a) return inner outer inn =outer() inn()
在一個函數的外部調用內部的函數 閉包函數應用:
def get_url(): urlopen(‘http://www.xiaohua100.cn/index.html‘).read() def inner(): ret = urlopen(url) print(ret) return inner get_func =get_url() get_func()
Python學習日記day10