一、函數對象
函數是第一類對象:函數名指向的值可以被當做參數傳遞
1.函數名可以被傳遞
def func():print('func')f = func # 函數名可以當做變量名 print(f) # f指向的也是函數func指向函數體代碼的內存地址
?
2.函數名可以被當做參數傳遞給其他參數
def func():print('from func')def index(args):print(args)args() # from funcprint('from index') index(func) #把func這個函數名傳遞給args,打印出來的結果為:<function func at 0x0000028A85681F28>#from index
?
3.函數名可以被當作函數的返回值
def index():print('index')def func():print('func')return index res = func() # func print(res) # 函數名的內存地址:<function index at 0x000001E573521F28> res() # 返回值:index
?
4.函數名可以被當作容器類型的參數
def func():print('func') # func print(func()) # None l = [1,2,func,func()] # func print(l) # [1,2,<function func at 0x000001F7D79899D8>,None
?
?
二、函數嵌套
1.函數嵌套的調用
在函數內部調用其他函數
可以將復雜的邏輯簡單化
# def max2(x,y): # if x > y: # return x # else: # return y# def max3(x,y,z): # res1=max2(x,y) # 先比較x和y的值 # res2=max2(res1,z) # 較大的值與z進行比較 # return res2 # 返回較大的值 # print(max3(7,8,9))
2.函數嵌套的定義
def outer():x = 1print('outer')def inner():print('inner')# print(inner)return innerres = outer() # outer print(res) # <function outer.<locals>.inner at 0x000001F19F822AE8> res() # inner
?
三、名稱空間
存放的是變量名與變量值的內存地址的綁定關系的地方
想要訪問一個變量的值,必須先去名稱空間拿到對應的名字,才能夠訪問變量的值
1.名稱空間的分類
1》內置名稱空間:python解釋器提前給你定義好的名字(已經存放在內置名稱空間),如len,max
2》全局名稱空間:文件級別的代碼(if for while 無論嵌套多少層,它們內部所創建的名字都是全局名稱空間)
3》局部名稱空間:函數體內創建的名字都屬于局部名稱空間
?
2.生命周期
內部名稱空間:只要python解釋器已啟動立馬創建,關閉python解釋器的時候內置名稱空間自動銷毀
全局名稱空間:只要右鍵運行py文件會自動創建,py文件程序運行結束自動銷毀
局部名稱空間:函數調用的時候自動創建,函數指向結束立即銷毀(動態創建動態銷毀)
?
3.名字查找的順序
1》站在全局的角度:全局>內置
2》站在局部的角度:局部>全局>內置
x = 1 def f1():x = 2def f2():x = 3def f3():x = 4def f4:x = 5print(x)f4()f3()f2() f1()#當需要調用f1的時候,會站在f4的局部去取值,如果f4沒值就會取f3的值,按照局部>全局>內置這個順序去取值
注意:
函數在定義階段查找名字的順序就已經固定了 不會因為函數的調用位置變化
?
?
四、作用域
1.全局作用域
? ? ? ? ? ? ? ? ? ? 全局有效:內置名稱空間? 全局名稱空間
2.局部作用域
? ? ? ? ? ? ? ? ? ?局部有效 : 局部名稱空間
3.glolal
在局部修改全局的變量,如果需要修改多個,用逗號隔開
x = 1def func():x = 2 func() print(x) # 1#首先,調用函數func在全局名稱空間,所以要站在全局名稱空間這個角度去看,就不需要考慮 #局部名稱空間了,全局有 x = 1 這個數,所以打印結果就為1#如果就要將打印結果變為局部 x = 2這個數呢?該怎么操作? x = 1def func():global x # 在局部修改全局的變量x = 2 func() print(x) # 2
?
4.nonlocal
在局部修改局部的變量,如果想修改多個,用逗號隔開
def func():x = 1def index():nonlocal x # 局部修改局部x = 2index()print(x) func() # 2
?