python中函数总结之装饰器闭包详解


Posted in Python onJune 12, 2016

1、前言

函数也是一个对象,从而可以增加属性,使用句点来表示属性。

如果内部函数的定义包含了在外部函数中定义的对象的引用(外部对象可以是在外部函数之外),那么内部函数被称之为闭包。

2、装饰器

装饰器就是包装原来的函数,从而在不需要修改原来代码的基础之上,可以做更多的事情。

装饰器语法如下:

@deco2
@deco1
def func(arg1,arg2...):
  pass

这个表示了有两个装饰器的函数,那么表示的含义为:func = deco2(deco1(func))

无参装饰器语法如下:

@deco
def func():
  pass

表示的含义为func = deco(func)

有参装饰器语法如下:

@deco(deco_args)
def func():
  pass

表示的含义为:func = deco(deco_args)(func)

多个装饰器有的有参数有的没参数,语法如下:

@deco2(arg1,arg2)
@deco1
def func():
  pass

表示的含义为foo = deco2(arg1,arg2)deco1(func)

装饰器实际上就是函数,接受的也是函数对象。

在执行函数之前,可以运行预备代码,也可以在执行代码后做一些清理工作。

看见装饰器的时候,很可能在里面找到一些代码,它定义了某个函数,并在定义内的某处嵌入了对目标函数的调用或者至少一点引用。

3、装饰器作用

装饰器的作用如下:

引入日志;增加计时逻辑来检测性能;给函数加入了事物的能力

以下例子表示为引入了计时的逻辑来检测性能,如下:

#!/usr/bin/env python

from time import ctime,sleep

def tsfunc(func): #装饰器函数接受的是一个函数对象
  def wrappedFunc():
    print '[%s] %s() called' % (ctime(),func.__name__)
    return func() #在这里调用了函数对象,也就是表示装饰器是装饰了原来的函数,从而在原来函数的基础上进行了一些操作
  return wrappedFunc

@tsfunc #装饰器
def foo():
  pass

foo()
sleep(4)

for i in range(2):
  sleep(1)
  foo()

 执行结果如下:

[root@python 420]# python deco.py 
[Tue Apr 19 16:15:01 2016] foo() called
[Tue Apr 19 16:15:06 2016] foo() called
[Tue Apr 19 16:15:07 2016] foo() called

在装饰器函数中,增加了时间戳并且调用了目标函数,装饰器的返回值是一个包装了函数

4、闭包

如果在一个内部函数里,对在外部作用于(但不是全局作用域)的变量进行引用,那么内部函数被认为是闭包closure,定义在外部函数内的但由内部函数引用或者使用的变量称之为自由变量。

闭包的主要作用如下:

安装计算;隐藏状态;在函数对象和作用域中随意的切换。

回调就是函数,闭包也是函数,但是能携带一点额外的作用域。

#!/usr/bin/env python

def counter(start_at=0):
  count = [start_at]
  def incr():
    count[0] += 1
    return count[0]
  return incr

count= counter(5)
print count()
print count()

在上面的例子可以看到,函数内部的函数incr引用了外部的变量count,并且每次进行加一,从而这个变量count称之为自由变量。

以上这篇python中函数总结之装饰器闭包详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
新手该如何学python怎么学好python?
Oct 07 Python
python启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
Apr 09 Python
Python中文竖排显示的方法
Jul 28 Python
Python3实战之爬虫抓取网易云音乐的热门评论
Oct 09 Python
python读取与写入csv格式文件的示例代码
Dec 16 Python
浅谈Pandas中map, applymap and apply的区别
Apr 10 Python
实例讲解python中的协程
Oct 08 Python
numpy向空的二维数组中添加元素的方法
Nov 01 Python
详解Python Matplot中文显示完美解决方案
Mar 07 Python
Python socket实现的文件下载器功能示例
Nov 15 Python
selenium自动化测试入门实战
Dec 21 Python
Python尝试实现蒙特卡罗模拟期权定价
Apr 21 Python
Python备份目录及目录下的全部内容的实现方法
Jun 12 #Python
深入理解python中的闭包和装饰器
Jun 12 #Python
Python编码爬坑指南(必看)
Jun 10 #Python
浅析Python中的for 循环
Jun 09 #Python
Python多层嵌套list的递归处理方法(推荐)
Jun 08 #Python
Python-嵌套列表list的全面解析
Jun 08 #Python
PYTHON压平嵌套列表的简单实现
Jun 08 #Python
You might like
优化PHP代码的53条建议
2008/03/27 PHP
php中explode函数用法分析
2014/11/15 PHP
php返回当前日期或者指定日期是周几
2015/05/21 PHP
PHP简单判断字符串是否包含另一个字符串的方法
2016/03/25 PHP
PHP简单获取网站百度搜索和搜狗搜索收录量的方法
2016/08/23 PHP
jQuery中filter(),not(),split()使用方法
2010/07/06 Javascript
JavaScript实现信用卡校验方法
2015/04/07 Javascript
TypeScript 中接口详解
2015/06/19 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
完美解决IE9浏览器出现的对象未定义问题
2016/09/29 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
JS中利用FileReader实现上传图片前本地预览功能
2018/03/02 Javascript
详解Angular Forms中自定义ngModel绑定值的方式
2018/12/10 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
viewer.js实现图片预览功能
2020/06/24 Javascript
python中精确输出JSON浮点数的方法
2014/04/18 Python
Python getopt模块处理命令行选项实例
2014/05/13 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
Python3 关于pycharm自动导入包快捷设置的方法
2019/01/16 Python
python获取微信企业号打卡数据并生成windows计划任务
2019/04/30 Python
Python函数式编程指南:对生成器全面讲解
2019/11/19 Python
python设置代理和添加镜像源的方法
2020/02/14 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
2020/03/30 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
matplotlib subplot绘制多个子图的方法示例
2020/07/28 Python
物业公司的岗位任命书
2014/06/06 职场文书
汉语专业毕业生自荐信
2014/07/06 职场文书
大学生考试作弊检讨书
2014/09/21 职场文书
公司离职证明标准格式
2014/11/18 职场文书
优秀教师单行材料
2014/12/16 职场文书
2016特色励志班级口号
2015/12/24 职场文书
2019公司借款合同范本2篇!
2019/07/24 职场文书
导游词之太行山青龙峡
2020/01/14 职场文书
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python