1、函數對象python
一、 函數名是能夠被引用的函數
def foo(): print('from foo') res = foo #把函數名foo給了res,res和foo指向了同一個內存地址 res() #from foo
二、函數名能夠當作參數傳遞spa
def foo1(a,b): #a=1,b=foo2 print(a) #1 b() #b() 即foo2() 去執行foo2()的函數,結果:from foo2 def foo2(): print('from foo2') foo1(1, foo2) #foo2做爲參數傳給了b
三、函數名能夠當作返回值使用code
def foo(x): return x def foo1(): print('from foo1') res = foo(foo1) #把函數名foo1給了x,調用foo()函數返回foo1,而後把foo1給了res res() #res() 便是foo1()
四、函數名能夠當作容器類型的元素對象
def func(): print('from func') l1 = [1,'2',func] l = l1[2] #即l=func l() #func()
4.一、購物車:blog
func_dic = { '1': register, '2': login, '3': shopping, '4': pay } def main(): while True: print(""" 一、註冊 二、登陸 三、購物 四、付款 五、退出 """) choice = input("請輸入對應的編號:").strip() if choice == '5': break if choice not in func_dic: continue else: func_dic[choice]() main()
2、函數的嵌套生命週期
2.一、函數的嵌套調用:在函數內調用函數ip
2.二、函數的嵌套定義:在函數內部定於函數內存
3、名稱空間作用域
3.一、名稱分類
3.1.一、內置名稱空間:python提早給定好的名字,好比內建函數名len,print。
3.1.二、全局名稱空間:存放於文件級別的名字,頂格的名稱。
3.1.三、局部名稱空間:函數內部定義的名字。
3.二、名稱空間的生命週期
3.2.一、內置名稱空間:伴隨着python解釋器的啓動而產生,關閉而回收。
3.2.二、全局名稱空間:伴隨着pytho文件的開始執行而產生,執行完畢而回收。
3.2.三、局部名稱空間:伴隨着函數的調用而產生,函數結束調用而回收。
3.三、名稱空間的順序
加載順序:內置名稱空間 > 全局名稱空間 > 局部名稱空間
查找順序:局部名稱空間 > 全局名稱空間 > 內置名稱空間
# 函數內部使用的名字,在定義階段就已經規定死了,與你的調用位置無關
def func1(): x = 2 def func2(): x = 3 print('func2:', x) func2() print('func1:', x) func1()
4、做用域
4.一、分類
4.1.一、全局做用域
位於全局名稱空間、內置名稱空間中的名字屬於全局範圍。該範圍內的名字全局存活、全局有效(在任意位置均可以使用)。
4.1.二、局部做用域
位於局部名稱空間的名字屬於局部範圍。該範圍內的名字臨時存活(即在函數調用時臨時生成,函數調用結束後就釋放)、局部有效(只能在函數內使用)。
4.二、做用域與名字查找優先級
4.2.一、在局部做用域查找名字時,起始位置是局部做用域,因此先查找局部名稱空間,沒有找到,再去全局做用域查找:先查找全局名稱空間,沒有找到再查找內置名稱空間,最後沒找到拋出異常。
x = 1 def foo2(): x = 2 def foo3(): x = 3 print(x) #x=1 foo3() foo2()
4.2.二、在全局做用域查找名字時,起始位置時全局做用域,因此先查找全局名稱空間,沒有找到再查找內置名稱空間,最後沒找到拋出異常。
x = 1 def foo2(): x = 2 foo2() print(x) #1
#4.2.三、python支持函數的嵌套定義,在內嵌的函數查找名字時,會優先查找本身局部做用域的名字,而後由內而外一層層查找外部嵌套函數定義的做用域,都沒有找到,則查找全局做用域。
x = 1 def foo(): x = 2 def foo1(): x = 3 def foo2(): # x = 4 def foo3(): x = 5 print('foo3:',x) #5 foo3() print('foo2:',x) #4 foo2() print('foo1:',x) #3 foo1() print(x) #2 foo()
#在函數內,不管嵌套多少層,均可以查看到全局做用域的名字,若要在函數內修改全局名稱空間的名字值,須要用到global關鍵字
x = 1 def foo2(): global x x = 2 foo2() print(x) #2
#nonlocal x = 1 def foo2(): x = 2 def foo3(): nonlocal x x = 3 print(x) x=3 foo3() foo2()