2019 07 10 函式的高階(一)

2022-01-21 23:50:56 字數 4033 閱讀 6939

一、函式物件

函式是第一類物件:函式名指向的值可以被當做引數傳遞

1.函式名可以被傳遞

def

func():

print('

from func')

f = func #

函式名可以被傳遞,這裡用乙個變數名賦值

func() #from func

print(f) #

這裡列印的是函式的記憶體位址

f() #

f()等價於 func()

2.函式名可以被當做引數傳遞給其他函式

def

func():

print('

from func')

defindex(args):

print(args) #

等價於print(func) 列印函式func記憶體位址

args() #

執行函式func() 執行內部**

print('

from index')

index(func)

#函式名func當做引數名傳遞到index函式中#結果

##from func

#from index

3.函式名可以被當做函式的返回值

def

index():

print('

index')

deffunc():

print('

func')

return

index

res = func() #

返回值是 index

print(res) #

列印函式名index的記憶體位址

res() #

呼叫執行index()函式#結果

#func##

index

4.函式名可以被當做容器型別的引數

def

func():

print('

func')

print(func()) #

func none

l = [1,2,func,func()]

print

(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是區域性命名空間

print

(username)

func()

總結:生命週期

內建命名空間:只要python直譯器已啟動立馬建立   關閉python直譯器的時候內建命名空間自動銷毀(針對於python直譯器)

全域性命名空間:只要你執行py檔案的時候會自動建立   py檔案程式執行結束自動銷毀 (針對於py檔案)

區域性命名空間:函式被呼叫的時候建立  函式結束就銷毀(針對於函式的呼叫開始結束)

四、命名空間的查詢順序

注意:先要確定好你當前在哪(在哪個空間)

查詢順序    

1.如果你現在在全域性:   全域性  >>>內建   (先從全域性找再到內建)

2.如果你現在在區域性:區域性》全域性》內建(先從區域性找再到全域性再到內建)

例題:區域性命名空間:先定位要列印的len屬於什麼空間,因為它是在函式裡面的變數,所以它是區域性命名空間,先找區域性變數,正好函式裡面有乙個變數名賦值,所以這個len就從這取值

len = '

我是全域性命名空間的len

'def

func():

len = '

我是區域性命名空間的len

'print

(len)

func()

全域性和區域性:我們先來看紅色的len,這個len在全域性的位置,查詢順序先從全域性開始,不會找到函式內部的區域性。在全域性裡面已經有乙個定義的len,所以用這個  '我是全域性命名空間的len'。然後函式裡面的len就和上面的一樣了。

len = '

我是全域性命名空間的len

'def

func():

len = '

我是區域性命名空間的len

'print

(len)

print(len) #

我現在站在的是全域性的位置

func()

#結果#我是全域性命名空間的len

#我是區域性命名空間的len

def

func():

x = 1

defindex():

print(x) #

1return

index

res =func()

x = 999res()

全域性:如果把上一道題的區域性x刪掉,就要到全域性裡面找,找到x=999在函式呼叫之前已經定義了,最後結果就是999

def

func():

defindex():

print(x) #

999return

index

res =func()

x = 999res()

全域性:x定位到區域性,但是在inner裡面找不到,outer裡面也找不到,所以x是使用全域性,後面的inner在**呼叫,x都是在全域性找值

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...