一、闭包函数

闭包函数:1、函数内部定义函数,成为内部函数,
     2、改内部函数包含对外部作用域,而不是对全局作用域名字的引用
那么该内部函数成为闭包函数
#最简单的无参闭包函数
def func1()
name='ares'
def func2()
print(name)
#有参和返回值的闭包函数
def timmer(func):
def wrapper(*args,**kwargs):
start_time = time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print('run time is %s' %(stop_time-start_time))
return res
return wrapper

二、高阶函数

  1)函数接收的参数是一个函数名
  2)函数的返回值是一个函数名
  3)满足上述条件任意一个,都可称之为高阶函数
#高阶函数应用1:把函数当做参数传给高阶函数
import time
def foo():
print('from the foo')
def timmer(func):
start_time=time.time()
func()
stop_time=time.time()
print('函数%s 运行时间是%s' %(func,stop_time-start_time))
timmer(foo)
#总结:我们确实为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),现在我们需要调用高阶函数timmer(foo),改变了函数的调用方式
#高阶函数应用2:把函数名当做参数传给高阶函数,高阶函数直接返回函数名
import time
def foo():
print('from the foo')
def timmer(func):
start_time=time.time()
return func
stop_time=time.time()
print('函数%s 运行时间是%s' %(func,stop_time-start_time))
foo=timmer(foo)
foo()
#总结:我们确实没有改变foo的调用方式,但是我们也没有为foo增加任何新功能
高阶函数总结
1.函数接收的参数是一个函数名
  作用:在不修改函数源代码的前提下,为函数添加新功能,
  不足:会改变函数的调用方式
2.函数的返回值是一个函数名
  作用:不修改函数的调用方式
  不足:不能添加新功能
三、函数嵌套
#函数的嵌套定义
def f1():
def f2():
def f3():
print('from f3')
print('from f2')
f3()
print('from f1')
f2()
# print(f1)
f1()
'''
from f1
from f2
from f3
'''

四、装饰器

1、定义:
器即函数
装饰即修饰,意指为其他函数添加新功能
装饰器定义:本质就是函数,功能是为其他函数添加新功能
2、装饰器遵循的原则:开放封闭原则(对扩展是开放的,对源码修改是封闭的)
  即、1)不修改被装饰函数的源代码
    2)为被装饰函数添加新功能后,不修改被装饰函数的调用方式
3、装饰器,装饰器本质可以是任意可调用对象,被装饰的对象也可以是任意可调用对象,
  装饰器的功能是:在不修改被装饰对象源代码以及调用方式的前提下为期添加新功能
 
装饰器=高阶函数+函数嵌套+闭包
基本框架
#这就是一个实现一个装饰器最基本的架子
def timer(func):
  def wrapper():
    func()
  return wrapper

例:

def deco(fn):
def wapper():
fn()
return wapper
@deco
def foo():
print('what are you 弄啥嘞')
foo()

统计一个函数运行时间的装饰器

import time
import random
#装饰器
def timmer(func):
# func=index
def wrapper():
start_time = time.time()
func() #index()
stop_time=time.time()
print('run time is %s' %(stop_time-start_time))
return wrapper
#被装饰函数
def index():
time.sleep(random.randrange(1,5))
print('welecome to index page') def home():
time.sleep(random.randrange(1,3))
print('welecome to HOME page') index=timmer(index) #index=wrapper
home=timmer(home) index() #wrapper()
home()

装饰器的语法:在被装饰对象的正上方的单独一行,@装饰器名字,#@timer就等同于index=timmer(index)

import time
import random
#装饰器
def timmer(func):
def wrapper():
start_time = time.time()
func()
stop_time=time.time()
print('run time is %s' %(stop_time-start_time))
return wrapper
#被装饰函数
@timmer             #index=timmer(index)
def index():
time.sleep(random.randrange(1,5))
print('welecome to index page')
# @timmer #home=timmer(home)
# def home():
# time.sleep(random.randrange(1,3))
# print('welecome to HOME page')
index() #wrapper()
# home()

加多个装饰器:

#加多个装饰器
import time
import random
#装饰器
def timmer(func):
def wrapper():
start_time = time.time()
func()
stop_time=time.time()
print('run time is %s' %(stop_time-start_time))
return wrapper
def auth(func):
def deco():
name=input('name: ')
password=input('password: ')
if name == 'egon' and password == '':
print('login successful')
func() #wrapper()
else:
print('login err')
return deco
#被装饰函数  #多个装饰函数,从上往下添加,调用时从下往上
@auth                 #index=auth(wrapper) #index=deco #index=auth(wrapper) #index=deco
@timmer                #index=timmer(index) #index=wrapper
def index():
# time.sleep(random.randrange(1,5))
time.sleep(3)
print('welecome to index page')
def home():
time.sleep(random.randrange(1,3))
print('welecome to HOME page')
# index() #deco()
# home()

装饰器修订:

#装饰器修订
import time
import random
#装饰器
def timmer(func):
def wrapper(*args,**kwargs):
start_time = time.time()
res=func(*args,**kwargs)  #接收参数
stop_time=time.time()
print('run time is %s' %(stop_time-start_time))
return res    #增加返回值
return wrapper
#被装饰函数
@timmer
def index():
time.sleep(random.randrange(1,5))
print('welecome to index page')
@timmer
def home(name):
time.sleep(random.randrange(1,3))
print('welecome to %s HOME page' %name)
return 123123123123123123123123123123123123123123
index()
res1=index()
print('index return %s' %res1)
res2=home('egon') #wraper()
print('home return %s' %res2)

扩展:

