三.函数对象、函数嵌套、名称空间、作用域、闭包函数、装饰器
一.函数对象
1.1函数在python中是第一类对象?
指的是函数能像变量一样使用,变量能怎么用函数就能怎么用
四种用法
1.可以被引用
x=1 y=x def bar(): print('from bar') f=bar f()
2.可以当做参数传入
x=1 def func(a): print(a) func(x) def bar(): print('from bar') def wrapper(func): #func=bar func() #bar() wrapper(bar)
3.可以当做函数的返回值
x=1 def foo(): return x res=foo() print(res) def bar(): print('from bar') def foo(func): #func=<function bar at 0x00000225AF631E18> return func #return <function bar at 0x00000225AF631E18> # print(bar) f=foo(bar) #f=<function bar at 0x00000225AF631E18> # print(f) f()
4.可以当做容器类型的元素
x=1 l=[x,] print(l) def get(): print('from get') def put(): print('from put') l=[get,put] # print(l) l[0]()
1.2总结
#1、func可以被引用 f=func #2、func可以当作参数传给x def bar(x): print(x) x() bar(func) #3、func还可以当作返回值 def bar(x): # x=func return x #return func res=bar(func) #res=func # print(res) res() #4 可以当中容器类型的元素 def auth(): print('登陆。。。。。') def reigster(): print('注册。。。。。') def search(): print('查看。。。。') def transfer(): print('转账。。。。') def pay(): print('支付。。。。') dic={ '1':auth, '2':reigster, '3':search, '4':transfer, '5':pay } # print(dic) # dic['2']() def interactive(): while True: print(""" 1 认证 2 注册 3 查看 4 转账 5 支付 """) choice=input('>>: ').strip() if choice in dic: dic[choice]() else: print('非法操作') interactive() # l=[auth,reigster,search,interactive] # print(l)
二.函数嵌套
1、函数的嵌套调用:在函数内又调用了其他函数
def max2(x,y): if x > y: return x else: return y def max3(x,y,z): res1=max2(x,y) res2=max2(res1,z) return res2 print(max3(11,199,2))
2、函数的嵌套定义:在函数内又定义其他函数
def func1(): print('from func1') def func2(): #func2=内存地址 print('from func2') print(func2) #<function func1.<locals>.func2 at 0x0000024907A098C8> func2() func2() func2() func1() print(func2) def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') f3() f2() f1() ''' f1 f2 f3 '''
三.名称空间
一:名称空间:存放名字与值绑定关系的地方
x=1111111111 def func(): pass
二:名称空间分为三类
1 内置名称空间:存放Python解释器自带的名字,在解释器启动时就生效,解释器关闭则失效
2、全局名称空间:文件级别的名字,在执行文件的时候生效,在文件结束或者在文件执行期间被删除则失效
x=1 def func(): name='egon' del func print('===') print('===') print('===') x=1 def f1(): def f2(): print(x) f2() f1() if 10 > 3: y=33333 while True: xxxxx=123123123
3、局部名称空间:存放函数内定义的名字(函数的参数以及函数内的名字都存放与局部名称空间),
在函数调用时临时生效,函数结束则失效
四.作用域
作用域分为两种
全局作用域:包含的是内置名称空间与全局名称空间的名字, 特点 1在任何位置都能够访问的到 2该范围内的名字会伴随程序整个生命周期 局部作用域:包含的是局部名称空间的名字 特点: 1、只能在函数内使用 2、调用函数时生效,调用结束失效
五.闭包函数
5.1什么是闭包函数
闭包函数: 1、定义在函数内部的函数 2、 并且该函数包含对外部函数作用域中名字的引用,该函数就称为闭包函数 闭:指的是定义在函数内部的函数 !!!作用域关系 在函数定义阶段就规定死了,与调用位置无关
def outter(): name='egon' def inner(): print('my name is %s' %name) return inner f=outter()
5.2为函数体传值的方式(了解)
import requests def get(url): response=requests.get(url) if response.status_code == 200: print(response.text) get('https://www.baidu.com')
import requests import time def outter(url): #url='https://www.baidu.com' # url='https://www.baidu.com' def get(): response=requests.get(url) if response.status_code == 200: print(response.text) return get baidu=outter('https://www.baidu.com') python=outter('https://www.python.org') baidu() print('=====================>') time.sleep(3) baidu()
六.装饰器