装饰器:

在编程时,要遵循一个原则,就是开放-封闭原则。
在不破坏原函数的情况下,要想对原函数进行一些修饰,那么这里就要用到装饰器。
例如:你完成了一些用函数写成的项目,此时公司正在年度考核,你需要给你写的每一个函数都加上一个计算时间的功能,随即考核完成后,又需要把函数恢复原状,到了下一阶段考核,可能又要用到这个计算时间功能,一般来说项目中的函数是很多的,怎样才能一次性的为所有函数加上功能呢?
这里就要用到装饰器这个知识点。

wahaha()
jiaduobao()

此处调用原函数时,可以发现函数的功能是可以正常执行的,符合了编程开放-封闭的规则,而设置了一个可以控制的变量FLAGE,通过改变FLAGE的值,控制装饰器的开关。

分析:@time_out(FLAGE) 可以把@和time_out(FLAGE)分开来看,在python中程序都是从右向左执行的,所以先执行time_out(FLAGE)这层函数,将timer的内存地址给返回给@,而@就等于wahaha = timer(wahaha),再将inner的内存地址返回出来,在调用wahaha()时,其本质就是在调用inner,而在inner的内部做到了FLAGE控制装饰器的功能,这里用到了闭包这个概念。

闭包:在内层函数可以引用外层函数的变量,在使用装饰器时,就是利用了闭包这个原理,在执行完外层函数后,并没有把变量立即释放掉,而是封装在函数的内部。

生成器:

生成器的本质就是迭代器,那么什么是迭代器呢?这涉及到什么是可迭代的对象。

可迭代的对象:含有__iter__方法的对象,可以通过.__dict__查看名称空间判断,可迭代的对象一定可以被for循环,例如str、list、dir、set、range等等

而迭代器就是同时拥有__iter__和__next__方法的可迭代对象。而可迭代对象可以通过调用__iter__方法成为一个迭代器。

言归正传,生成器就是迭代器的一种,生成器有两种表现形式,第一种是生成器函数,第二种是生成器表达式。

生成器函数就是含有yield关键字的函数

生成器函数特点:调用函数之后函数不会执行,而是返回一个生成器,每次调动next()方法时才会去取出一个值。直到取到了最后一个值,再执行一次next(),那么程序就会报错。

生成器表达式:g=(i for i in range(10))

此时的g就是一个生成器了,比函数更方便。

从生成器中取值的几个方法:

1.next 2.for 3.数据类型的强制转换 例如:list(g) g代表一个生成器

强制转换存在一个缺点就是会瞬间占用内存,如果生成器中存储的数据较多,那么有撑爆内存的风险,造成电脑死机。而for循环和next都是一个一个去取的,即拿即用,所以不存在这个风险。

分析生成器:

此例中g=test()时并没有去执行任何操作,只是把生成器返回给了g,在遇到for循环生成器嵌套问题时,需要把问题拆分。

n=1时,g=(add(i,n) for i in test()) #此时的g就是test()

n=10,g=(add(i,n) for i in g=(add(i,n) for i in test()))#此时的g是上面的g,g被重新赋值了一次。

