装饰器:

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

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. bugfree3.0.1-修改“优先级”为中文引起的PHP Error

    博主在搭建好bugfree后,修改了系统中“优先级”字段,将原先系统定义的优先级“1.2.3.4”修改为符合博主自己项目要求的优先级“高.中.低”.修改成功后,系统确实将原先提交的BUG优先级从“1. ...

  2. python使用MySQLdb实现连接数据库Mysql

    python实现连接数据库mysql的步骤: 一.引入MySQLdb 二.获取与数据库的连接 三.执行SQL语句和存储过程 四.关闭数据库连接 1.什么是MySQLdb? MySQLdb是用于pyth ...

  3. XP支持AHCI硬盘工作模式

    故障 装XP系统后开启AHCI模式会出现开机蓝屏重启的问题,如何在XP下加载AHCI驱动,以便开启BIOS中AHCI选项来发挥硬盘的最佳性能. 问题分析XP系统无法直接支持AHCI硬盘高速模式,需要加 ...

  4. 把spring boot发布成window Service

    一:下载Winsw, 把下载后的文件名改为你的应用如doctor.exe 二:添加xml <service> <id>doctor-api-service</id> ...

  5. DOIS 2019 DevOps国际峰会北京站来袭~

    DevOps 国际峰会是国内唯一的国际性 DevOps 技术峰会,由 OSCAR 联盟指导.DevOps 时代社区与高效运维社区联合主办,共邀全球80余名顶级专家畅谈 DevOps 体系与方法.过程与 ...

  6. IIS相关

    使用aspnet_regiis.exe重新注册.NET Framework 重新安装IIS以后,需要用aspnet_regiis.exe来注册.NET Framework, 如下: C:\WINDOW ...

  7. webpack 常用命令

    1 初始化package.json npm init -y 2 全局安装webpack npm install webpack -g 3 安装webpack依赖 npm install webpack ...

  8. Scala 偏函数

    如果你想定义一个函数,而让它只接受和处理其参数定义域范围内的子集,对于这个参数范围外的参数则抛出异常,这样的函数就是偏函数(顾名思异就是这个函数只处理传入来的部分参数). 偏函数是个特质其的类型为Pa ...

  9. 常用python的标准库

    1.itsdangerous # 加密签名的数据 2.re # 正则表达式 3.time # 时间模块 4.keyword # 查看关键字5.random # 随机6.uuid

  10. 使用查询分析器和SQLCMD分别登录远程的SQL2005的1434端口

    SQLCMD是操作SQLSERVER的一个命令行工具, 而查询分析器是它的图形工具     查询分析器(SQL2005下叫managerment studio),连接远程的SQLSERVER2005, ...