装饰器是什么? 有什么用? 为什么要用? 真的有用吗?

1、装饰器:

装饰器:
  定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能。
  原则:1、不能修改被装饰的函数的源代码
           2、不能修改被装饰的函数的调用方式
插播一条广告: 
  Python内存自动回收机制。
  到底怎么个回收法呢? 有一个定时器,会不断的扫描这些字符串、值等,如果发现某个没有被引用,则回收掉。如:del(var1) 删除的是var1这个变量名,这个变量对应的值回收的两种情况1、程序结束;2、定时扫描到值没有任何地方引用。
 
嵌套函数: 在函数内再定义函数 
高阶函数 + 嵌套函数 ---> 装饰器
@auth #index = auth(index)
def index()
 
再来个脑补,何为生成器?:

生成器

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

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成()

>>> L = [x * x for x in range(10)]  # 通过迭代-->列表生成式
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10)) # 生成器
>>> g
<generator object <genexpr> at 0x1022ef630>

迭代是什么? 原谅我的无知。。。

迭代器Iterable|iteror、生成器generator

  http://www.cnblogs.com/alex3714/articles/5765046.html#3616312

list\tuple\str等都是可迭代对象、但并不是生成器,使用iter可转换。

迭代器

我们已经知道,可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如listtupledictsetstr等;

一类是generator,包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable

迭代器

  凡是可作用于for循环的对象都是Iterable类型;

  凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

  集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

  Python的for循环本质上就是通过不断调用next()函数实现的

迭代器似乎大小可预见且量小。生成器看起来大小不可预定、不可预见如裴波那切。函数中有yeid的就是生成器

白了句: yield又是哪位大大?……不说了看连接http://www.cnblogs.com/alex3714/articles/5765046.html#3616312

#

回到装饰器:

看例子

#-*- coding: utf-8 -*-
# Wind clear raise
# 2017/2/11 下午1:23 # 装饰器 复习 def auth(auth_type):
print("auth interface:", auth_type)
if auth_type == "weixin":
print("weixin interface, 搞点啥呢")
else:
print("default")
def wrapper(func): # func接收被装饰的函数
def wrapper(args): # 被装饰的函数的参数
# 调用func..home前干点啥,比如认证,跟认证结果等来确定 home的执行方式或者是不执行
print("调用home干啥?")
func(args)
print("home完了?,再给补个刀")
return wrapper
return wrapper @auth("weixin")
# @auth相当于下面这两行, 有什么鸟用? auth那里需要条件判断的,比如微信接口、微博等
# f = auth("webchart")
# auth = f(home) def home(args):
print("in home: ", args) home("Lucy") # 简单装饰器
def auth(func):
def wrapper(name=''):
print("前戏。。")
func(name) #
print("收拾一下")
return wrapper
@auth
def index(name):
print("开搞", name) index("Lucy")
index()

装饰器:函数嵌套、高阶函数组合而成的

python二 总结--函数-- 装饰器的更多相关文章

  1. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

  2. python 修改的函数装饰器

    把好的代码记录下来 方便以后学习 修改的函数参数装饰器 from functools import wraps import time import logging def warn(timeout) ...

  3. Python中的@函数装饰器到底是什么?

    在解释@函数装饰器之前,先说一下,类中的类方法和静态方法. 在Python中完全支持定义类方法.静态方法.这两种方法很相似,Python它们都使用类来调用(ps:用对象调用也可以). 区别在于:Pyt ...

  4. python语法基础-函数-装饰器-长期维护

    ######################################################### # 装饰器 # 装饰器非常重要,面试Python的公司必问, # 原则:开放封闭原则 ...

  5. python 进阶篇 函数装饰器和类装饰器

    函数装饰器 简单装饰器 def my_decorator(func): def wrapper(): print('wrapper of decorator') func() return wrapp ...

  6. Python作用域-->闭包函数-->装饰器

    1.作用域: 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我要理解两点:a.在全局不能访问到局部 ...

  7. Python进阶-III 函数装饰器(Wrapper)

    1.引入场景: 检查代码的运行时间 import time def func(): start = time.time() time.sleep(0.12) print('看看我运行了多长时间!') ...

  8. Decorator——Python初级函数装饰器

    最近想整一整数据分析,在看一本关于数据分析的书中提到了(1)if __name__ == '__main__' (2)列表解析式 (3)装饰器. 先简单描述一下前两点,再详细解说Python初级的函数 ...

  9. C++函数装饰器

    今天在网上看到一个python实现的函数装饰器,尝试用C++11实现了一下,最后很粗糙的完成了,代码如下. 函数装饰器:接受一个函数.将此函数进行一些装饰,成为另一个函数.新生产的函数具有原函数的功能 ...

随机推荐

  1. 实现用 jquery 禁用浏览器的前进后退按钮

  2. springMVC(二): @RequestBody @ResponseBody 注解实现分析

    一.继承结构 @RequestBody.@ResponseBody的处理器:RequestResponseBodyMethodProcessor @ModelAttribute处理器: ModelAt ...

  3. Delphi避免重复打开窗体

    取消自动创建窗体 Form1关键代码 implementation uses Unit2; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObje ...

  4. 20165236郭金涛 预备作业3 Linux安装及学习

    我在Linux安装过程遇到的问题: 1.“不能为虚拟电脑XX打开一个新任务”: 出现这种情况是电脑没有开启blos,解决方法是:开机进入联想界面的时候,直接按F2可以快速进入选择开启blos. Lin ...

  5. 微信小程序echart 折线图legend不显示的问题

    最近使用小程序echart折线图,遇到表头一直不显示问题,查询之后解决方案:

  6. “脚踢各大Python Web框架”,Sanic真有这能耐么?

    在Github上,Sanic第一句介绍语就是: "Sanic is a Flask-like Python 3.5+ web server that's written to go fast ...

  7. [LeetCode] 278. First Bad Version_Easy tag: Binary Search

    You are a product manager and currently leading a team to develop a new product. Unfortunately, the ...

  8. curl不能支持https问题

    前面说了 update nss 并没有解决问题. 想办法重新安装一下:CURL 1.下载安装包 [root@mycentos ~]# wget https://curl.haxx.se/downloa ...

  9. OpenResty编译安装

    从下载页 Download下载最新的 OpenResty® 源码包,并且像下面的示例一样将其解压: tar -xzvf openresty-VERSION.tar.gz VERSION 的地方替换成您 ...

  10. centos7安装Amber16 && AmberTools

    Centos7 安装amber16 1.准备下载好的amber(Amber16.tar.bz2)及tools(AmberTools16.tar.bz2)安装包: $ cd MySoftware_hom ...