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

基本概念

1.容器(container)

容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。通常这类数据结构把所有的元素存储在内存中(也有一些特例,并不是所有的元素都放在内存,比如迭代器和生成器对象)在Python中,常见的容器对象有:

list, deque, ….

set, frozensets, ….

dict, defaultdict, OrderedDict, Counter, ….

tuple, namedtuple, …

str

容器比较容易理解,因为你就可以把它看作是一个盒子、一栋房子、一个柜子,里面可以塞任何东西。从技术角度来说,当它可以用来询问某个元素是否包含在其中时,那么这个对象就可以认为是一个容器,比如 list,set,tuples都是容器对象.

2.可迭代对象(iterable)

凡是可以返回一个迭代器的对象都可称之为可迭代对象

3.迭代器(iterator)

那么什么迭代器呢?它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了__iter__和__next__()方法的对象都是迭代器,__iter__返回迭代器自身,__next__返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常,至于它们到底是如何实现的这并不重要。

生成器(generator)

一个包含了yield关键字的函数就是一个生成器,该函数也叫生成器函数。当生成器函数被调用时,在函数体中的代码不会被执行,而会返回一个迭代器。每次请求一个值,就会执行生成器中代码,直到遇到一个yield表达式或return语句。yield表达式表示要生成一个值,return语句表示要停止生成器。换句话说,生成器是由两部分组成,生成器的函数和生成器的迭代器。生成器的函数是用def语句定义的,包含yield部分;生成器的迭代器是这个函数返回的部分。二者合起来叫做生成器。

迭代器与生成器

1.迭代器使用举例:

city = ['beijing','shanghai','tinajin','chongqin']

it=iter(city)print(type(it))#方法一:使用next方法来使用迭代器

print(it.__next__())print(it.__next__())

方法二:使用for循环来使用迭代器for x init:print(x)

2 用生成器函数完成与counter类似功能

defgenerator(low,high):while low <=high:yieldlow

low+= 1

for i in generator(1,10):print(i,end='')

结果:12345678910

3. 生成器产生无限多的值

def generator(start =0):whileTrue:yieldstart

start+= 1

for number in generator(4):print(number,end='')if number > 20:break

4. 列表生成器

a = [i*2 for i in range(1,10)]print(a)

结果:

[2, 4, 6, 8, 10, 12, 14, 16, 18]

装饰器

要求:

不能修改被装饰的函数的源代码

不能修改被装饰的函数的调用方式

满足上面的两种情况下给程序增添功能

组成:

< 函数+实参高阶函数+返回值高阶函数+嵌套函数+语法糖 = 装饰器 >

1.简单装饰器

1 importtime2 deftimer(func):3 defwrapper():4 start_time =time.time()5 func()6 stop_time =time.time()7 print("run time %s"%(stop_time-start_time))8 returnwrapper9 @timer #语法糖 test=timer(test)

10 deftest():11 time.sleep(3)12 print("in the test")13 test()14

15 结果:16 inthe test17 run time 3.000171661376953。

1.test表示的是函数的内存地址

2.test()就是调用对在test这个地址的内容,即函数

高阶函数:

1.把一个函数名当作实参传给另外一个函数(“实参高阶函数”)

2.返回值中包含函数名(“返回值高阶函数”)

这里面所说的函数名,实际上就是函数的地址,把函数名当做实参,那么也就是说可以把函数传递到另一个函数,然后在另一个函数里面做一些操作。

嵌套函数:

嵌套函数指的是在函数内部定义一个函数,而不是调用

函数只能调用和它同级别以及上级的变量或函数。也就是说:里面的能调用和它缩进一样的和他外部的,而内部的是无法调用的。

把test作为参数传递给了timer(),此时,在timer()内部,func = test,接下来,定义了一个wrapper()函数,但并未调用,只是在内存中保存了,并且

标签为wrapper。在timer()函数的最后返回wrapper()的地址wrapper。然后再把wrapper赋值给了test,那么此时test已经不是原来的test了,也就是test原来的那些函数体的标签换掉了,换成了wrapper

2.装饰有参函数

importtimedeftimer(func):def deco(*args,**kwargs):

start_time=time.time()

func(*args,**kwargs)

stop_time=time.time()print(stop_time-start_time)returndeco

@timerdeftest(parameter):

time.sleep(3)print("test is running")

test("添加参数")

3.更复杂的装饰器

