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. H3C NAPT配置举例

  2. java构造方法的私有化

    有的时候我们为了避免外界创建某类的实例,就将某类的构造方法私有化,即将它的构造方法用private修饰: 外界如何用到? 提供get方法!不提供的话外界就没法创建对象!(对反射无效) Eg:packa ...

  3. P1103 走迷宫三

    题目描述 大魔王抓住了爱丽丝,将她丢进了一口枯井中,并堵住了井口. 爱丽丝在井底发现了一张地图,他发现他现在身处一个迷宫当中,从地图中可以发现,迷宫是一个N*M的矩形,爱丽丝身处迷宫的左上角,唯一的出 ...

  4. SVN中如何执行clean up

    在要清理的文件夹上点右键,菜单:TortoiseSVN--选择cleanup,会出现一个菜单栏,在你菜单栏有一个属性breaklock意思是打破锁定,你勾选打破锁定,然后cleanup就会成功,之后再 ...

  5. UVA 11212 Editing a Book [迭代加深搜索IDA*]

    11212 Editing a Book You have n equal-length paragraphs numbered 1 to n. Now you want to arrange the ...

  6. 给js加版本号解决浏览器缓存问题

    我们知道打开网页时浏览器会加载需要的资源,比如图片.音频.js文件.css文件等.并且会把这些资源作为缓存保存下来,再次打开网页时缓存好的资源就不需要再次加载了.但是,这样有一个问题,就是当程序猿更新 ...

  7. 2019-2-27-win10-uwp-去掉-Flyout-边框

    title author date CreateTime categories win10 uwp 去掉 Flyout 边框 lindexi 2019-02-27 17:48:46 +0800 201 ...

  8. 在eclipse动态网页项目中,编写web.xml时,servlet标签报错.

    cvc-complex-type.2.4.b: The content of element 'servlet' is not complete. One of '{"http:// jav ...

  9. ZR8.2 DP

    DP 1CF1101D 我们发现,最终答案一定和质因数有关 我们发现\(w_i <= 2*10^5\)级别的树,他的素因子的个数不会非常多(\(<=10\)) 然后我们就设 gcd是\(d ...

  10. How to fix nuget Unrecognized license type MIT when pack

    When I packaging license within the nupkg, I will using License to replace licentUrl. I using this c ...