16 命名空间和作用域

#内置的命名空间  就是python解释器一启动就可以使用的名字存贮在内置命名空间中
# print(),input(),list,tuple,等等
#全局的会命名空间
#局部的命名空间
a = 1
def func():
    global a    #声明后就可以修改全局的 a ,将会影响全局的 a  应尽量不使用,因为不安全
    a += 1
func()
print(a)        #2
#求最大值函数  函数的嵌套
def max(a,b):
    return a if a>b else b

def the_max(x,y,z):
    c = max(x,y)
    return max(c,z)

print(the_max(1,2,3))       #3
#函数的嵌套定义和作用域链
a = 5
def outer():
    a = 1
    def inner():
        b = 4
        print(a)             #1
        print('inner')      #inner
        def inner2():
            nonlocal a      #声明上面第一层的局部变量 a 可以修改,对全局变量无效
            a += 1
            print(a,b)       #2 4
            print('inner2') #inner2
        inner2()
    inner()
    print('局部 a:',a)      #局部 a: 2
outer()
print('全局 a:',a)          #全局 a: 5
def func():
    print(123)

func2 = func    #函数名可以赋值
func2()         #123

l = [func,func2]    #函数名可以做为容器类型的元素
for i in l:
    i()         #123
                #123
def func():
    print(123)

def wahaha(f):
    f()
    return f                #函数名可以作为函数的返回值

qqxing = wahaha(func)        #函数名可以作为函数的参数      123
qqxing()                     #123
#闭包     是一个嵌套的函数,且内部函数调用外部函数的变量
def outer():
    a = 1
    def inner():
        print(a)
#        print(inner.__closure__)
    return inner
inn = outer()       #返回了内部闭包的函数地址
inn()               #运行内部的函数
#闭包的应用例程
#import urllib       #调用模块
from urllib.request import urlopen
# ret = urlopen('https://home.cnblogs.com/u/bydzxzy/').read()
# print(ret)
def get_url():
    url = 'https://home.cnblogs.com/u/bydzxzy/'
    def get():
        ret = urlopen(url).read()   #爬取了网页的原码
        print(ret)
    return get
get_func = get_url()
get_func()

猜你喜欢

转载自www.cnblogs.com/bydzxzy/p/9649320.html
今日推荐