• python基础 函数命名空间和作用域


    三元运算

    a = 1
    b = 5
    c = a if a>b else b  #变量 = 条件返回True的结果 if条件 else 条件返回False的结果
    print(c)

    必须要有结果。
    必须要有if和else。
    只能是简单的情况。

    函数进阶

    a = 1
    
    def func():
    
        print(a)
    
    func()
    
    def func():
    
        a = 1
    
    func()
    
    print(a)

    命名空间(三种)和作用域

    内置命名空间: python解释器
          就是python解释器一启动就可以使用的名字存储在内置命名空间中
          内置的名字在启动解释器的时候被加载进内存里
    全局命名空间:我们写的代码但不是函数中的代码
           是在程序从上到下被执行的过程中依次加载进内存的
           放置了我们设置的所有变量名和函数名
    局部命名空间:函数
           就是函数内部定义的名字
           当调用函数的时候 才会产生这个名称空间
           随着函数执行的时候 这个命名空间就消失了

    在局部:   可以使用全局、内置命名空间中的名字

    在全局:可以使用内置命名空间中的名字,但是不能用局部使用

    在内置:不能使用局部和全局命名空间的名字

    在正常情况下,直接使用内置的名字

    意思就是在局部调用:局部命名空间->全局命名空间->内置命名空间

    当我们在全局定义了和内置名字空间中同名时,会使用全局的名字

    当自己有的时候,就不找上级要

    如果自己没有就找上一级要 上一级没有再找上一级 如果内置在没有 就报错

    多个函数应该拥有多个独立的局部命名空间,不互相共享

    func ==> 函数的内存地址()

    函数名()函数的调用

    函数的内存地址()函数的调用

    作用域

    全局使用global
    全局作用域 作用在全局 内置和全局都属于全局作用域
    局部作用域 作用在局部 函数(局部名字空间属于局部作用域)
    局部使用local
    global 永远打印全局的名字(能不用就不用)
    local 输出什么 根据local所在的位置

    a = 1
    
    def func():
    
        global a
    
        a += 1
    
    func()
    
    print(a)

    对于不可变数据类型,在局部可以查看全局作用域中的变量,
    但是不能直接修改。
    如果想要修改,需要在程序的一开始添加global声明,
    如果在一个局部(函数)内声明了一个globa变量,
    那么这个变量在局部的所有操作将对全局的变量有效。

    a = 1
    b = 2
    def func():
    x ='aaa'
    y ='bbb'
    print(locals())
    
    func()
    print(globals)
    
    
    a = 1
    b = 2
    def func():
    x ='aaa'
    y ='bbb'
    print(locals())
    #print(globals)
    #func()
    
    print(globals)
    print(locals) #本地的

    函数的嵌套:最多三层

    内部函数可以使用外部函数的变量

    def outer():
        a = 1
        def inner():
            b = 2
            print(a)
            print('inner')
            def inner2():
                print(a,b)    #不可变数据类型的修改
                print('inner2')
            inner2()
        inner()
    outer()
    
    
    def outer():
        a = 1
        def inner():
            b = 2
            print(a)
            print('inner')
            def inner2():
                nonlocal a   #声明了一个上层局部变量
                a += 1
                print(a,b)    
                print('inner2')
            inner2()
        inner()
        print('**a**:',a)
    outer()
    print('全局:',a)
                

    nonlocal 只能用于局部变量 找上层中离当前函数最近一层的局部变量

    声明了nonlocal的1内部函数的变量修改会影响到 离当前函数最近一层的局部变量
    对全局无效
    对局部 也只是对最近的一层有影响

    def func():
        print(123)
        
    func()  #函数名就是内存地址
    
    func2 =func   #函数名可以赋值
    func2
    
    
    l = [func,func2]   #函数名可以作为容器类型的元素
    print(1)
    for i in l:
        i()
    
    def  func():
        print(123)
    def  wahaha(f):
        f()
    
    wahaha(func)   #函数名可作为函数的参数
    
    
    
    def  func():
        print(123)
    def  wahaha(f):
        f()
        return f    #函数名可以作为函数的返回值
    qqxing = wahaha(func)
    qqxing()

    函数名就是第一类对象

    闭包

    嵌套函数,内部函数调用外部函数的变量

    def outer():
        a = 1
        def inner():
            print(a)
        print(inner.__closure__)   有cell就是闭包
    outer()
            
    
    def outer():
        a = 1
        def inner():
        return inner
    inn = outer()
    inn()    #在外部使用内部的函数,就是闭包
    #  闭包的使用方法
    import urllib   #模块     
    from urllib.request import urlopen
    ret = urlopen('http://www.xiaohua100.cn/index.html').read()
    print(ret)
    
    def get_url():
        url = 'http://www.xiaohua100.cn/index.html'
        def inner():
            ret = urlopen(url).read()
            print(ret)
        return inner
    get_func = get_url()
    get_func()
  • 相关阅读:
    luogu 1169 棋盘制作(单调栈/悬线)
    poj 2769 感觉♂良好 (单调栈)
    hdu 5033 buiding(单调栈)
    hdu1506 直方图中最大的矩形 单调栈入门
    有线电视网(树形dp)
    洛谷P1220 关路灯(区间dp)
    【题解】NOI2009二叉查找树 + NOIP2003加分二叉树
    【题解】AHOI2009中国象棋
    【算法】Matrix
    【题解】WC2008游览计划
  • 原文地址:https://www.cnblogs.com/soleZ/p/8125543.html
Copyright © 2020-2023  润新知