1、迭代器&生成器

列表生成式

现在有个需求,列表[1,2,3,4,5,6,7,,8,9],要求把列表里的每个值加1,如何实现?

方法一:

list = [1,2,3,4,5,6,7,8,9]for index,i in enumerate(list):list[index] = i + 1print(list)运行结果:[2, 3, 4, 5, 6, 7, 8, 9, 10]

 方法二:

list = [1,2,3,4,5,6,7,8,9]
#map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 列表list,并通过把函数 f 依次作用在 list 的每个元素上,
# 得到一个新的 list 并返回
a = map(lambda x:x+1,list)
for i in a:print(i)
运行结果:[2, 3, 4, 5, 6, 7, 8, 9, 10]

 其实,还有一种写法

list = [1,2,3,4,5,6,7,8,9]
a = [x+1 for x in list]
print(a)
运行结果:[2, 3, 4, 5, 6, 7, 8, 9, 10]

 这就叫做列表生成式

 生成器

通过列表生成式,我们可以创建一个列表,但是,受到内存限制,列表容量是有限的。而且,创建一个包含100百万元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间就白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可在循环过程中不断推算出后面的元素呢?这样就不需创建完整的列表,从而节省大量空间。在python中,这种一边循环一边计算的机制,称为生成器:generator。创建一个generator,有很多中方法,第一种方法很简单,只要把列表生成式中的[]改成(),就创建了一个generator。

a = [x+1 for x in range(10)]
print(a)
a = (x+1 for x in range(10))
print(a)
运行结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
<generator object <genexpr> at 0x0000017258EF2830>

 generator要打印出来,需要通过next()函数获得generator的返回值

print(next(a))
1
print(next(a))
2

generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

上面这种不断调用next(g)实在是太变态了,正确的方法是使用for循环,因为generator也是可迭代对象:

for i in a:print(i)

generator非常强大。如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。

比如,著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:

1, 1, 2, 3, 5, 8, 13, 21, 34, ..

斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:

def fib(max):n,a,b=0,0,1while n<max:print(b)a,b=b,a+bn +=1return 'done'fib(10)

  

仔细观察,可以看出,fib函数实际上是定义了斐波拉契数列的推算规则,可以从第一个元素开始,推算出后续任意的元素,这种逻辑其实非常类似generator。

也就是说,上面的函数和generator仅一步之遥。要把fib函数变成generator,只需要把print(b)改为yield b就可以了:

def fib(max):n,a,b=0,0,1while n<max:yield ba,b=b,a+bn +=1return 'done'

  这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。yield相当于一个断点

f = fib(10)
print(f.__next__())
print(f.__next__())
print("干点别的事")
print(f.__next__())
print(f.__next__())
运行结果:
1
1
干点别的事
2
3

  同样的,把函数改成generator后,我们基本上从来不会用next()来获取下一个返回值,而是直接使用for循环来迭代:

for i in fib(10):print(i)

  迭代器

我们已经知道,可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如listtupledictsetstr等;

一类是generator,包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable

可以使用isinstance()判断一个对象是否是Iterable对象:

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

个人理解:生成器就是迭代器

3、装饰器

软件开发原则:开放-封闭,不能改变原代码的调用方式。

  • 封闭:已实现的功能代码块不应该被修改
  • 开放:对现有功能的扩展开放

闭包函数:python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。

 1 import time
 2 def timer(func):
 3     def wrapper(*args,**kwargs):
 4         start_time=time.time()
 5         res=func(*args,**kwargs)#执行index原始函数
 6         stop_time = time.time()
 7         print('run time is %s' %(stop_time-start_time))
 8         return res
 9     return wrapper
10
11 @timer #index=timer(index)
12 def index(msg):
13     print('in the index: ',msg)
14     return 1
15 res=index('hello world') #wrapper('hello world')
16 print(res)
17 # 装饰器执行流程:
18 # 1、导入time模块
19 # 2、定义timer函数,函数名作为变量名赋值给timer函数
20 # 3、@timer index赋值给timer函数
21 # 4、定义闭包函数wrapper,直接返回wrapper
22 # 5、定义index函数
23 # 6、执行index函数,实际是执行timer函数的返回值wrapper函数

有参装饰器

转载于:https://www.cnblogs.com/syj888/p/10443901.html

