函式物件
定義:
函式是第一類物件:函式名指向的值可以被當做引數傳遞
1.函式名可以被傳遞
name = 'jason
'x =name
print(x)
print(id(x))
def func():
print(
'from func')
print(func)
print(id(func))
f =func
func()
print(f)
f() # 其實指向的也是函式func指向函式體**的記憶體位址
2.函式名可以被當做引數傳遞給其他函式
def func():print(
'from func')
def index(args):
print(args)
args()
print(
'from index')
index(1)
index(func)
3.函式名可以被當做函式的返回值
def index():print(
'index')
def func():
print(
'func')
return
index
res =func()
print(res)
res()
4.函式名可以被當做容器型別的引數
def func():print(
'func')
print(func())
l = [1,2,func,func()] # [1,2,0x000001f7d79899d8>,none]
print(l)
函式的巢狀
定義:在函式內部呼叫其他函式,可以將負責的邏輯簡單化
deffuncindex():
func()
print('
index')
deffunc()
print('
func')
index()
列印結果
index
小示例
defmy_max(x,y):
if x >y:
return
x
return
ydef
my_max4(a,b,c,d):
res1 =my_max(a,b)
res2 =my_max(res1,c)
res3 =my_max(res2,d)
return
res3
print(my_max4(1,2,10,4))
函式的巢狀定義
defouterouter():
x = 1
print('
outer')
definner():
print('
inner')
(inner)
return
inner #outer()之後的返回值使用res接收,返回值是inner,因為這個返回值是函式名,加括號則會呼叫
res =outer()
(res)
res()
執行結果
.inner at 0x00000140410aa598>
.inner at 0x00000140410aa598>
inner
命名空間
定義:就是放名字的地方,存放的是變數名與變數值的記憶體位址的繫結關係的地方,要想訪問乙個變數的值,必須先去命名空間中拿到對應的名字,才能夠訪問變數的值
命名空間的分類:
1.內建命名空間:python直譯器提前給你定義好的名字(已經存放到內建命名空間中了)
lenmax
min2.全域性命名空間:檔案級別的**
x = 1if 1 ==1:
y = 2
(y)
while
true:
z = 3
x,y,z都會放到全域性命名空間
if ,for ,while 無論巢狀多少層,他們內部所建立的名字都是全域性命名空間的
3.區域性命名空間:函式體內置立的名字都屬於區域性命名空間
username
生命週期:
內建命名空間:只要python直譯器已啟動立馬建立 關閉python直譯器的時候內建命名空間自動銷毀
全域性命名空間:只要你右鍵執行py檔案會自動建立 py檔案程式執行結束自動銷毀
區域性命名空間:函式被呼叫的時候自動建立 函式指向結束立即銷毀(動態建立動態銷毀)
查詢順序:
由內往外查詢(前提確定自己在的乙個位置)
1.站在區域性看:區域性→全域性→內建
2.站在全域性看:全域性→內建
函式在定義階段查詢名字的順序就已經固定了 不會因為函式的呼叫位置變化而改變
x=111defouter():
definner():
print('
from inner
',x)
return
inner
f=outer()
x = 222f() # 呼叫return出來的函式名
列印結果
222
作用域
全域性作用域(global) global在區域性修改全域性的不可變資料型別
全域性有效: 內建命名空間 全域性命名空間
x = 1 #不可變型別
username = '
jason
'def
func():
global x,username #
修改全域性變數 而不是建立區域性命名空間
x = 999username = '
egon
'func()
(x)print(username)
區域性作用域(nonlocal) nonlocal在區域性修改區域性
區域性有效:區域性作用域
deffunc():
x = 1
defindex():
nonlocal x
x = 2index()
(x)func()
小結:
global:區域性修改全域性 如果想修改多個 逗號隔開
nonlocal:區域性修區域性 如果想修改多個 逗號隔開
函式物件,巢狀,命名空間與作用域
1 函式名可以被傳遞 2 函式名可以被當做引數傳遞給其餘函式 3 函式名可以當做函式的返回值 4 函式名可以當做容器型別的引數 例如 函式名可以被傳遞給變數 deffunc print test f func 變數名f指向函式的記憶體位址 通過該記憶體位址該變數可以找到函式對應的 塊 f 變數名f呼...
函式的巢狀及命名空間 作用域
六.函式的巢狀 1.在函式內又呼叫了其他函式 def max2 x,y 兩個值比較 if x y return x else return yres max2 1,3 print res def max3 x,y,z 三個值比較 res1 max2 x,y res2 max2 res1,z retu...
函式物件,函式巢狀,命名空間,作用域,閉包函式
一 函式物件 函式是第一類物件 值的記憶體位址可以像變數一樣去使用 def foo foo 函式的記憶體位址,可以當做一種變數值去使用 1 函式可以被引用 def foo print hello f foo print f f 2 可以當作引數傳遞 def foo print hello def b...