精析python中的装饰器、生成器
装饰器:
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中的装饰器、生成器的更多相关文章
- 简单说明Python中的装饰器的用法
简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下 装饰器对与 ...
- 【Python】python中的装饰器——@
对装饰器本来就一知半解的,今天终于弄清楚了,Python中的装饰器是对装饰者模式的很好运用,简化到骨子里了. python中为什么需要装饰器,看这里:http://www.cnblogs.com/hu ...
- Python 中实现装饰器时使用 @functools.wraps 的理由
Python 中使用装饰器对在运行期对函数进行一些外部功能的扩展.但是在使用过程中,由于装饰器的加入导致解释器认为函数本身发生了改变,在某些情况下——比如测试时——会导致一些问题.Python 通过 ...
- 写python中的装饰器
python中的装饰器主要用于在已有函数实现功能前附加需要输出的信息,下面将用实例展示我如何写装饰器. 首先分别尝试写装饰器装饰一个无参函数和一个有参函数(被装饰函数仅输出,无返回值情况下) def ...
- python中的装饰器decorator
python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x): retur ...
- python中@property装饰器的使用
目录 python中@property装饰器的使用 1.引出问题 2.初步改善 3.使用@property 4.解析@property 5.总结 python中@property装饰器的使用 1.引出 ...
- 【Python】解析Python中的装饰器
python中的函数也是对象,函数可以被当作变量传递. 装饰器在python中功能非常强大,装饰器允许对原有函数行为进行扩展,而不用硬编码的方式,它提供了一种面向切面的访问方式. 装饰器 一个普通的装 ...
- 三分钟搞定Python中的装饰器
python的装饰器是python的特色高级功能之一,言简意赅得说,其作用是在不改变其原有函数和类的定义的基础上,给他们增添新的功能. 装饰器存在的意义是什么呢?我们知道,在python中函数可以调用 ...
- Python中的装饰器,迭代器,生成器
1. 装饰器 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1和2的 ...
随机推荐
- IDEA eclipse转maven
在pom.xml 文件上右键 Add as Maven Project
- Linq动态查询
public class ExpressionCall { List<Customer> customers = new List<Customer>() { new Cust ...
- puppeteer(二)操作实例——新Web自动化工具更轻巧更简单
一.入门实例 了解puppeteer见上一篇文章: https://www.cnblogs.com/baihuitestsoftware/p/9957343.html 1)本例主要是启动浏览器 con ...
- Java-番外篇-Java通过代码发给手机发信息
一.代码 import java.io.IOException; import org.apache.commons.httpclient.Header; import org.apache.comm ...
- os.path.join
os.path.join()函数: 第一个以”/”开头的参数开始拼接,之前的参数全部丢弃. 以上一种情况为先.在上一种情况确保情况下,若出现”./”开头的参数,会从”./”开头的参数的上一个参数开始拼 ...
- Python 进程之间共享数据
最近遇到多进程共享数据的问题,到网上查了有几篇博客写的蛮好的,记录下来方便以后查看. 一.Python multiprocessing 跨进程对象共享 在mp库当中,跨进程对象共享有三种方式,第一种 ...
- Jmeter接口测试+压力测试+环境配置+证书导出
jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单.因为jmeter是java开发的,所以运行的时候必须先要安 ...
- BIOS备忘录之x86硬件编程(寄存器与IO)
SOC固件(BIOS)开发: 1.熟悉硬件原理图:要弄清楚pin脚的功能: 2.配置GPIO引脚,配置成Native功能还是GPIO功能(如果是配置成GPIO,需要在code里面显式的使用): 3.硬 ...
- Vue 组件&组件之间的通信 之组件的介绍
什么是组件? 组件Component,可扩展HTML元素,封装可重用的代码.通俗的来说,组件将可重用的HTML元素封装成为标签方便复用: 组件的使用: 1.使用全局的方法Vue.extend创建构造器 ...
- 内置函数filter()和匿名函数lambda解析
一.内置函数filter filter()函数是 Python 内置的一个高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回由符合条件迭代器 ...