装饰器(函数)

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 数组拷贝方法 System.arraycopy

    System类提供的数组拷贝方法: public static native void arraycopy(Object src, int srcPos, Object dest, int destP ...

  2. layer.alert没有垂直居中

    经查找是因为 <!DOCTYPE html> 这句没有写在整个页面的最顶部,将其放在整个页面的第一行就可以了. ps:原理不是很清楚

  3. 假期训练八(poj-2965递归+枚举,hdu-2149,poj-2368巴什博奕)

    题目一(poj-2965):传送门 思路:递归+枚举,遍历每一种情况,然后找出最小步骤的结果,与poj-1753类似. #include<iostream> #include<cst ...

  4. 苹果电脑thunderbolt连接两台电脑启动方法

    thunderbolt:首先连接连台电脑 然后开启可以启动的电脑, 关闭无法启动的电脑. 接着 按一下法启动的电脑电源—> 然后按t键 会在另外一台可以启动的电脑上出现,无法启动电脑的磁盘. 就 ...

  5. 第9章 符合Python风格的对象

    #<流畅的Python>读书笔记 # 第9章 符合Python风格的对象 # 本章包含以下话题: # 支持用于生成对象其他表示形式的内置函数(如repr().bytes(),等等) # 使 ...

  6. linux利用命令将一个盘上的所有复制到另一个盘上

    1.fdisk -l 查看硬盘状况 2.将目标盘利用mount挂载 3.查看硬盘使用状况,看目标盘是否有足够的空间:df -h 4.如果足够,利用dd命令将源盘数据拷贝到目标盘:dd if=/dev/ ...

  7. C++ MFC棋牌类小游戏day1

    好用没用过C++做一个完整一点的东西了,今天开始希望靠我这点微薄的技术来完成这个小游戏. 我现在的水平应该算是菜鸟中的战斗鸡了,所以又很多东西在设计和技术方面肯定会有很大的缺陷,我做这个小游戏的目的单 ...

  8. C++标准库addressof的应用

    C++11将addressof作为标准库的一部分,用于取变量和函数等内存地址. 代码示例: #include <memory> #include <stdio.h> void ...

  9. UISegmentedControl 改变选中字体的颜色

    //设置选中的字体颜色为蓝色    [segmentControll setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor ...

  10. Web结构组件

    一.Web结构组件 1.代理 位于客户端和服务器之间的HTTP实体,接收客户端的所有HTTP请求,并将这些请求转发给HTTP服务器. 2.缓存 HTTP的仓库,使常用的页面的副本可以保存在离客户端更近 ...