11、函數對象、函數的嵌套、名稱空間與作用域
阿新 • • 發佈:2017-06-01
() update 啟動 nbsp money 有效 產生 strip() return
一、函數對象
函數對象,函數是第一類對象,即函數可以當做數據傳遞
具體特點:
1、可以被引用;
1 def foo(): 2 print(‘from foo‘) 3 4 func=foo 5 6 print(foo) 7 print(func) 8 func()
2、可以當作參數傳遞
1 def foo(): 2 print(‘from foo‘) 3 4 def bar(func): 5 print(func) 6 func() 7 8 bar(foo)
3、返回值可以是函數
1 def foo(): 2print(‘from foo‘) 3 4 def bar(func): 5 return func 6 7 f=bar(foo) 8 9 print(f) 10 11 f()
4、可以當作容器類型的元素
1 def foo(): 2 print(‘from foo‘) 3 dic={‘func‘:foo} 4 5 print(dic[‘func‘]) 6 7 dic[‘func‘]()
具體應用場景:
1 def select(sql): 2 print(‘========>select‘) 3 4 definsert(sql): 5 print(‘========>add‘) 6 7 def delete(sql): 8 print(‘=======>delete‘) 9 10 def update(sql): 11 print(‘-=---->update‘) 12 13 14 func_dic={ 15 ‘select‘:select, 16 ‘update‘:update, 17 ‘insert‘:insert, 18 ‘delete‘:delete 19 } 20 21 def main():22 while True: 23 sql = input(‘>>: ‘).strip() 24 if not sql:continue 25 l = sql.split() 26 cmd=l[0] 27 if cmd in func_dic: 28 func_dic[cmd](l) 29 30 main() 31 # def main(): 32 # sql = input(‘>>: ‘) 33 # l = sql.split() 34 # print(l) 35 # if l[0] == ‘select‘: 36 # select(l) 37 # elif l[0] == ‘insert‘: 38 # insert(l) 39 # elif l[0] == ‘delete‘: 40 # delete(l) 41 # elif l[0] == ‘update‘: 42 # update(l)
二、函數的嵌套
1、函數的嵌套調用
1 def max2(x,y): 2 return x if x > y else y 3 4 5 def max4(a,b,c,d): 6 res1=max2(a,b) 7 res2=max2(res1,c) 8 res3=max2(res2,d) 9 return res3 10 11 print(max4(10,99,31,22))
2、函數的嵌套定義
1 def f1(): 2 3 def f2(): 4 print(‘from f2‘) 5 def f3(): 6 print(‘from f3‘) 7 f3() 8 f2() 9 f1()
三、名稱空間與作用域
名稱空間:存放名字的地方,三種名稱空間
1、定義名字的方法
1 import time 2 3 name=‘egon‘ 4 5 def func(): 6 pass 7 8 class Foo: 9 pass
2、三種名稱空間
1)內置名稱空間:隨著python解釋器的啟動而產生
1 print(sum) 2 print(max) 3 print(min) 4 5 6 print(max([1,2,3])) 7 8 import builtins 9 for i in dir(builtins): 10 print(i)
2)全局名稱空間:文件的執行會產生全局名稱空間,指的是文件級別定義的名字都會放入改空間
1 x=1 2 if x ==1 : 3 y=2 4 import time 5 6 name=‘egon‘ 7 8 def func(): 9 pass 10 11 class Foo: 12 pass 13 14 #==================== 15 16 x=1 17 18 19 def func(): 20 money=2000 21 x=2 22 print(‘func‘) 23 print(x) 24 print(func) 25 func() 26 print(money) 27 28 func() 29 print(x)
3)局部名稱空間:調用函數時會產生局部名稱空間,只在函數調用時臨時綁定,調用結束解綁定
1 x=10000 2 def func(): 3 x=1 4 def f1(): 5 pass
ps:
作用域:
1. 全局作用域:內置名稱空間,全局名層空間
2. 局部作用:局部名稱空間
3、名字的查找順序:局部名稱空間---》全局名層空間---》內置名稱空間
1 x=1 2 def func(): 3 # x=2 4 # print(x) 5 # sum=123123 6 print(sum) 7 func() 8 9 10 11 def func(): 12 x=2 13 14 func() 15 16 print(x)
查看全局作用域內的名字:gloabls()
查看局局作用域內的名字:locals()
1 x=1000 2 def func(): 3 x=2 4 5 print(globals()) 6 7 print(locals()) 8 print(globals() is locals())
1 x=1000 2 def func(y): 3 x=2 4 print(locals()) 5 print(globals()) 6 7 func(1)
#全局作用域:全局有效,在任何位置都能被訪問到,除非del刪掉,否則會一直存活到文件執行完畢
#局部作用域的名字:局部有效,只能在局部範圍調用,只在函數調用時才有效,調用結束就失效
1 x=1 2 3 def f1(): 4 print(x) 5 6 def foo(): 7 print(x) 8 9 def f(x): 10 # x=4 11 def f2(): 12 # x=3 13 def f3(): 14 # x=2 15 print(x) 16 17 f3() 18 f2() 19 20 f(4)
11、函數對象、函數的嵌套、名稱空間與作用域