n=5,g=(add(i,n) for i in (add(i,n) for i in g=(add(i,n) for i in test())),此时g又被赋值了一次,现在可以将n=5代入计算了,test()取到的就是0,1,2,3

生成器中还有一个send()的方法

send()的效果与next基本一致,只是在获取下一个值的时候,给上一个yield传递一个数据(信号)。

send()使用时的注意事项,第一次使用生成器的时候,是用next获取下一个值的,最后一个yield也不能接受外部的值。

例:

来分析一下程序执行的过程,首先g=test(),那么g就是一个生成器,随后a=g.__next__(),使生成器执行一次并yield1,此时count=这个赋值语句还没来得及执行就被yield打断了,先返回了1,所以print(a)能得到123,1

然后调用了send('hello'),此时count=赋值语句执行,将hello赋值给了count,打印出======hello,然后再打印456,yield2,程序再次终止。

相对于next来说send方法使用的少。

精析python中的装饰器、生成器的更多相关文章

  1. 简单说明Python中的装饰器的用法

    简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下   装饰器对与 ...

  2. 【Python】python中的装饰器——@

    对装饰器本来就一知半解的,今天终于弄清楚了,Python中的装饰器是对装饰者模式的很好运用,简化到骨子里了. python中为什么需要装饰器,看这里:http://www.cnblogs.com/hu ...

  3. Python 中实现装饰器时使用 @functools.wraps 的理由

    Python 中使用装饰器对在运行期对函数进行一些外部功能的扩展.但是在使用过程中,由于装饰器的加入导致解释器认为函数本身发生了改变,在某些情况下——比如测试时——会导致一些问题.Python 通过  ...

  4. 写python中的装饰器

    python中的装饰器主要用于在已有函数实现功能前附加需要输出的信息,下面将用实例展示我如何写装饰器. 首先分别尝试写装饰器装饰一个无参函数和一个有参函数(被装饰函数仅输出,无返回值情况下) def ...

  5. python中的装饰器decorator

    python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x): retur ...

  6. python中@property装饰器的使用

    目录 python中@property装饰器的使用 1.引出问题 2.初步改善 3.使用@property 4.解析@property 5.总结 python中@property装饰器的使用 1.引出 ...

  7. 【Python】解析Python中的装饰器

    python中的函数也是对象,函数可以被当作变量传递. 装饰器在python中功能非常强大,装饰器允许对原有函数行为进行扩展,而不用硬编码的方式,它提供了一种面向切面的访问方式. 装饰器 一个普通的装 ...

  8. 三分钟搞定Python中的装饰器

    python的装饰器是python的特色高级功能之一,言简意赅得说,其作用是在不改变其原有函数和类的定义的基础上,给他们增添新的功能. 装饰器存在的意义是什么呢?我们知道,在python中函数可以调用 ...

  9. Python中的装饰器,迭代器,生成器

    1. 装饰器 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1和2的 ...

随机推荐

  1. 【托业】【新东方托业全真模拟】TEST05~06-----P5~6

    credit A with B 把A归功于B present A with B 给A赠送B proofread thoroughly 彻底地校对:exclusively 专门地:独占地:apparen ...

  2. java框架之Hibernate(2)-持久化类&主键生成策略&缓存&事务&查询

    持久化类 概述 持久化:将内存中的对象持久化到数据库中的过程就是持久化.Hibernate 就是用来进行持久化的框架. 持久化类:一个 Java 对象与数据库的表建立了映射关系,那么这个类在 Hibe ...

  3. slf4j日志使用

    scala中 trait LogSupport { protected val log = LoggerFactory.getLogger(this.getClass) } 需要要到的类 extend ...

  4. js回溯法计算最佳旅行线路

    假如有 A,B,C,D四个城市,他们之间的距离用 G[V][E] 表示,为 无穷大,则表示两座城市不相通 现在从计算从某一个城市出发,把所有的城市不重复旅行一次,最短路径 其中G为: (Infinit ...

  5. MFC 的资源文件 就是那个后缀名是 .rc的那个

    参考: http://blog.csdn.net/zgrjkflmkyc/article/details/16897881 http://www.oschina.net/question/565065 ...

  6. db2常见错误代码及原因

    sqlcode sqlstate 说明000 00000 SQL语句成功完成01xxx SQL语句成功完成,但是有警告+012 01545 未限定的列名被解释为一个有相互关系的引用+098 01568 ...

  7. Centos开机自启动脚本的制作

    原文地址:http://www.2cto.com/os/201306/220559.html 我的一个Centos开机自启动脚本的制作   一.切换到/etc/init.d/   二.制作sh脚本 v ...

  8. Linux安装 centos 7 最小化 安装

    我用的是vmware 15 ,我将用图片的形式带领大家安装,没有说到的地方为默认选项    最好把文件放到一个单独的文件夹中    简单密码点击两次DONE 即可,虚拟机密码不必那么复杂,工作环境请设 ...

  9. 记录Js 文本框验证 与 IE兼容性

    最近的日常就是将测试小姐姐提交的bug进行修改,想来这种事情还是比较好开展的,毕竟此项目已上线一年多,现在只是一些前端的问题需要改正.实际上手的时候并不是这样,原项目是在谷歌上运行,后来由于要新增一个 ...

  10. Solution about MB STAR C4, MB STAR C5 Update and can not test vehicles problems

    Solution about MB Star C4, MB Star C5 Update and can not test vehicles problems 1. Make sure your co ...