一、函式物件
函式是第一類物件:函式名指向的值可以被當做引數傳遞
1.函式名可以被傳遞
def2.函式名可以被當做引數傳遞給其他函式func():
print('
from func')
f = func #
函式名可以被傳遞,這裡用乙個變數名賦值
func() #from func
print(f) #
這裡列印的是函式的記憶體位址
f() #
f()等價於 func()
def3.函式名可以被當做函式的返回值func():
print('
from func')
defindex(args):
print(args) #
等價於print(func) 列印函式func記憶體位址
args() #
執行函式func() 執行內部**
print('
from index')
index(func)
#函式名func當做引數名傳遞到index函式中#結果
##from func
#from index
def4.函式名可以被當做容器型別的引數index():
print('
index')
deffunc():
print('
func')
return
index
res = func() #
返回值是 index
print(res) #
列印函式名index的記憶體位址
res() #
呼叫執行index()函式#結果
#func##
index
def二、函式呼叫 (在乙個函式內部呼叫其他函式,可以將複雜的邏輯簡單化)func():
print('
func')
print(func()) #
func none
l = [1,2,func,func()]
(l)#
結果func
none
func
#為什麼結果有這個,因為在l呼叫了函式func(),所以列印乙個func
[1, 2, , none]
def三、命名空間index():
func()
print('
index')
deffunc():
print('
func')
index()
#呼叫index()之後,func()已經被定義了,可以被呼叫
命名空間的分類:
1.內建空間名稱:python直譯器提前給你定義好的名字(已經存放在內建命名空間了)
就是一些內建函式:比如 len()/max()....
2.全域性命名空間:檔案級別的**
3.區域性命名空間:函式體內置立的名字都屬於區域性命名空間
def總結:生命週期func():
username = '
jason'#
這個username是區域性命名空間
(username)
func()
內建命名空間:只要python直譯器已啟動立馬建立 關閉python直譯器的時候內建命名空間自動銷毀(針對於python直譯器)
全域性命名空間:只要你執行py檔案的時候會自動建立 py檔案程式執行結束自動銷毀 (針對於py檔案)
區域性命名空間:函式被呼叫的時候建立 函式結束就銷毀(針對於函式的呼叫開始結束)
四、命名空間的查詢順序
注意:先要確定好你當前在哪(在哪個空間)
查詢順序
1.如果你現在在全域性: 全域性 >>>內建 (先從全域性找再到內建)
2.如果你現在在區域性:區域性》全域性》內建(先從區域性找再到全域性再到內建)
例題:區域性命名空間:先定位要列印的len屬於什麼空間,因為它是在函式裡面的變數,所以它是區域性命名空間,先找區域性變數,正好函式裡面有乙個變數名賦值,所以這個len就從這取值
len = '全域性和區域性:我們先來看紅色的len,這個len在全域性的位置,查詢順序先從全域性開始,不會找到函式內部的區域性。在全域性裡面已經有乙個定義的len,所以用這個 '我是全域性命名空間的len'。然後函式裡面的len就和上面的一樣了。我是全域性命名空間的len
'def
func():
len = '
我是區域性命名空間的len
(len)
func()
len = '我是全域性命名空間的len
'def
func():
len = '
我是區域性命名空間的len
(len)
print(len) #
我現在站在的是全域性的位置
func()
#結果#我是全域性命名空間的len
#我是區域性命名空間的len
def全域性:如果把上一道題的區域性x刪掉,就要到全域性裡面找,找到x=999在函式呼叫之前已經定義了,最後結果就是999func():
x = 1
defindex():
print(x) #
1return
index
res =func()
x = 999res()
def全域性:x定位到區域性,但是在inner裡面找不到,outer裡面也找不到,所以x是使用全域性,後面的inner在**呼叫,x都是在全域性找值func():
defindex():
print(x) #
999return
index
res =func()
x = 999res()
x=111總結:函式在定義階段就已經固定查詢名字的順序了,不會因為函式呼叫的位置改變而改變defouter():
definner():
print('
from inner
',x) #
from inner 111
return
inner
f=outer()
deffunc():
x=333f()
func()
五、作用域
作用域就是作用範圍,按照生效範圍可以分為全域性作用域和區域性作用域
全域性作用域:包含內建命名空間、全域性命名空間,在整個檔案的任意位置都能被引用,全域性有效
區域性作用域:區域性命名空間、只能在區域性範圍生效
global和nonlocal
global:在區域性修改全域性的不可變資料型別
在下面這個如果不是用global,後面x和username列印的全域性的值,就是1,jason。如果你使用了global,改變了全域性變數的值,在下面設定x = 999,username = 'egon',列印的值也是這個。
nonlocal:區域性修改區域性(函式巢狀)
如果沒有加nonlocal,x在區域性找值,x=1。nonlocal 修改了前面x的值,在列印的時候變成2
總結:global:區域性修改全域性,如果有多個,用逗號隔開
nonlocal:區域性修改區域性,如果有多個,用逗號隔開
高階元件 高階函式 一
antd裡面的form表單方面,遇到乙個高階函式,以及高階元件,於是看了一下這方面內容,前輩們的文章寫得也非常詳細,這裡就稍微kobe一下 高階函式與高階元件 高階函式 高階函式,是一種特別的函式,接受的引數為函式,返回值也是函式 成立條件,二者兼一即可 1 一類特別的函式 a 接受函式型別的引數 ...
python高階一 高階函式
1 函式式程式設計 python特點 不是純函式式程式設計 允許變數存在 支援高階函式 可以傳入函式作為變數 支援閉包 可以返回函式 有限度的支援匿名函式 高階函式 變數可以指向函式 函式的引數可以接收變數 乙個函式可以接收另乙個函式作為引數 def add x,y,f return f x f y...
hash函式高階一
通過乙個例子來熟悉hash函式的功能作用以及如何使用。1 有100萬個ip位址,從中查詢是否存在待查的ip位址 2 使用hash對映來實現 1 hash表面上看起來只是將輸入物件雜湊到hash表中,其實在使用使用中過程有 2 使用c語言的隨機函式生成ip位址,模擬海量資料處理 define maxi...