对这两个函数分别统计运行时间,再加一层函数来接受参数,根据嵌套函数的概念,要想执行内函数,就要先执行外函数,才能调用到内函数

importtimedeftimer(parameter):defouter_wrapper(func):def wrapper(*args, **kwargs):if parameter == 'task1':

start=time.time()

func(*args, **kwargs)

stop=time.time()print("the task1 run time is :", stop -start)elif parameter == 'task2':

start=time.time()

func(*args, **kwargs)

stop=time.time()print("the task2 run time is :", stop -start)returnwrapperreturnouter_wrapper

@timer(parameter='task1')deftask1():

time.sleep(2)print("in the task1")

@timer(parameter='task2')deftask2():

time.sleep(2)print("in the task2")

task1()

task2()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java开源对象池_JAVA 对象池

GenericObjectPool利用一个org.apache.commons.collections.CursorableLinkedList对象来保存对象池里的对象。这种对象池的特色是&#xff1a;可以设定最多能从池中借出多少个对象。可以设定池中最多能保存多少个对象。可以设定在池中已无对象可借的情况下&#xff0c;调用它的…

新一代人工智能专利分析

来源&#xff1a;三思派人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;自诞生以来&#xff0c;已经过约60年的发展。2006年深度学习算法的重大突破带来了人工智能的第三次爆发。同时也引发专利申请的激增&#xff0c;2006年至2016年&#xff0c;十年的…

MYSQL性能优化详解(二)

接着上一篇学习&#xff1a;http://www.cnblogs.com/quanzhiguo/p/6401453.html 七、MySQL数据库Schema设计的性能优化 高效的模型设计 适度冗余-让Query尽两减少Join 大字段垂直分拆-summary表优化 大表水平分拆-基于类型的分拆优化 统计表-准实时优化 合适的数据类型 时间存储…

python if else用法同一行_在Python的同一行中使用if else for和del吗?-问答-阿里云开发者社区-阿里云...

我有一个列表&#xff0c;其项目是可变长度的列表。如果这些可变长度的列表项超过此长度&#xff0c;则需要将其截断为特定长度(x)。我做了这个小的功能。def truncateList(batch_, trim_len):truncated_list []for eachAbstract in train_abstracts_encoded:if len(eachAbstr…

java no resultset_jdbc - Java ResultSet如何检查是否有任何结果

jdbc - Java ResultSet如何检查是否有任何结果结果集没有hasNext的方法。 我想检查resultSet是否有任何值这是正确的方法if (!resultSet.next() ) {System.out.println("no data");}kal asked 2019-02-19T19:16:57Z21个解决方案472 votes假设您正在使用新返回的Resul…

图解谷歌大脑丶城市大脑丶全球脑与互联网大脑的关系

人类很早就朦胧的发现社会组织具有神经系统的特征。19世纪到20世纪&#xff0c;一些前瞻的哲学家们开始不断将科技与脑进行了关联,提出了"器官映射","社会神经网络","全球脑"。 21世纪之后,更多科技大脑概念不断涌现,从互联网大脑到城市大脑,从谷…

Ubuntu 安装调整工具移动 Launcher 启动器位置

问题&#xff1a;如何将 Ubuntu 16.04 屏幕左侧的 Launcher 启动器由屏幕底部移动到屏幕左侧。 Ubuntu 16.04 最新的 unity-tweak-tool 工具&#xff0c;已经为用户提供了通过图形界面&#xff0c;实现上述 Launcher 启动器位置移动的功能。 1、在终端中执行&#xff1a; sudo …

python求助神器_python三大神器

Python 中有很多优秀的包&#xff0c;本文主要讲一下 pip, virtualenv, fabric1. pip 用来包管理1 #安装&#xff0c;可指定版本号2 (sudo) pip install Django1.6.834 #升级5 (sudo) pip install bpython --upgrade67 #一次安装多个8 (sudo) pip install BeautifulSoup4 fabri…

滴滴自动驾驶CEO张博:十年内无人驾驶对消费者没有吸引力丨厚势汽车

来源&#xff1a;WAVE2019张博&#xff1a;在 2012 年滴滴创立的时候&#xff0c;我们是一个非常简单的想法。我们发现在打出租车的场景下&#xff0c;无论是司机还是乘客效率都非常低。在滴滴出现之前&#xff0c;一个乘客想要打出租车必须要下楼招一下手&#xff0c;这个信号…

