一.函数嵌套
函数的嵌套调用:在函数内又调用了其他函数
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))
函数的嵌套定义:在函数内又定义其他函数
def func1(): print('from func1') def func2(): print('from func2') print(func2) #<function func1.<locals>.func2 at 0x000001F9316009D8> func2() func2() func1()
def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') f3() f2() f1() ''' f1 f2 f3 '''
二.名称空间
什么是名称空间?
存放名字与值绑定关系的地方
名称空间分为三类
1、内置名称空间:存放python解释器自带的名字,在解释器启动时生效,解释器关闭则失效
2、全局名称空间:文件级别的名字,在执行文件的时候生效,在文件结束或者在文件执行期间则失效
3、局部名称空间:存放函数内定义的名字(函数的参数以及函数内的名字都存放于局部名称空间),在函数调用时临时生效,函数结束则失效
加载顺序:内置名称空间--->全局名称空间--->局部名称空间
查找顺序:局部名称空间--->全局名称空间--->内置名称空间
# len='global' def f1(): # len=1 def f2(): # len=2 print(len) # len = 1,这样可以 f2() len=1#内置名字不要去覆盖,这样会报错 f1()
三.作用域
全局作用域:包含的时内置名称空间与全局名称空间的名字
特点
1在任何位置都能访问的到
2该范围内的名字会伴随程序整个生命周期
局部作用域:包含的时局部名称空间的名字
特点:
1、只能在函数内使用
2、调用函数时生效,调用结束失效
四.函数对象
#函数在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]()
五.函数对象的应用
#函数在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]() def func(): print('from func') #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)
六.闭包函数
闭指的是定义在函数内部的函数
!!!作用域关系 在函数定义阶段就规定死了,与调用位置无关
def outter(): x=2 def inner(): # x=1 print('from inner',x) return inner f=outter() #f=inner # print(f) # x=1111111111111111111 # f() def foo(): x=1111111111111111111111111111 f() foo()
闭包函数
1:定义在函数内部的函数
2:并且该函数包含对外部函数作用域中名字的引用,该函数就称为闭包函数
def outter(): name='egon' def inner(): print('my name is %s' %name) return inner f=outter()
了解:
为函数体传值得方式
方式一:
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()