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. Spring Data Jpa一对多单向映射

    /** @author StormMaybin @date 2017-01-17 */ 生命不息,奋斗不止! 一对多映射关系 在JPA中,用@OneToMany来标识一对多的关系.实现一对多的单向关联 ...

  2. java.lang.ClassCastException: com.sun.proxy.$Proxy6 cannot be cast to com.etc.service.serviceImpl.BankServiceImpl

    错误原因: java.lang.ClassCastException: com.sun.proxy.$Proxy6 cannot be cast to com.etc.service.serviceI ...

  3. 【7003】&&【a203】合并多项式

    Time Limit: 3 second Memory Limit: 2 MB 问题描述      求两个一元多项式的和.输入多项式方式为:多项式项数.每项系数和指数,按指数从大到小的顺序输入.输出多 ...

  4. Linux 内核存取配置空间

    在驱动已探测到设备后, 它常常需要读或写 3 个地址空间: 内存, 端口, 和配置. 特别 地, 存取配置空间对驱动是至关重要的, 因为这是唯一的找到设备被映射到内存和 I/O 空间的位置的方法. 因 ...

  5. Java虚拟机参数,增加虚拟机最大内存,在/etc/profile增加如下: export JAVA_OPTS="-Xms9g -Xmx9g"

    一.运行class文件 执行带main方法的class文件,Java虚拟机命令参数行为: java <CLASS文件名> 注意:CLASS文件名不要带文件后缀.class 例如: java ...

  6. 牛客练习赛11 假的字符串 (Trie树+拓扑找环)

    牛客练习赛11 假的字符串 (Trie树+拓扑找环) 链接:https://ac.nowcoder.com/acm/problem/15049 来源:牛客网 给定n个字符串,互不相等,你可以任意指定字 ...

  7. 云栖大会压轴好戏 阿里云发布视频云V5计划与系列新产品

    9月25 - 27日,2019云栖大会如期召开.在大会最后一天下午,阿里云智能视频云分论坛为今年的云栖大会献上了一场精彩的压轴好戏. 视频云V5计划发布 使能生态合作伙伴 会上,阿里云智能研究员金戈进 ...

  8. 如何抢占云栖大会C位?史上最强强强攻略来了

    本文作者:阿里云头条 原文链接 本文为云栖社区原创内容,未经允许不得转载.

  9. C. 【UNR #3】配对树

    题解: 首先可以贪心 于是问题可以等价成一条边被算当且仅当子树中个数为奇数个 题解的做法比较简单 考虑每条边,加入其子树内的点 然后为了保证区间长度为偶数 分成f0,0 f0,1 f1,0 f1,1即 ...

  10. 洛谷p2149----两个终点和两个起点,最短路最大交汇长度!!!

    说实话,这题真第一次见,学到了不少有趣的东西,因吹丝汀!! 思路:因为不可能同时并行和相遇(我也不知道为啥,等我会证明了就来说说) 所以正向建边再反向建边,拓扑排序+dp求最下长路,记录下最大的就是解 ...