python之路6-迭代器、生成器、装饰器相关推荐

  1. Python基础 day4 迭代器生成器 装饰器 Json pickle 数据序列化 软件目录结构规范 作业:ATM项目开发...

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

  2. 迭代器 生成器 装饰器 匿名函数

    迭代器 生成器 装饰器 匿名函数 #可迭代对象:列表.字典.集合.字符串:能够被for 循环遍历的对象# 数字类型不可迭代:# name="wangyifei"# for i in ...

  3. 迭代器/生成器/装饰器 /Json pickle 数据序列化

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

  4. python迭代器生成器装饰器

    基本概念 学习python中有什么不懂的地方,小编这里推荐加小编的python学习群:895 817 687有任何不懂的都可以在里面交流,还有很好的视频教程pdf学习资料,大家一起学习交流! 1.容器 ...

  5. Python 3 学习——函数扩展and迭代器生成器装饰器

    Python 学习的第九小节 写此博客 是为了激励自己,并且将自己的心得以及遇到的问题与人分享 一.学习笔记 1. 高阶函数 函数名可以作为函数参数输入 .可以进行赋值.还可以作为返回值. 2.作用域 ...

  6. python 生成器装饰器_4.python迭代器生成器装饰器

    基本概念 1.容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元 ...

  7. python 生成器装饰器_七.python迭代器生成器装饰器

    1.迭代器 1.1 什么是可迭代对象(Iterable)? 定义:可以直接作用于for循环的对象统称为可迭代对象,即Iterable. 可迭代对象包括: 1.集合数据类型:如list.tuple.di ...

  8. python学习day-8 迭代器 生成器 装饰器

    http://www.cnblogs.com/linhaifeng/articles/7580428.html 迭代器#迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代, ...

  9. day04 迭代器生成器装饰器

    目录   1.迭代器 2.生成器 3.推导式 4.匿名函数 5.内置函数 6.递归 7.闭包 8.装饰器 一.迭代器 特点: 1. 省内存 2. 只能向前. 不能反复 3. 惰性机制 让不同的数据类型 ...

  10. python基础(迭代器,生成器,装饰器)

    python: 生成器: 因为当列表元素达到一定上限,列表会占很大内存空间来存储,所以列表是受到内存限制的来适当使用. 生成器可以按照一个算法,循环推导出元素,就不用一次生成整个列表,而通过生成器(g ...

最新文章

  1. 黑鲨科学计算机,科学技术篇:玩家注意黑鲨一口气发布两款重磅新品
  2. 使用ISA Server 2006的DMZ区保护内网的服务器群
  3. LeetCode 881. 救生艇(贪心,双指针)
  4. SpringCloud 阶段总结
  5. Mysql Explain用法pdf
  6. DevEco Studio 使用和问题总结
  7. 【三支火把】--- 关于UEFIPCD的总结介绍
  8. 应云而生,原力觉醒——解读云原生基础设施 | 凌云时刻
  9. OPENCV Linux 显示中文 arm64
  10. 禁忌搜索(Tabu Search)算法及matlab实现(非旅行商(TSP)例子)
  11. Ubuntu 20.04 安装企业微信
  12. There appears to be trouble with your network connection
  13. YouTube embed gives “restricted from playback on certain sites” error despite API metadata indicatin
  14. Git基础之(三)——时光穿梭机
  15. ​ClinChoice昆翎完成收购北京岐黄;武田与红十字会达成合作;诺诚健华奥布替尼获美国FDA突破性疗法认定 | 医药健闻...
  16. idea 将分支代码合并到另一分支上
  17. Android 10 Settings应用如何去掉一级菜单定时开关机
  18. 无线打印服务器评测,打印服务器试用体验
  19. 论企业大数据的落地路径
  20. D3D12渲染技术之混合

热门文章

  1. 自动化测试基础篇--Selenium框架设计(POM)
  2. python-列表生成器
  3. c/c++基础 输入函数/流
  4. Could not find com.afollestad:material-dialogs:0.7.3.1解决
  5. 体绘制(Volume Rendering)概述介绍
  6. (FortiGate)飞塔防火墙防病毒解决方案
  7. Sharepoint the file is locked for use domain\user edit.文件被锁定,解锁方式
  8. nginx之upsream实现负载均衡
  9. ViewStub must have a valid layoutResource
  10. iOS-获取当前时间的年、月、日、时、分、秒