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

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. Java 生成三位随机数

    调用这个Math.Random()函数能够返回带正号的double值,该值取值区间是[0.0,1.0),注意,它是左闭右开区间.返回值是一个伪随机选择的数,在该范围内(近似)均匀分布. 如果生成三位随 ...

  2. bug: '\xff' 转换成-1 而不是255

    后台给的值处理后 Byte rtncode = payload[0]; 打印payload[0]是'\xff', 增加 if (rtncode ==255 ){ ....} 的判断,跳里面去了 然后用 ...

  3. 接口测试工具-Jmeter使用笔记(一:运行一个HTTP请求)

    博主自从毕业从事软件测试行业距今一年半时间,大多数时间都在跟各种API打交道,使用过的接口测试工具也有许多,本文记录下各工具的使用心得,以及重点介绍我在工作中是如何使用Jmeter做测试的,都是在wi ...

  4. linux 查看磁盘读写:iotop

    iotop命令用来动态地查看磁盘IO情况,用法如下: 安装iotop命令 [root@mysql ~]# yum install iotop -y [root@mysql ~]# iotop Tota ...

  5. Python3学习之路~5.2 time & datetime模块

    time模块 时间相关的操作,时间有三种表示方式: 时间戳               1970年1月1日之后的秒,即:time.time() 格式化的字符串    2014-11-11 11:11, ...

  6. python基础(9)-迭代器&生成器函数&生成器进阶&推导式

    迭代器 可迭代协议和迭代器协议 可迭代协议 只要含有__iter__方法的对象都是可迭代的 迭代器协议 内部含有__next__和__iter__方法的就是迭代器 关系 1.可以被for循环的都是可迭 ...

  7. testetest

    resumeLoad renren静态 foolday \ swImg activity01

  8. 向数据库中添加数据,通过se16 不能添加,通过 代码可以添加的原因

    1:  在向数据库中添加数据时,通过客户端se16 准备对 数据表进行添加数据,提示如下: 找了以下原因,如下: https://www.baidu.com/link?url=3yRtAfY1_9XG ...

  9. java中Long的比较

    Long的比较要用equals而不要用== 当Long为常量且常量值小于一个字节(<=127)时,两个Long指向同一个常量内容: Long userId=127L; Long authorId ...

  10. centos6下升级git版本的操作记录

    编译go_ethereum的时候出现了错误 然后发现是自己的git没有升级成功  因为编译需要高版本的git版本  所以会编译不成功  之后执行 root@uatjenkins01 ~]# git - ...