最新要闻

广告

手机

又是一年开学季丨无缝接驳 直通高校 武汉贴心迎新

又是一年开学季丨无缝接驳 直通高校 武汉贴心迎新

科锐国际廖萍: 数字化人才将成为VUCA时代企业人才战略的核心

科锐国际廖萍: 数字化人才将成为VUCA时代企业人才战略的核心

家电

Python名称空间和作用域,闭包函数

来源:博客园


【资料图】

Python名称空间和作用域,闭包函数

  • 名称的查询顺序
  • 名称空间的作用域
  • global和nonlocal关键字的使用
  • 函数对象(函数名)
  • 函数的嵌套调用
  • 函数的嵌套定义
  • 闭包函数

名称空间

定义

# 什么是名称空间?名称空间即存放名字与对象映射/绑定关系的地方。就是存放变量名与变量值关系的地方

名称空间的分类

1.内置的名称空间内置:就在python解释器里面,可以直接使用        """一般大多数都是在函数内部存在的都是局部的!"""        def index():            a=1            b=22.全局的名称空间全局:在py文件中顶格编写的变量名就是全局变量     name="jerry"             def index():                    pass                             if a:                pass                         while b:                    pass                             for i in range(10):                pass            全局变量:在函数外的变量就是全局变量局部变量:在函数内部的变量就是局部变量    

名称查询顺序

既然有全局变量和局部变量那么就一定会有查询顺序名称空间的加载顺序是(在内置):内置名称空间->全局名称空间->局部名称空间如果你在全局:全局--->内置局部变量在外部是不能被使用的在函数内部打印出来的结构都属于当前函数的局部名称空间"""局部名称空间的嵌套!"""def f1():    # x = 222    def f2():        print("f2")        # x = 333        def f3():            print("f3")            # x = 444            def f4():                # x = 555                print(x)            f4()        f3()    f2()f1()

名称空间的作用域

域:范围作用域:变量的作用范围1. 内置名称空间# 在全局的任意位置都能够使用2. 全局名称空间# 在全局的任意位置任意时间都能够使用 3. 局部名称空间# 一般情况只能够在局部使用     def index():    x = 666   

global和nonlocal的使用

global如果你想在局部修改全局的变量:1. 如果你修改的是不可变的类型,需要global关键字的声明2. 如果你修改的是可变类型的,无需使用global关键字声明# x = 10# def index():#     global x # 声明这个x用的是全局的x#     x = 20  # 我想在局部修改全局的x的值#     # print(x)## index()# print(x) # 10name_list = ["kevin", "jerry"]def func():    name_list.append("tank")func()print(name_list) # ["kevin", "jerry", "tank"]nonlocal如果你想在内部的局部修改外部的局部:1. 如果你修改的是不可变的类型,需要nonlocal关键字的声明2. 如果你修改的是可变类型的,无需使用nonlocal关键字声明nonlocal的使用:# def outer():#     x = 666#     def inner():#         nonlocal x#         x = 999#     inner()#     print(x) # 此时的x是多少? 666## outer()def outer():    name_list = ["a", "b"]    def inner():        name_list.append("c")    inner()    print(name_list) # 此时的x是多少? 666outer()

函数对象(函数名)

函数名可以当成变量赋值

ef index():    print("index")    return 123# print(index())"""函数名就是函数在内存中得地址"""# print(index)  # a = index# print(a) # res=a()  # index()print(res)

函数名可以的当成函数的实参

def index():    print("index")    return Nonedef func(a):    # a:index    print(a)    res=a()  # index()    print(res) # res的结果? None# index:index函数所在的内存地址

函数名可以当成函数的返回值

def index():    print("index")    return "index2"def func():    print("func")    # return index() # "index"    return index # "index"res = func()  #print(res)res1=res()  # index()print(res1)

函数名可以当成容器类型的元素

def index():  print("index")  return Nonell = [11, 22, 33, index]# ll = [11, 22, 33, index()]# print(ll[3])res=ll[3]() # index()print(res)

函数的嵌套调用

嵌套:函数套函数# 案例:给你四个数,比较大小,返回最大的# 两个数的比较大小,返回大的def my_max(a, b):    if a >b:        return a    return b# res=my_max(1, 2)# print(res)##def many_max(a, b, c, d, e):    """四个数的比较大小其实还是要两两比较!"""    res=my_max(a, b) # res得到a和b中得大的那个    # 怎么样比较res和剩余的大小, 只需要拿res和c或者d中得一个进行比较    res1=my_max(res, c) # res1:a,b,c中得最大的那个    res2=my_max(res1, d)    res3=my_max(res2, e)    return res3res=many_max(11, 12, 3, 24)print(res)

闭包函数

# 闭包函数还是函数,它是有函数一点一点演变过来的什么是闭包函数?闭:就是函数内部定义函数,至少要有2层函数    包:内部的函数要使用外部函数名称空间中的名字    """只有同时满足以上两个条件,才能称之为是闭包函数"""def outer():    x = 666    def inner():        print("hello", x)    return innerouter()# 闭包函数的使用场景:闭包函数其实是第二种传参方式!# 第一种传参方式# def index(username):#     print(username)## index("jerry")# 第二种传参方式# 比较两个数的大小# def my_max(a, b):#     if a>b:#         return a#     return b## my_max(1, 2)# 让你用闭包函数实现比较2个数的大小:一次传值,多次使用def outer(a, b):    # a = 100    # b = 200    def my_max():        if a > b:            return a        return b    return my_maxres = outer(1, 10)  # my_max函数的内存地址print(res()) # my_max()print(res()) # my_max()print(res()) # my_max()print(res()) # my_max()print(res()) # my_max()print(res()) # my_max()print(res()) # my_max()print(res()) # my_max()res1=outer(10, 20) # res1:my_maxprint(res1())print(res1())print(res1())print(res1())print(res1())print(res1())print(res1())print(res1())print(res1())

关键词: