python之路6-迭代器、生成器、装饰器
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
循环的数据类型有以下几种:
一类是集合数据类型,如list
、tuple
、dict
、set
、str
等;
一类是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-迭代器、生成器、装饰器相关推荐
- Python基础 day4 迭代器生成器 装饰器 Json pickle 数据序列化 软件目录结构规范 作业:ATM项目开发...
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 列表生成器 1.列表生成式,迭代器&生成器 列表生成式 孩子, ...
- 迭代器 生成器 装饰器 匿名函数
迭代器 生成器 装饰器 匿名函数 #可迭代对象:列表.字典.集合.字符串:能够被for 循环遍历的对象# 数字类型不可迭代:# name="wangyifei"# for i in ...
- 迭代器/生成器/装饰器 /Json pickle 数据序列化
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...
- python迭代器生成器装饰器
基本概念 学习python中有什么不懂的地方,小编这里推荐加小编的python学习群:895 817 687有任何不懂的都可以在里面交流,还有很好的视频教程pdf学习资料,大家一起学习交流! 1.容器 ...
- Python 3 学习——函数扩展and迭代器生成器装饰器
Python 学习的第九小节 写此博客 是为了激励自己,并且将自己的心得以及遇到的问题与人分享 一.学习笔记 1. 高阶函数 函数名可以作为函数参数输入 .可以进行赋值.还可以作为返回值. 2.作用域 ...
- python 生成器装饰器_4.python迭代器生成器装饰器
基本概念 1.容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元 ...
- python 生成器装饰器_七.python迭代器生成器装饰器
1.迭代器 1.1 什么是可迭代对象(Iterable)? 定义:可以直接作用于for循环的对象统称为可迭代对象,即Iterable. 可迭代对象包括: 1.集合数据类型:如list.tuple.di ...
- python学习day-8 迭代器 生成器 装饰器
http://www.cnblogs.com/linhaifeng/articles/7580428.html 迭代器#迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代, ...
- day04 迭代器生成器装饰器
目录 1.迭代器 2.生成器 3.推导式 4.匿名函数 5.内置函数 6.递归 7.闭包 8.装饰器 一.迭代器 特点: 1. 省内存 2. 只能向前. 不能反复 3. 惰性机制 让不同的数据类型 ...
- python基础(迭代器,生成器,装饰器)
python: 生成器: 因为当列表元素达到一定上限,列表会占很大内存空间来存储,所以列表是受到内存限制的来适当使用. 生成器可以按照一个算法,循环推导出元素,就不用一次生成整个列表,而通过生成器(g ...
最新文章
- 黑鲨科学计算机,科学技术篇:玩家注意黑鲨一口气发布两款重磅新品
- 使用ISA Server 2006的DMZ区保护内网的服务器群
- LeetCode 881. 救生艇(贪心,双指针)
- SpringCloud 阶段总结
- Mysql Explain用法pdf
- DevEco Studio 使用和问题总结
- 【三支火把】--- 关于UEFIPCD的总结介绍
- 应云而生,原力觉醒——解读云原生基础设施 | 凌云时刻
- OPENCV Linux 显示中文 arm64
- 禁忌搜索(Tabu Search)算法及matlab实现(非旅行商(TSP)例子)
- Ubuntu 20.04 安装企业微信
- There appears to be trouble with your network connection
- YouTube embed gives “restricted from playback on certain sites” error despite API metadata indicatin
- Git基础之(三)——时光穿梭机
- ​ClinChoice昆翎完成收购北京岐黄;武田与红十字会达成合作;诺诚健华奥布替尼获美国FDA突破性疗法认定 | 医药健闻...
- idea 将分支代码合并到另一分支上
- Android 10 Settings应用如何去掉一级菜单定时开关机
- 无线打印服务器评测,打印服务器试用体验
- 论企业大数据的落地路径
- D3D12渲染技术之混合
热门文章
- 自动化测试基础篇--Selenium框架设计(POM)
- python-列表生成器
- c/c++基础 输入函数/流
- Could not find com.afollestad:material-dialogs:0.7.3.1解决
- 体绘制(Volume Rendering)概述介绍
- (FortiGate)飞塔防火墙防病毒解决方案
- Sharepoint the file is locked for use domain\user edit.文件被锁定,解锁方式
- nginx之upsream实现负载均衡
- ViewStub must have a valid layoutResource
- iOS-获取当前时间的年、月、日、时、分、秒