装饰器(函数)

1.函数作用域

2.高阶函数 把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。

3.闭包  闭包就是能够读取其他函数内部变量的函数。

在本质上,闭包是将函数内部和函数外部连接起来的桥梁
如果一个内部函数里,对在外部作用域(但不是全局作用域)的变量进行引用,那么内部函数被认为是闭包
closure
闭包-函数+定义函数时的环境
def outer():
x=10
def inner(): #inner就是内部函数
print(x) #外部环境的一个变量
return inner #内部函数inner就是一个闭包函数 #以下可以取到inner
outer()()
#下面执行的时候 f()能取到x的值 就是因为inner时一个闭包函数
f=outer()
f() #inner() 不行 局部变量 全局无法使用

写代码的时候有一个开放封闭原则

解决一些重复功能

import time

def foo():
print('foo ')
time.sleep(2) def bar():
print('bar ')
time.sleep(3) def show_time(f):
start_time=time.time()
f()
end_time=time.time()
time=end_time-start_time
print(time)

装饰器:

import time

#装饰器函数
def show_time(f):
def inner():
start_time=time.time()
f()
end_time=time.time()
ctime=end_time-start_time
print(ctime)
return inner @show_time 等价于 foo=show_time(foo)
def foo():
print('foo ')
time.sleep(2) @show_time
def bar():
print('bar ')
time.sleep(3)

当被装饰的函数带有参数时:

#-*- coding:utf-8 -*-

import time

#装饰器函数
def show_time(f):
def inner(x,y):
start_time=time.time()
f(x,y)
end_time=time.time()
stime=end_time-start_time
print(stime)
return inner #等价于 foo=show_time(foo)
@show_time
def add(x,y):
print(x+y)
time.sleep(3)
add(1,2)

对于可变长参数

#-*- coding:utf-8 -*-

import time

#装饰器函数
def show_time(f):
def inner(*args,**kwargs):
start_time=time.time()
f(*args,**kwargs)
end_time=time.time()
stime=end_time-start_time
print(stime)
return inner #等价于 foo=show_time(foo)
@show_time
def add(*args,**kwargs):
sum=0
for i in args:
sum+=i
print(sum)
time.sleep(3) add(1,2,5)

当装饰函数需要参数以用来处理不同操作时  用于处理有些函数需要记录日志 而有些不需要

#-*- coding:utf-8 -*-

import time

#装饰器函数
def logger(flag=''):
def show_time(f):
def inner(*args,**kwargs):
start_time=time.time()
f(*args,**kwargs)
end_time=time.time()
stime=end_time-start_time
print(stime)
if flag=='true':
print('true')
return inner
return show_time
#等价于 foo=show_time(foo)
@logger('true')
def add(*args,**kwargs):
sum=0
for i in args:
sum+=i
print(sum)
time.sleep(3) @logger()
def bar():
print('') add(1,2,5)
bar()

类装饰器

#给每个类打印一句话
def Decorator(obj):
print("定义了一个装饰器函数")
return obj @Decorator #相当于执行 School = Decorator(School)
class School():
pass

python学习笔记16-装饰器的更多相关文章

  1. Python学习笔记:装饰器

    Python 装饰器的基本概念和应用 代码编写要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即: 封闭:已 ...

  2. Python学习笔记012——装饰器

    1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函 ...

  3. python学习笔记(五):装饰器、生成器、内置函数、json

    一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里 ...

  4. python学习笔记:装饰器2

    python的装饰器本质是函数,为了不改变装饰目标函数内部代码而增加额外功能而存在 一.一般装饰函数实例: import datetime def func_name(func):#定义一个装饰函数, ...

  5. python学习笔记之装饰器、生成器、内置函数、json(五)

    一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面 ...

  6. python学习笔记之装饰器、递归、算法(第四天)

    参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...

  7. Python学习笔记之装饰器原理

    def decorator(fn): def wrapper(): print("询价") fn() print("购买成功!") return wrapper ...

  8. python学习之day5,装饰器,生成器,迭代器,json,pickle

    1.装饰器 import os import time def auth(type): def timeer(func): def inner(*args,**kwargs): start = tim ...

  9. Python学习——迭代器&生成器&装饰器

    一.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素.迭代器仅 ...

  10. 从零开始的Python学习Episode 11——装饰器

    装饰器 装饰器是用来处理其他函数的函数,主要作用是在不修改原有函数的情况下添加新的功能,装饰器的返回值也是一个函数对象. 简单的装饰器 import time def show_time(f): de ...

随机推荐

  1. Java对象的克隆

    今天要介绍一个概念,对象的克隆.本篇有一定难度,请先做好心理准备.看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充. 克隆,自然就是将对象重新复制一份,那为什么要用克隆呢 ...

  2. C#并发集合(转)

    出处:https://www.cnblogs.com/Leo_wl/p/6262749.html?utm_source=itdadao&utm_medium=referral 并发集合 1 为 ...

  3. elasticsearch-环境搭建

    1:下载并安装JDK 下载地址:jdk-8u91-windows-x64.exe 2:下载elasticsearch压缩包 下载地址:elasticsearch-2.3.0.zip 下载之后解压缩文件 ...

  4. [待完善]mycat分布式架构部署

    mycat介绍:http://mycat.org.cn/ mycat分布式架构部署

  5. 配置weblogic nodemanager管理器

    [内容提示]:看了一场皇族对阵OMG的比赛,失落 .皇族又输了..  可爱的UZI...   我承认我是逗比,看了3天节点管理器才明白点东西 .笨笨 .. 废话不多说,上图!所有的故意围绕一张图开始了 ...

  6. Matlab用mpeaks函数求峰值点坐标

    clear;clc;close all % 初始化 m = [-6,-2,0,2,4,6]; sigma = [1,1,0.5,0.25,0.6,2]; h = [1,2,3,2,2.13,3.14] ...

  7. DML DDL

    DDL 1.SQL分为5大类: DDL:数据定义语言 DCL:数据控制语言 DML:数据操纵语言 DTL:数据事务语言 DQL:数据查询语言 2.DDL(data definition languag ...

  8. python常用算法题

    一: #计算平均数,中位数和众数 #coding:utf-8 #计算平均数,中位数和众数 import random lst = [random.randint(0,10) for i in rang ...

  9. 我们学习Java今后的发展前景

      Java应用的前景   Java技术自1995年问世以来,在我国的应用和开发也得到了迅速普及,总体来看,这 些应用主要集中于企业应用开发.据有关单位调查显示,从开发领域的分布情况上看Web 开发占 ...

  10. js跳转页面方法实现汇总

    一.页面之间的跳转传参 1.在页面之间跳转的方式有两种: window.location.href=”test.html?num=10”   地址会改变参数也会被传递但是不会打开新窗口 window. ...