11函数对象函数的嵌套名称空间与作用域
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11函数对象函数的嵌套名称空间与作用域相关的知识,希望对你有一定的参考价值。
一、函数对象
函数对象,函数是第一类对象,即函数可以当做数据传递
具体特点:
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(): 2 print(‘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 def insert(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函数对象函数的嵌套名称空间与作用域的主要内容,如果未能解决你的问题,请参考以下文章