#命名空间和作用域
#内置命名空间
#python解释器一启动就能使用的内置命名空间中
#在启动解释器的时候加载进内存
#全局命名空间---我们写的代码,不是函数中的代码
#从上到下被执行的过程中依次加载进内存的
#放置了我们设置的所有变量名和函数
#局部命名空间--函数
#函数内部定义的名字
#当调用函数时,才会产生,调用结束空间消失
#在全局:可以使用内置命名空间的名字
#在局部:可以使用全局,内置命名空间的名字
#在内置:不可以使用全局和局部命名空间中的名字
#内置命名空间>全局命名空间>局部命名空间
#自己的空间中找不到就找上一级
'''
def max(l):
print("please don't do that")
return l
# print(max([1,2,3]))
# print(max)#打印的是函数地址
def func():
print(max)#找上一步中的max的地址
func()
'''
#作用域
#全局作用域---作用在全局---包含内置和全局空间的名字
#局部作用域---作用在局部---函数(局部空间中的名字)
# print(locals())
# print(globals())
# a=1
# b=2
# def func():
# x='aaa'
# y='bbb'
# print(locals())
# # print(globals())
# func()
# a = 10
# def func():
# global a
# a = 20
# func()
# print(a)
# # 在局部调用globals和locals
# def func():
# a = 12
# b = 20
# print(locals())
# print(globals())
#
# func()
#函数嵌套调用
'''
def the_max(x,y,z):
c=max(x,y)
return max(c,z)
print(the_max(1,3,2))
'''
#函数的嵌套定义
#内部函数可以使用外部函数的函数
# def outer():
# def inner():
# print('hkl;')
# outer()
#global
# a=2#全局变量
# def outer():
# a=1#局部变量
# print(a)
# def inner():
# b=2
# print(b)
# def inner2():
# global a#对全局变量进行修改
# a+=1
# print(a,b)
# inner2()
# inner()
# print('*',a)#此处为局部变量,与global无关
# outer()
# print('全局',a)#此处说明全局变量已经被修改了,说明global只对全局变量有效
#nonlocal
# a=3#全局变量
# def outer():
# a=1#局部变量
# print(a)
# def inner():
# a=5#局部变量
# print(a)
# def inner2():
# nonlocal a#对向上找到的第一个a的那一层的局部变量a进行修改
# a+=1
# inner2()
# print('#', a)
# inner()
# print('*',a)#此处为局部变量,与nonlocal有关
# outer()
# print('全局',a)#此处说明全局变量没有被修改了,说明nonlocal只对局部变量有效
#函数名可以赋值
# #函数名可以作为容器类型的元素
# a=4
# def func(x,y):
# a=x*y
# return a
# print(func(1,2))
# func1=func#函数名可以赋值
# print(func(2,3))
# l=[func,func1]
# print(l)#函数名可以作为容器类型(列表,字典之类的)的元素,内存地址一样
# for i in l:
# print(i)
# def sb():
# print(23)
#
# def a(s):
# s()
# return s#可以作为返回值
# print(a(sb))#函数可以作为参数
#闭包
#一定是嵌套函数,内部函数一定要套用外部函数的变量
# def func():
# a=3
# b=2
# y=a*b
# print(y)
# def inner():
# x=a+b
# print(x)
# print(inner.__closure__)#cell at........
# inner()
# func()
# print(func.__closure__)#None
# #闭包一定是调用了外部的变量
# def outer():
# a=2
# def inner():
# print(a)
# return inner#返回函数名
# inn=outer()
# inn()#调用函数,此时a一直在内存中不会随outer函数结束不消失
# from urllib.request import urlopen
# ret=urlopen('https://y.qq.com/n/yqq/song/000wX98p3MBWmK.html').read()
# print(ret)
#错误示范
# from urllib.request import urlopen
# def get_url():
# url='https://y.qq.com/n/yqq/song/000wX98p3MBWmK.html'
# def func():
# ret = urlopen(url).read()
# print(ret)
# return func#位置不对
# get_func=get_url()#要加括号
# get_func()
#正确示范
# from urllib.request import urlopen
# def get():
# url='https://y.qq.com/n/yqq/song/000wX98p3MBWmK.html'
# def func():
# print(urlopen(url).read())
# # func()
# # get()
# return func
# get_func=get()
# get_func()