python 之 函数(嵌套调用、名称空间与作用域、函数对象)
5.36 命名关键字
什么是命名关键字参数? 格式:在*后面参数都是命名关键字参数 特点: 1 必须被传值 2 约束函数的调用者必须按照key=value的形式传值 3 约束函数的调用者必须用我们指定的key名
def foo(x,y,*,z): print(x,y,z) foo(1,2) # z必须被传值 foo(1,2,3) # z必须以key=value的形式传值 foo(1,2,aaa=3) #必须以 z 传值 foo(1,2,z=3) # 1 2 3
5.4 函数嵌套调用
函数的嵌套调用:在函数内又调用了其他函数
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))
5.5 函数名称空间与作用域
5.51 名称空间
名称空间:存放名字与值绑定关系的地方
名称空间分为三类:
1 内置名称空间:存放Python解释器自带的名字,在解释器启动时就生效,解释器关闭则失效
2、全局名称空间:文件级别的名字,在执行文件的时候生效,在文件结束或者在文件执行期间被删除则失效
x=1 def func(): name='egon' del func a = 10 def fun(): print(a) fun() print(a)
3、局部名称空间:存放函数内定义的名字(函数的参数以及函数内的名字都存放于局部名称空间),在函数调用时临时生效,函数结束则失效
def fun(): a = 10 print(a) fun() print(a) # a已经不存在了..
加载顺序:内置名称空间 ----》全局名称空间 -----》局部名称空间 查找名字:局部名称空间 ----》全局名称空间 -----》内置名称空间
5.52 作用域
全局作用域:包含的是内置名称空间与全局名称空间的名字 特点: 1、在任何位置都能够访问的到 2、该范围内的名字会伴随程序整个生命周期
局部作用域:包含的是局部名称空间的名字 特点: 1、只能在函数内使用 2、调用函数时生效,调用结束失效
5.6 函数对象
5.61 函数对象的作用
1、可以被引用
x=1 y=x def bar(): print('from bar') f=bar f()
2、func可以当作参数传给x
def bar(x): print(x) x() bar(func) def bar(): print('from bar') def wrapper(func): #func=bar func() #bar() wrapper(bar)
3、func还可以当作返回值
def bar(x): # x=func return x #return func res=bar(func) #res=func print(res) res()
4、可以当作容器类型的元素
def get(): print('from get') def put(): print('from put') l=[get,put] l[0]()
5.62 函数对象应用
利用函数作容器类型元素实现注册:
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 } def interactive(): while True: print(""" 1 认证 2 注册 3 查看 4 转账 5 支付 """) choice=input('>>: ').strip() if choice in dic: dic[choice]() else: print('非法操作') interactive()
5.7 闭包函数
定义在函数内部的函数, 并且该函数包含对外部函数作用域中名字的引用,该函数就称为闭包函数
闭:指的是定义在函数内部的函数 作用域关系 在函数定义阶段就规定死了,与调用位置无关
def outter(): x=2 def inner(): print(x) return inner f=outter() #f=inner f()
5.71 为函数体传值的方式
方式一:将值以参数的形式的传入
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' def get(): response=requests.get(url) if response.status_code == 200: print(response.text) return get baidu=outter('https://www.baidu.com') baidu() print('=====================>') time.sleep(3) baidu()