一.函数的嵌套

嵌套在外层,称之为外函数

嵌套在里层,称之为内函数
#例:
def outer():

def inner():
        print("I'm inner")
    def inn2():
        print("12345")
    inn2()
    inner()
outer()

#inner()

(1)内部函数可以直接在函数外部调用吗 不可以
(2)调用外部函数后,内部函数可以在函数外部调用吗 不可以
(3)内部函数可以在函数内部调用吗  可以
(4)内部函数在函数颞部调用时,是否有先后顺序  不可以

#外部函数outer 里面是inner  ,inner里面还嵌套一个smaller 内函数,调用smaller
#例:

#a = 17
def outer():
    #a = 16
    #id = 99
    def inner():
        #a = 15
        def smaller():
            #a = 10
            print(id)
            print("I'm smaller")
        smaller()
    inner()
outer()

#LEGB (就近找变量原则)

#寻找变量的调用顺序采用LEGB原则(即就近原则)

L -- Local(function): 当前函数内的作用域  (局部作用域) (局部命名空间

E -- Enclosing function locals:外部嵌套函数的作用域 (嵌套作用域) (局部命名空间)

G -- Global(module) :函数外部所在的命名空间    (全局作用域) (全局命名空间)

B -- Builtin(Python):python内置模块的命名空间 (内建作用域) (内建命名空间)

依据就近原则, 从上往下 从里向外 依次寻找

#注意点
如果先前局部变量存在a,删除之后再获取就获取不到,
如果先前不存在该局部变量,默认向上按照LEGB原则依次寻找
#例:
a = 10
def func():
    a = 20
    del a
    #print(a)
func()
print(a)

二.nonlocal 修改局部变量

nonlocal 专门用于修改局部变量
(1)它自动寻找上一层空间的局部变量用来修改
(2)不停的向上寻找
(3)如果再也找不到了,直接报错
#(1) nonlocal 符合LEGB原则
def outer():
    a = 15
    def inner():
        nonlocal a
        a = 17
        print(a)
    inner()
    print(a)
outer()

#(2)nonlocal 修改的是局部变量,不是全局变量
a = 16
def outer():
    a = 10
    def inner():
        #a = 11
        def smaller():
            nonlocal a
            a +=3
            print(a)
        smaller()
    inner()
outer()

#(3) 不是用nonlocal 是否可以修改局部变量?可以
def outer():
    # a = 3
    lst = [1,2,3,4,5]
    def smaller():
        lst[2] +=5
    smaller()
    print(lst)
outer()

三.闭包函数

闭包:
    内函数使用了外函数的局部变量
    并且外函数把内函数返回出来的过程是闭包
    这个内函数叫做闭包函数
#(1)  基本语法
def outer():
    a = 5
    b = 6
    #inner 是闭包函数
    def inner():
        print(a,b)
    return inner
res = outer()
print(res)
res()

#获取闭包函数使用的变量: __closure__ ,cell_contents (了解)
tup = res.__closure__
print("=====1======")
print(tup)
#获取元组里面第一个元素
obj = tup[0]
print(obj)
#使用cell_contents来获取单元对象当中的值
res = obj.cell_contents
print(res)

obj2 = tup[1]
res2 = obj2.cell_contents
print(res2)
print("<======2=======>")

#闭包的特点:
    内函数使用了外函数的局部变量,外函数的局部变量与内函数发生绑定,延长该变量的生命周期
    (实际内存给它存储了这个值,暂时不释放)
#(2)闭包函数特点
#例:

def famil():
    dejie = "one"
    erjie = "two"
    #money 局部变量因为在闭包函数中使用,于是发生绑定,延长该变量的生命周期
    money = 100000

def dajie_hobby():
        nonlocal money
        money -=30000
        print("大姐喜欢花钱,喜欢买兰博基尼,喜欢买channel,家里钱还剩下%d" % (money))

def erjie_hobby():
        nonlocal money
        money +=15000
        print("二姐喜欢赚钱,,家里钱赚了现在变成%d钱" % (money))

def master():
        #返回一个元组,元组里面的每一个元素是函数
        return (dajie_hobby,erjie_hobby)
    return master
func = famil()
tup = func()
print(tup)
#大姐函数
dajie = tup[0]
dajie()
#二姐函数
erjie = tup[1]
erjie()

输出结果为:

大姐喜欢花钱,喜欢买兰博基尼,喜欢买channel,家里钱还剩下70000

二姐喜欢赚钱,,家里钱赚了现在变成85000钱

Python 基础之函数的嵌套与nonlocal修改局部变量及闭包函数的更多相关文章

  1. day10-Python运维开发基础(函数嵌套、nonlocal声明局部变量、闭包、locals/globals、lambda表达式)

    1. 函数的嵌套与nonlocal 声明局部变量 # ### 函数的嵌套 """ 函数和函数之间可以互相嵌套: 嵌套在内层的叫做内函数 乔涛在外层的叫做外函数 " ...

  2. 036-PHP闭包函数的域限制,与如何向闭包函数传递变量

    <?php // 闭包函数的域限制,与如何向闭包函数传递变量 # 隐藏上面的代码,我们最后再来试下 function demo($ATxt) { $func = function () use ...

  3. 函数的名称空间,函数的嵌套(global, nonlocal),函数名的运用

    一 函数的名称空间 内置空间:存放python解释器内置函数的空间 全局空间:py文件运行时开辟的,存放的是执行的py文件(出去函数内部)的所有的变量与值的对用关系,整个py文件结束后才会消失. 局部 ...

  4. 动态参数 名称空间 作用域 作用域链 加载顺序 函数的嵌套 global nonlocal 等的用法总结

    03,动态参数 *args,**kwargs # 用户传入到函数中的实参数量不定时,或者是为了以后拓展,# 此时要用到动态参数*args,**kwargs(万能参数.)# *args接收的是所有的位置 ...

  5. Python基础库之jieba库的使用(第三方中文词汇函数库)

    各位学python的朋友,是否也曾遇到过这样的问题,举个例子如下: “I am proud of my motherland” 如果我们需要提取中间的单词要走如何做? 自然是调用string中的spl ...

  6. python基础-requests模块、异常处理、Django部署、内置函数、网络编程

     网络编程 urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应. 校验返回值,进行接口测试: 编码:把一个Python对象编码转 ...

  7. Python基础总结之第十一天开始【再深入一下函数,重新认识一下】(新手可相互督促)

    感谢最近大家的关注,希望我的学习笔记对大家有帮助!也感谢各位的评论和推荐,请多多指教. 在重新认识函数之前,我们先看两个函数.一个是我们在前面笔记经常用到的print()  :另一个是input() ...

  8. python基础之生成器表达式形式、面向过程编程、内置函数部分

    生成器表达式形式 直接上代码 1 # yield的表达式形式 2 def foo(): 3 print('starting') 4 while True: 5 x=yield #默认返回为空,实际上为 ...

  9. 【Python基础学习二】定义变量、判断、循环、函数基本语法

    先来一个愉快的Hello World吧,就是这么简单,不需要写标点符号,但是需要严格按照缩进关系,Python变量的作用域是靠tab来控制的. print("Hello World" ...

随机推荐

  1. MyBatis操作mysql数据库查询出来是时间戳的问题

    在pojo类中用java.sql.Date接收就能正常显示

  2. 2020年英特尔CPU供应短缺将持续

    导读 有着相当靠谱的爆料历史的台媒 DigiTimes 报道称,其预计英特尔的 CPU 供应短缺问题,将持续到 2020 年末.对于这样的预测,我们其实早已见怪不怪,毕竟该公司首席执行官 Bob Sw ...

  3. Yii2.0如何建立公共方法

    yii2-advanced版本 common 目录为公共资源目录,我们可以把定义的方法放在这个目录下,在此目录下我们随意建立一个文件比如”helps”目录,因为考虑到公共方法可能会有功能上的划分类,所 ...

  4. 12306 selenium 模拟登录

    # 下面是12306 实现的模拟登陆 # 解码 应用超级鹰,注册用户,左侧栏软件ID进去,开启一个新软件,拿到软件ID # 下面测试都在jupyter里面实现 # 超级鹰类 cell import r ...

  5. (一)tensorflow-gpu2.0学习笔记之开篇(cpu和gpu计算速度比较)

    摘要: 1.以动态图形式计算一个简单的加法 2.cpu和gpu计算力比较(包括如何指定cpu和gpu) 3.关于gpu版本的tensorflow安装问题,可以参考另一篇博文:https://www.c ...

  6. Jenkins显示语言切换为中文(最终解决办法)

    网上大部分搜索结果都指向同一种方法就是下载Locale插件,但该方法已失效. 新的解决办法: 下载完成之后重启Jenkins生效,会汉化大部分内容,部分设置不会汉化. 注:重启后不生效请检查 1.已安 ...

  7. TreeGrid分页树形表格

    先展示效果图: 加载treegrid的json数据格式有两种: (1)基本的数据结构 [{ , "name":"C", "size":&qu ...

  8. WebApplicationInitializer初始化web应用,不需要web.xml

    web应用的上下文层次结构 很多时候加的切面不起作用,是因为加错地方了 1.直接初始化,上下文只有一个context import org.springframework.web.WebApplica ...

  9. 【代码总结】PHP面向对象之常见的关键字和魔术方法

    一.关键字的使用 1.final关键字 只能用来修饰类 和 成员方法  不能修饰成员属性 被final修饰的类不能被继承 用final修饰的成员方法 不能被子类覆盖(重写) <?php // f ...

  10. 运营商如何关闭2G、3G网络?这事儿得从小灵通说起

    5G时代即将全面开启,主流声音是对未来的无限畅想--5G将带来翻天覆地的变化.不过凡事都有利弊两面性,5G作为新生事物固然大有可为,但不可避免地会对旧事物造成巨大冲击.除了会影响很多跟不上潮流发展的行 ...