"""
python内置装饰器
在python中有三个内置的装饰器,都是跟class相关的:staticmethod、classmethod、property.
@staticmethod 是类的静态方法,其跟成员方法的区别是没有self参数,并且可以在类不进行实例化的情况下调用
@classmethod 与成员方法的区别在于所接收的第一个参数不是self(类实例的指针),而是cls(当前类的具体类型)
@property 是属性的意思,表示可以通过类实例直接访问的信息
""" class Foo(object):
def __init__(self,var):
super(Foo,self).__init__()
self._var=var @property
def var(self):
return self._var @var.setter
def var(self,var):
self._var=var f=Foo('var1')
print(f.var)
f.var='var2'
print(f.var) """
注意,对于Python新式类(new-style class),如果将上面的 “@var.setter” 装饰器所装饰的成员函数去掉,
则Foo.var 属性为只读属性,使用 “foo.var = ‘var 2′” 进行赋值时会抛出异常。
但是,对于Python classic class,所声明的属性不是 read-only的,所以即使去掉”@var.setter”装饰器也不会报错。
"""

Python基础(7)闭包函数、装饰器的更多相关文章

  1. python基础16_闭包_装饰器

    不了解是否其他语言也有类似 python 装饰器这样的东西. 最近才发现ECMAScript6也是有生成器函数的,也有 yield  generator 装饰器的基础知识是闭包: # 闭包:嵌套函数, ...

  2. Python基础(七) 闭包与装饰器

    闭包的定义 闭包是嵌套在函数中的函数. 闭包必须是内层函数对外层函数的变量(非全局变量)的引用. 闭包格式: def func(): lst=[] def inner(a): lst.append(a ...

  3. Python基础编程闭包与装饰器

    闭包的定义 闭包是嵌套在函数中的函数. 闭包必须是内层函数对外层函数的变量(非全局变量)的引用. 闭包格式: def func(): lst=[] def inner(a): lst.append(a ...

  4. Python基础(闭包函数、装饰器、模块和包)

    闭包函数 格式: def 函数名1(): def 函数名2(): 变量 = 值 return 变量 return 函数名2 func = 函数名1() key = func()

  5. 十一. Python基础(11)—补充: 作用域 & 装饰器

    十一. Python基础(11)-补充: 作用域 & 装饰器 1 ● Python的作用域补遗 在C/C++等语言中, if语句等控制结构(control structure)会产生新的作用域 ...

  6. 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

    一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...

  7. python学习日记(函数--装饰器)

    楔子 前提,我有一段代码(一个函数). import time def run_time(): time.sleep(0.1) print('我曾踏足山巅') 需求1:现在,我想计算这段代码的运行时间 ...

  8. 21.python中的闭包和装饰器

    python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). 以下说明主要针对 python ...

  9. python基础整理4——面向对象装饰器惰性器及高级模块

    面向对象编程 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 面向对象编程(Object Oriented Pro ...

  10. python中的闭包和装饰器

    重新学习完了函数,是时候将其中的一些重点重新捋一捋了,本次总结的东西只有闭包和装饰器 1.闭包 闭包是python函数中的一个比较重要功能,一般闭包都是用在装饰器上,一般学完闭包就会去学习装饰器,这俩 ...

随机推荐

  1. struts2官方 中文教程 系列十四:主题Theme

    介绍 当您使用一个Struts 2标签时,例如 <s:select ..../>  在您的web页面中,Struts 2框架会生成HTML,它会显示外观并控制select控件的布局.样式和 ...

  2. Microsoft Security Essentials 和 Windows Defender 离线升级包下载地址

    自从微软提供了免费的杀毒软件之后我就卸载掉了其他的杀毒软件.但是最近遇到了个小问题,我这里有一批电脑不能联网,杀毒软件的升级成了问题.在网上搜索了一番,终于找到了官方的离线升级包下载地址.放在这里备用 ...

  3. find的详细使用

    对我我这个出学者,这个已经算是很难了,不过今天整理了一下,感觉还可以接受. find Linux中十分重要的一个查找功能, [root@moban /]# find /tmp/ -type f -na ...

  4. Python Flask之旅

    <Pyhton Flask之旅> 以前学flask时做的总结,搬运到这里,markdown格式写的有点乱,凑合看吧. 参考博客 http://blog.csdn.net/nunchakus ...

  5. python--基础篇二

    一. 格式化输出 :name=input("name:") age=input("age:") hobby=input("hobbie:") ...

  6. 字面值常量&&转义序列

    字面值常量举例: 字面值常量的分类 示例 备注 整型 42.024(八进制数).0x23(十六进制) short类型没有对应的字面值 浮点型 3.14.3.14E2(指数) 默认类型是double 字 ...

  7. 搭建Lepus数据库监控系统

    一.  安装环境 系统环境:centos6.5 IP:192.168.30.242 hostname:vpn.org 软件:LAMP均已安装.(请确保这些正常安装,并能使用). 系统核心包:(摘自官方 ...

  8. LeetCode -- Merge Two Sorted Linked List

    Question: Merge two sorted linked lists and return it as a new list. The new list should be made by ...

  9. NS10.1 产品技术规范

    NS10.1 产品技术规范 产品技术规范==================4层-7层流量管理 4层负载均衡(LB)        支持的协议TCP,UDP,FTP,HTTP,HTTPS,DNS(TC ...

  10. BZOJ1513 [POI2006]Tet-Tetris 3D 【二维线段树】

    题目链接 BZOJ1513 题解 真正地理解了一波线段树标记永久化的姿势 每个节点维护两个值\(v\)和\(tag\) \(v\)代表儿子中的最值 \(tag\)代表未下传的最值 显然节点的区间大于等 ...