1、闭包的概念
closure:内部函数中对enclosing作用域的变量进行引用,外部函数返回内部函数名
 
2、函数实质与属性
函数是一个对象:在内存中有一个存储空间
函数执行完成后内部变量回收:引用计数不为零
函数属性:特殊属性
函数返回值
例子
passline = 60
def func(val):
print('%x' % id(val)) # 查看变量名地址
if val >= passline:
print('pass')
else:
print('failed')
def in_func(): # (val,)添加后是元组类型不能变的
print(val) # 引用变量后说明变量添加到内函数属性中,使用时直接在内函数中查找
in_func()
return in_func
# func(88)
a =func(88) # 将变量名指向in_func
print(a.__name__) # 查看变量名
a() #实际是调用了in_func(),相当于a和in_func指向同一个函数,a和in_func只是函数名
print(a) #查看in_func()在func函数属性中的地址
print(a.__closure__) # 查看in_func()中的属性是否存在val变量,闭包属性
3、闭包的作用和优点
  • 实现了函数封装
  • 提高代码的复用
 
4、将代码的公共部分抽出,用闭包的形式代替抽出部分,将要使用的函数当作参数
例子:
两个代码重复的方法:
def my_sum(*arg):
if len(arg) == 0: # 被除数不能为0
return 0
for val in arg: # 数据只能是int型
if not isinstance(val,int):
return 0
return sum(arg)
def my_average(*arg):
if len(arg) == 0:
return 0
for val in arg:
if not isinstance(val,int):
return 0
return sum(arg)//len(arg)
 
print(my_sum(1,2,3,'2'))
print(my_average())
重构后:
def my_sum(*arg):
return sum(arg)
def my_average(*arg):
return sum(arg)//len(arg)
def dec(func):
def in_dec(*arg):
if len(arg) == 0: # 被除数不能为0
return 0
for val in arg: # 数据只能是int型
if not isinstance(val,int):
return 0
return func(*arg)
return in_dec
my_sum = dec(my_sum) # 1、先调用dec,2、再将my_sum函数名指向函数in_dec
my_average = dec(my_average)
 
# 当使用my_sum函数时,3、调用in_dec,4、再调用my_sum
print(my_sum(1,2,3,'2'))
print(my_average())
 
5、装饰器:
 
  • 装饰器用来装饰函数
  • 返回一个函数对象
  • 被装饰函数标识符指向返回的函数对象
  • 语法:@deco
装饰器实质是对闭包的使用
def dec(func):
print('1、call dec')
def in_dec(*arg):
print('3、call in_dec')
if len(arg) == 0:
return 0
for val in arg:
if not isinstance(val,int):
return 0
return func(*arg)
print('2、return in_dec')
return in_dec
print('装饰器代码执行顺序:')
@dec # 等于my_sum = dec(my_sum)这句话
def my_sum(*arg): # 装饰过后my_sum名指向in_dec函数对象,此时in_dec会调用原来的my_sum,要使用my_sum(1,2)才能调用
print('4、call my_sum')
return sum(arg)
# print(sum(arg))
def average(*arg):
return sum(arg)//len(arg)
 
print('调用被修饰的函数后才会执行闭包中的函数')
print(my_sum(1,2,3))
输出结果:
装饰器代码执行顺序:
1、call dec
2、return in_dec
调用被修饰的函数后才会执行闭包中的函数
3、call in_dec
4、call my_sum

python基础语法_9-1闭包 装饰器补充的更多相关文章

  1. Python菜鸟之路:Python基础-逼格提升利器:装饰器Decorator

    一.装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等. 装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身 ...

  2. python 基础篇 11 函数进阶----装饰器

    11. 前⽅⾼能-装饰器初识本节主要内容:1. 函数名的运⽤, 第⼀类对象2. 闭包3. 装饰器初识 一:函数名的运用: 函数名是一个变量,但他是一个特殊变量,加上括号可以执行函数. ⼆. 闭包什么是 ...

  3. python基础编程: 函数示例、装饰器、模块、内置函数

    目录: 函数示例 装饰器 模块 内置函数 一.函数示例: 1.为什么使用函数之模块化程序设计: 不使用模块程序设计的缺点: 1.体系结构不清晰,可主读性差: 2.可扩展性差: 3.程序冗长: 2.定义 ...

  4. python基础之函数当中的装饰器

    在实际工作当中存在一个开放封闭原则 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新 ...

  5. Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化

    一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...

  6. Python基础2:反射、装饰器、JSON,接口

    一.反射 最近接触到python的反射机制,遂记录下来已巩固.但是,笔者也是粗略的使用了__import__, getattr()函数而已.目前,笔者的理解是,反射可以使用户通过自定义输入来导入响应的 ...

  7. python基础补漏-05-生成器和装饰器

    [1]生成器 很难用简单的语言描述生成器. 生成器:从字面上来理解,就是以某种规则为基础,不断的生成数据的工具 生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器 ...

  8. python基础之基本算法和装饰器

    1.冒泡排序 关于冒泡排序实现大小比较,大索引会向后移动,这次循环将最大数值直接移动至最后. li = [,,,,] ): ]: temp = li[i] li[i] = li[i + ] li[i ...

  9. python基础语法7 闭包函数与装饰器

    闭包函数: 1.闭包函数必须在函数内部定义 2.闭包函数可以引用外层函数的名字 闭包函数是 函数嵌套.函数对象.名称空间与作用域 结合体. # 直接传参 def func(x): print(x) f ...

随机推荐

  1. Window10系统修改hosts文件的方法

    背景: 调试smtp程序时遇到问题,度娘说需要修改hosts文件 使用老方法修改了很久,始终无法保存 又百度了一下,在此重温,以加深记忆 方法: Step1.同时按住Windows+X Step2.选 ...

  2. maven pom.xml 的 spring-boot-maven-plugin 红色报错 解决

    解决方法,添加对应的spring boot 版本号即可

  3. Java手动创建Web项目

    原文链接:https://www.toutiao.com/i6495693288043971086/ 为了便于理解Web项目结构,我们手动创建整个过程. 先启动Tomcat 下载Tomcat7.0 解 ...

  4. HDU 2099 整除的尾数(枚举 & 暴搜)

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2099 思路分析:这道题的解法可以说是相当暴力了,但也有一些小坑,以下几点萌新们值得留意一下: 1. 仔 ...

  5. PAT 乙级 1003. 我要通过!(20) (C语言描述)

    "答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于PAT的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出"答案正确&quo ...

  6. Keil MDK STM32系列(六) 基于抽象外设库HAL的ADC模数转换

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  7. JVM探究(一)谈谈双亲委派机制和沙箱安全机制

    JVM探究 请你谈谈你对JVM的理解?java8虚拟机和之前的变化gengxin? 什么是OOM,什么是栈溢出StackOverFlowError JVM的常用调优参数有哪些? 内存快转如何抓取,怎么 ...

  8. Appium+python自动化测试过程中问题

    一.自动删除contactmanager 自动化测试appium提供的sample如下包/activity:com.example.android.contactmanager/.ContactMan ...

  9. day23 结构体

    (1).若有说明和定义: typedef int *integer: integer p,*q: 则下列叙述正确的是[C] (A).q是基类型位int的指针变量 (B).p是int型变量 (C).p是 ...

  10. 【JavaWeb】CVE-2016-4437 Shiro反序列化漏洞分析及代码审计

    Shiro反序列化漏洞分析及代码审计 漏洞简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.   Apache Shiro默认使用了CookieRe ...