garch预测 python_数据科学方面的Python库,实用!

作者&#xff1a;Python开发与大数据人工智能原文&#xff1a;公众号 Python开发与大数据人工智能Python是一种很棒的编程语言。事实上&#xff0c;它还是世界上发展最快的编程语言之一。它一次又一次证明了它在数据科学职位中的实用性。整个Python及其库的生态系统使其成为全世…

纯js实现html转pdf

项目开发中遇到了一个变态需求&#xff0c;需要把一整个页面导出为pdf格式&#xff0c;而且要保留页面上的所有的表格、svg图片和样式。 简而言之&#xff0c;就是希望像截图一样&#xff0c;把整个页面截下来&#xff0c;然后保存成pdf。 咋不上天呢…… 查了一下&#xff0c;…

java 判断是linux系统_java判断是window系统还是Linux系统,并获取其IP地址及文件上传 | 学步园...

这是upload类的方法&#xff1a;public class Upload {public static String upload(FormFile formfile,String dirPath,int port){String savePath"";String ip"";try{String filename formfile.getFileName().trim(); // 文件名if (!"".equal…

物联网中的推荐系统

来源&#xff1a;北京物联网智能技术应用协会作者 | Alexander Felfernig, Seda Polat Erdeniz编译 | CDA数据科学研究院Recommender systems in the Internet of Things1、背景介绍物联网是一种联网的基础架构&#xff0c;是物联网、互联网和语义学领域之间融合的结果&#xf…

pwm控制的基本原理_单片机PWM控制基本原理详解~

PWM是Pulse Width Modulation的缩写&#xff0c;它的中文名字是脉冲宽度调制&#xff0c;一种说法是它利用微处理器的数字输出来对模拟电路进行控制的一种有效的技术&#xff0c;其实就是使用数字信号达到一个模拟信号的效果。这是个什么概念呢&#xff1f;我们一步步来介绍。首…

关上Deepfake的潘多拉魔盒,RealAI推出深度伪造视频检测工具

诞生之初&#xff0c;Deepfake是一项有趣的图像处理技术&#xff0c;仅仅带来搞笑和娱乐视频&#xff0c;但殊不知&#xff0c;潘多拉魔盒就此被打开&#xff0c;催生出色情黑产、恶搞政客“操纵”民意&#xff0c;Deepfake正逐步进化为一种新型“病毒”&#xff0c;人类伦理道…

java 解析 csv_在Java中将数据从CSV解析到数组

我正在尝试将CS​​V文件导入到可以在Java程序中使用的数组中. CSV文件已成功导入自身,输出显示在终端上,但它会引发错误&#xff1a;Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1at CompareCSV.main(CompareCSV.java:19)在末尾.另外,当…

python画国际象棋_python图形工具turtle绘制国际象棋棋盘

本文实例为大家分享了python图形工具turtle绘制国际象棋棋盘的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下#编写程序绘制一个国际象棋的棋盘import turtleturtle.speed(30)turtle.penup()off Truefor y in range(-40, 30 1, 10):for x in range(-40, 30 1, 10)…

谷歌地图的全球森林监察系统,揭秘中国雾霾的惊天秘密!

来源&#xff1a;老牛时评谷歌公司最近推出的全新交互式地图——“全球森林监察”它可以实时显示全球森林的覆盖情况。该幅地图的数据来源有多个&#xff0c;其中包括了NASA的森林面积覆盖率的分析数据。于是我们选取了中国及中国周边的部分&#xff0c;看完后的感受只能是比悲…

dbref java_查询mongodb dbref内部字段

我需要隐藏其isActive标志设置为false的所有用户相关数据 . 有许多集合我使用了DBRef类型的用户集合(大约14个集合)&#xff0c;每个集合包含超过1000万条记录 .让我借助例子更恰当地解释一下 .假设我有两个集合&#xff1a;用户联系用户集包含以下字段&#xff1a;名字(字符串…

qt显示rgba8888 如何改 frame_Qt开源作品17-IP地址输入控件

一、前言这个IP地址输入框控件&#xff0c;估计写烂了&#xff0c;网上随便一搜索&#xff0c;保证一大堆&#xff0c;估计也是因为这个控件太容易了&#xff0c;非常适合新手练手&#xff0c;一般的思路都是用4个qlineedit控件拼起来&#xff0c;然后每个输入框设置正则表达式…