day10

#命名空间和作用域
#内置命名空间
    #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()

  

posted @ 2018-12-05 21:51  菜菜会回来改名字的  阅读(95)  评论(0编辑  收藏  举报