闭包第2天

2022-09-10

闭包的使用实例

 1 def config_name(name):
 2     def inner(msg):
 3         print(name + ":" + msg)
 4 
 5     print(id(inner))
 6     return inner
 7 
 8 A = config_name("A")
 9 B = config_name("B")
10 A ("有朋自远方来,不亦乐乎。")
11 B ("都说我如水百变,可知我清澈不变。")
12 
13 # 闭包可以对外部函数的变量和参数进行保存

结果图:

闭包第2天

代码说明:

  (1)首先创建了一个闭包函数,即函数嵌套函数,而且在内部函数中使用了外部函数的参数name,在外部函数中的代码中返回内部函数,注意此处的内部函数返回值与常规调用不同,尽管内部函数是个有参函数,但是此时返回的是一个内部函数的名称。

♣在闭包函数的定义中,我不太理解为什么内部函数是一个有参函数,但是返回值时,只是一个单独的函数名称,为什么不要括号了呢?

☆后来我想了一下,可以这样理解,在外部函数中创建的内部函数相当于外部函数的一个变量,因此返回时,可以直接返回内部函数的名称。

  (2)创建好闭包函数后,创建闭包实例对象进行测试。调用闭包函数,而且传一个实参给name,后赋值给一个变量A。因为在闭包函数中还有一个内部函数需要传参,因此在变量A后直接加括号,在括号内写入要传入的实参。B变量同理。

 结果图解释:

(1)第一行与第二行表示的是闭包中的内部函数的内存地址,可以看出创建的两个闭包实例对象的内部函数的存放位置不是相同的。

(2)第三行与第四行输出的是第3行代码输出的内容。


 

闭包使用中的注意事项:

  修改闭包内使用的外部变量

先看一个例图:

 1 def func_out():
 2     num1 = 10
 3     def func_inner():
 4         num1 = 20
 5         result = num1 + 10
 6         print(result)
 7     print("修改前的num1:",num1)
 8     func_inner()
 9     print("修改后的num1:",num1)
10     return func_inner
11 
12 new_func = func_out()
13 new_func()

此时的输出结果:

闭包第2天

 

  可以看出在代码的第4中修改了变量num1的值,但是查看结果图中“修改后的num1”的值仍然是10.可以看出这样并没有改变变量。因为这里是在内部函数定义了一个局部变量,只是它的名称与外部变量的值相等而已。所以在外部输出“修改后的num1”的值仍然是外部变量为10。

 

♣那么使用全局变量修饰符“global”呢,修改后的值会不会变呢?

  ☆使用Python解释器pycharm验证后,值仍然还是不会变。为什么此处全局变量修饰符不起作用呢?可能闭包中的内部函数修改外部变量的值,不支持“gloabl”,不支持这种语法吧。其他的也不知道。

 

所以想要在闭包中的内部函数中修改外部变量时,要使用什么呢?

  使用关键字“nonlocal”。nonloacl是专门用于表名外部嵌套函数内的变量。

so,若需要实现修改闭包内使用的外部变量的需求,上述的代码可改为:

 1 def func_out():
 2     num1 = 10
 3     def func_inner():
 4         nonlocal num1 
 5         num1 = 20
 6         result = num1 + 10
 7         print(result)
 8     print("修改前的num1:",num1)
 9     func_inner()
10     print("修改后的num1:",num1)
11     return func_inner
12 
13 new_func = func_out()
14 new_func()

此时结果运行图:

闭包第2天

 

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:闭包第2天 - Python技术站

(0)
上一篇 2023年4月2日 下午5:01
下一篇 2023年4月2日 下午5:01

相关文章

  • 创建一个Django项目总结

    2022-09-25  首先,要安装好虚拟环境,之后要切换到虚拟环境中,使用的命令 workon 创建好的虚拟环境的名称 之后,创建一个Django项目使用的命令: django-admin startproject 项目名称 进入到该项目的目录下,创建一个子应用,使用的命令: python manage.py startapp 要创建的子应用的名称 其中 …

    Python开发 2023年4月2日
    00
  • 类装饰器

    2022-09-18  类装饰器的定义:   使用一个类作为一个装饰器,在类里面对已有函数添加其他功能。 类装饰器使用的一个实例: 1 class MyDecorator(object): 2 def __init__(self,func): 3 self.__func = func 4 5 def __call__(self, *args, **kwarg…

    2023年4月2日
    00
  • 装饰器第1天

    2022-09-11 装饰器 装饰器的定义:   装饰器是一种特殊的闭包函数,该闭包函数中有且只有一个参数,且该参数是一个函数类型。 装饰器的作用:   装饰器可以给已有函数添加新的功能。 装饰器的特点(区别与其他函数):   (1)它不会改变原来函数调用的方式。   (2)它不会改变原来函数的源代码。   (3)可以给原来的函数添加新的功能。 与装饰器配合…

    2023年4月2日
    00
  • Django项目中的数据库引擎的修改注意点以及级联删除的设置

    2022-09-29 问题描述: 在“setting.py”的配置文件中修改数据库引擎中,将系统默认的”sqlite3″后缀改为了“sql”。出现问题。 原因分析:    问题查看:  修改后:    —————————————— 上述问题修改后,在“setting”中设置数据库的其他内容(主机、端口、…

    2023年4月2日
    00
  • 学习笔记——Django项目中关联查询以及关联查询的筛选

    2022-10-01 关联查询:   在Django项目中使用ORM模式设置表后,进行关联查询,即两个表直接有联系的查询。 方式:   可以通过主表查询从表,也可以通过从表查询主表。 —————- 方式一实例: (1)查询编号为1的图书中的人物 前提环境,进入pycharm,进入虚拟环境、进入shell环境。 首先,需要导入模块,先查询书…

    Python开发 2023年4月2日
    00
  • 学习笔记——Django项目中的F对象,Q对象,聚合函数,排序

    2022-09-30 F对象:   在shell中是用于两个有关联的属性之间的查询。 使用实例: 查询书籍表中阅读量大于评论量的记录 前提,进入pycharm,进入虚拟环境,进入shell环境。 首先,要使用F对象,那么就需要导入F对象 from django.db.models import F 后进行查询 BookInfo1.objects.filter…

    Python开发 2023年4月2日
    00
  • python中组合数据的操作

    2022-09-26 组合数据类型:  列表     字典     集合     元组 拷贝:     deep(深拷贝)     shallow(浅拷贝)     区别:例如,文件中有一个指针指向另一块存储空间,如果是深拷贝则将指向的那一块文件内容也全部拷贝,如果是浅拷贝那么不需要将指针指向的内容进行拷贝,只拷贝第一层级的内容。指针指向的内容属于第二层级。…

    Python开发 2023年4月2日
    00
  • 学习笔记——Django项目中新增数据、修改数据

    2022-09-30 新增数据 方式一: 进入虚拟环境,进入shell工具环境中(“python manage.py shell”),插入数据。在插入数据之前,可以先将要插入的内容写在“views.py”中,,这样做的目的是先写在此处会有代码提示,较为方便。之后将内容放到shell工具中。 首先,先要导入某个表,使用的是ORM模式,因此导入的是一个子应用中的…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部