1.生成器,迭代器,闭包,装饰器的优点

生成器就是一类特殊的迭代器

迭代器的优点也即生成器的优点:

1、节约内存。python在使用生成器时对延迟操作提供了支持。

2、迭代到下一次的调用时,所使用的参数都是第一次所保留下的。

装饰器就是一类特殊的闭包

闭包的优点:可以实现代码复用性,防止代码冗余,就是让这些变量的值始终保持在内存中,不会在调用后被自动清除。

装饰器的优点:1.在不修改原功能模块代码前提下,还能增加新的功能

2.可以实现代码复用性,防止代码冗余(装饰器就是一类特殊的闭包)

2.生成器,迭代器,闭包,装饰器的特点

在python中创建生成器

在python中,有两种创建生成器的方式:

1、生成器表达式

类似与列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。

使用列表推导,将会一次返回所有结果:

1 li=[i**2 for i in range(5)]
2 print(li)
3
4 [0, 1, 4, 9, 16]
5 [Finished in 0.3s]

将列表推导的中括号,替换成圆括号,就是一个生成器表达式:

1 li=(i**2 for i in range(5))
2 print(li)
3 for x in range(5):
4 print(next(li))
<generator object <genexpr> at 0x0000000001E18938>
0
1
4
9
16
[Finished in 0.3s]

2、生成器函数

常规函数定义,但是使用yield语句而不是return语句返回结果。yield语句每次返回一个结果,但每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行。

我们下面来看一个例子。下面为一个可以无穷生产奇数的生成器函数。

def odd():
n=1
while True:
yield n
n+=2
odd_num=odd()
count=0
for o in odd_num:
if count >=5:
break
print(o)
count += 1

输出结果为:

1 1
2 3
3 5
4 7
5 9
6 [Finished in 0.3s]

上面的函数中,yield是必备的,当一个普通函数中包含yield时,系统会默认为是一个generator。

什么是闭包?

内部函数对外部函数作用域里变量的引用(非全局变量),则称内部函数为闭包。

闭包三要素:

      1、嵌套函数 

      2、变量的引用

      3、返回内部函数

举例如下:

#定义一个嵌套函数(要素1)
def test(num):
def test_in(num_in):
#内部函数引用外部函数的变量(非全局变量)(要素2)
print("sum = %s"%(num + num_in))
#返回的结果可以被打印出来
return num,num_in
#返回内部的函数(要素3)
return test_in
#这里的rtn就是test_in
rtn = test(10)
print(rtn)
#内部函数test_in传参
print(rtn(20))

输出结果为:

1 <function test.<locals>.test_in at 0x000000000220E378>
2 sum = 30
3 (10, 20)
4 [Finished in 0.3s]

什么是装饰器(decorator)?

装饰器其实就是一个闭包,把一个函数当作参数然后返回一个替代版函数。

装饰器有2个特性:
  1、可以把被装饰的函数替换成其他函数

  2、可以在加载模块时候立即执行

举例如下:

  A、装饰器对无参数函数进行装饰:

#装饰器本质就是一个闭包,
#将函数当成参数传进去
def deco(fun):
def inner():
print("你想进行的操作1")
print("你想进行的操作2")
fun()
return inner
#@deco是一个“语法糖”
@deco # 等价于 test = deco(test)
def test():
print("test函数的操作")
#这个test已经被装饰了,不是原来的test
test()
#test()等同于如下操作:
#rtn = deco(test)
#rtn()

输出结果为:

1 你想进行的操作1
2 你想进行的操作2
3 test函数的操作
4 [Finished in 0.3s]

更多详细的知识点可参考:

https://www.cnblogs.com/tianyiliang/p/7811041.html

python 生成器,迭代器,闭包,装饰器的更多相关文章

  1. python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式

    闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...

  2. 5.python(迭代器,装饰器,生成器,基本算法,正则)

    一,迭代器 1.迭代器  (1)迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退.  (2)对于原生支持随机访问的数据结构(如t ...

  3. Python之迭代器、装饰器、软件开发规范

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  4. Python 进阶_闭包 & 装饰器

    目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...

  5. Python的迭代器与装饰器

    '''迭代器:两个基本方法:iter()和next()迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合等第一个元素开始访问,直到所有的元素被访问结束,迭代器只能往前不会后退. 迭代器有两个基本 ...

  6. python之嵌套 闭包 装饰器 global、nonlocal关键字

    嵌套: 在函数的内部定义函数闭包: 符合开放封闭原则:在不修改源代码与调用方式的情况下为函数添加新功能  # global 将局部变量变成全局变量 num = 100 def fn1(): globa ...

  7. python高级-闭包-装饰器

    闭包内容: 匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能 普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能 闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递 ...

  8. 08 . Python3高阶函数之迭代器、装饰器

    Python3高阶函数之迭代器.装饰器 列表生成式 推导式就是构建比较有规律的列表,生成器. 孩子,我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表里 ...

  9. python设计模式之内置装饰器使用(四)

    前言 python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python设计模式之装饰 ...

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

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

随机推荐

  1. js(一) 三大事件 实现注册验证

    ps:小声比比,为什么一周多没更,因为js真的好难啊. 上一周做了一整周的jsp+sevlet+mysql做了一个MVC模式的最基本的新闻系统源码会有空搞出来的 好累 好多的. 三大事件 (鼠标事件. ...

  2. 2019-4-12-WPF-绑定的默认模式

    title author date CreateTime categories WPF 绑定的默认模式 lindexi 2019-04-12 09:38:58 +0800 2019-04-12 09: ...

  3. the password has expired

    Oracle提示错误消息ORA-28001: the password has expired,是由于Oracle11G的新特性所致, Oracle11G创建用户时缺省密码过期限制是180天(即6个月 ...

  4. 基于ElementUI封装Excel数据导入组件

    由于前端项目使用的是Vue-cli3.0 + TypeScript的架构,所以该组件也是基于ts语法封装的,组件的完整代码如下: <template> <div id="m ...

  5. vue-learning:26 - component - 组件三大API之一:prop

    组件三大API之一: prop prop的大小写 prop接收类型 字符串数组形式 对象形式: type / required / default / validator prop传递类型: 静态传递 ...

  6. 【35.12%】【POJ 1988】Cube Stacking

    Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 24007 Accepted: 8432 Case Time Limit: 100 ...

  7. Linux统计文件/目录数量ls -l | grep "^-" | wc -l匹配开头和结尾,wc -c统计字符串长度

    Linux统计文件数量 ls -l | grep "^-" | wc -l “^-”  一般文件 “^d” 目录文件 shell/vim中^表示开头 cat repatterns ...

  8. Visual Studio Team Services and Team Foundation Server官方资料入口

    Team Foundation Server msdn 中文文档入口 Visual Studio Team Services or Team Foundation Server www.visuals ...

  9. VRchat模型之unity

    VRChat模型制作及上传总篇(包含总流程和所需插件):https://www.cnblogs.com/raitorei/p/12015876.html 0.新建工程, 导入VRCSDK及动态骨骼插件 ...

  10. python列表的增删查改

    添加新的元素 append() insert() extend() +号 删除元素 pop() remove() del xxx[index] 修改 xxx[index] = value 查找 in. ...