装饰器,迭代器,生成器

一、装饰器

无参装饰器:

 1、示例1

 1 import time  #加载时间模块
 2 def war(name):  #定义装饰器
 3     def wari():  
 4         start = time.time()  #定义开始时间
 5         name()    #相当于执行下面的函数
 6         stop = time.time()    #定义结束时间
 7         print("run time is %s" %(stop-start))  #给原来函数加入的新功能
 8     return wari
 9 @war
10 def info():
11     time.sleep(3)
12     print('we are famly!!')
13 
14 info()

执行@war的时候就表示运行了war(name)这个函数,然后把下面的函数名赋值给name,就表示info=war(info),现在取到的只是info这个函数的内存地址,在装饰器上运行name()就相当于执行这个info()函数

示例2

 1 def war(name):
 2     def wari(*args,**kwargs):
 3         start = time.time()
 4         name(*args,**kwargs)
 5         stop = time.time()
 6         print("run time is %s" %(stop-start))
 7     return wari
 8 @war
 9 def info():
10     time.sleep(3)
11     print('we are famly!!')
12 
13 @war
14 def auth(name,password):
15     time.sleep(2)
16     print('login success!')
17 
18 @war
19 def ero(x):
20     time.sleep(1)
21     print('hello %s' %x)
22     
23 info()
24 
25 auth('xyy',123)
26 ero('xyp')

有参装饰器:

示例1

 1 def auth1(auth_type):
 2         def auth(func):
 3              def war(*args,**kwargs):
 4                  if auth_type == 'file':
 5                     name = input("username: ")
 6                     pwd =  int(input("password: "))
 7                     if name  == "xyy" and pwd == 123:
 8                         print("login successfull!")
 9                         func(*args,**kwargs)
10                     else:
11                         print("login error!")
12                 elif auth_type == 'sql':
13                     print('输入错误')
14            return war 
15        return auth
16 
17 
18 @auth1(auth_type='sql') #write=auth(write)
19 def write():
20 print('welcome to my home!')
21 write()

 

二、迭代器
1、例子1:有下标的类型

 1 l = ['a','b','c','d','e'] #定义一个列表
 2 i = l.__iter__() #生成一个迭代器
 3 
 4 while True: #循环这个生成器
 5   try: #监听
 6     print(i.__next__()) #循环取下一个值
 7 except StopIteration: #监听的关键字
 8   break    #退出循环
 9 
10 或:
11 i = 0
12 while i < len(l):
13   print(l[i])
14   i += 1
15 
16 或:
17 for i in l: #直接循环遍历一遍
18   print(i)
19 
20 或:
21 for i in range(len(l)): #先取下标的的长度再取对应的值
22   print(l[i])    
23 PS:try和except相当于一个if判断

例子2:没下标的类型

1 dic = {'a':1,'b':2,'c':3}
2 i = dic.__iter__()
3 while True:
4   try:
5     print(i.__next__())
6 except StopIteration:
7   break

例子3:文件类型

1 with open('war.txt','r+',encoding='utf8') as f:
2 a = f.__iter__()
3 while True:
4   try:
5     print(a.__next__(),end='')
6 except StopIteration:
7   break

 

2、判断是否是可迭代和是否是迭代器:

 1 from collections import Iterable,Iterator #加载模块
 2 s = "xyyp"
 3 l = ['a','b','c']
 4 t = (1,2,3,4)
 5 d = {"s":1,"a":4}
 6 f = open('war.txt')
 7 (1)Iterable判断是否可迭代:
 8 print(isinstance(s,Iterable)) -->True
 9 print(isinstance(l,Iterable)) -->True
10 print(isinstance(t,Iterable)) -->True
11 print(isinstance(d,Iterable)) -->True
12 print(isinstance(f,Iterable)) -->True
13 (2)Iterator判断是否是迭代器:
14 print(isinstance(s,Iterator)) -->False
15 print(isinstance(l,Iterator)) -->False print(isinstance(t,Iterator)) -->False 
16 print(isinstance(d,Iterator)) -->False 
17 print(isinstance(f,Iterator)) -->True

PS:只有文件是可迭代对象并且是迭代器。

小结:
迭代器优点:
1,迭代器提供了一种不依赖于索引的取值方式,这样可以遍历那些没有索引的可迭代对象,比如:字典,集合,文件。
2,迭代器于列表比较,迭代器是惰性计算的,更节省内存空间。

迭代器缺点:
1,无法获取迭代器的长度,使用不如列表索引取值灵活。
2,一次性,只能往后取值,不能倒着取值

 

三、生成器和协程函数

1、生成器就是一个函数,这个函数内包含有yield这个关键字。

2、生成器和和return的区别在于return只能返回一次函数的值就结束了,yield能返回多次值。

3、yield把函数变成了生成器,生成器也就是迭代器。

示例1:

 1 def count(x): #定义函数
 2   print('start count')
 3   while x > 0: #函数内容
 4   yield x    #返回值
 5   x -= 1
 6 print('done')
 7 
 8 g = count(5) #执行函数 并把返回值赋给一个变量,最后生成迭代器
 9 while True:    #while循环迭代器
10   try:
11     print(next(g))
12 except StopIteration:
13   break

4、协程函数:
示例1:

 1 def eater(name): #定义函数
 2   print('%s waiting food' %name)
 3   food_list=[] #定义空列表
 4   while True:
 5     food = yield food_list #yield返回值赋值给food
 6     print('%s get %s,to start eat' %(name,food))
 7     food_list.append(food) #每传入一个值添加到列表里面去
 8 
 9 e = eater('钢蛋') #生成迭代器
10 print(next(e)) #输出迭代器内容
11 print(e.send('包子')) #send传入的值可以直接赋给yield
12 print(e.send('大葱包子'))
13 print(e.send('大蒜包子'))
14 print(e.send('韭菜包子'))

小结:
send和next()的区别:
1、如果函数内yield是表达式形式(food=yield),那么必须先next触发函数的执行。
2、二者的共同之处都可以让函数在上一次暂停的位置继续运行,不同之处在于send在触发下一次代码的执行时,会顺便给yield传一个值。

 

四、面向过程函数编程:
示例:

 1 import os #加载os模块
 2 def decorate(func): #定义next装饰器
 3   def t_layer(*args,**kwargs):
 4     res = func(*args,**kwargs)
 5     next(res)
 6     return res
 7   return t_layer
 8 
 9 @decorate #调用装饰器
10 def path(target): #定义文件路径生成器
11   while True:
12     dir_name = yield
13     g = os.walk(dir_name)
14     for i in g:
15       for x in i[-1]:
16         file_path = "%s\\%s" %(i[0],x)
17         target.send(file_path)
18 
19 @decorate
20 def opener(target): #定义读取文件内容的生成器
21   while True:
22     file_path = yield
23     with open(file_path) as f:
24       target.send((file_path,f))
25 
26 @decorate
27 def cat(target):    #定义看文件内容的生成器
28   while True:
29     file_path,f = yield
30     for line in f:
31     target.send((file_path,line))
32 
33 @decorate
34 def grep(pattern,target): #定义一个过滤文件内容的生成器
35   while True:
36     file_path,line = yield
37     if pattern in line:
38     target.send(file_path)
39 
40 @decorate
41 def printer():    #定义输出指定文件路径的生成器
42   while True:
43     file_path =yield
44     print(file_path)
45 
46 g = path(opener(cat(grep('xlinux',printer())))) #调用生成器
47 g.send('D:\\xyyp')

优点:
  1、体系结构更加清晰。
  2、简化程序的复杂度。
缺点:
  1、可扩展极其的差,所以面向过程的应用场景是:不需要经常变化的软件。

 

转载于:https://www.cnblogs.com/xyp-blog123/p/7028892.html

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

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

相关文章

计算机控制中mcu,MCU学习1:单片机控制应用很广,它在智能控制中起什么作用?...

编撰&#xff1a;Aigo 艾国单片机是一种集成在电路芯片&#xff0c;采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等…

模板设计模式

概念&#xff1a; 固定的流程已经写好了&#xff0c;变化的流程定义成了抽象方法&#xff0c;被子类重写。 模板设计就是一种编码风格&#xff0c;把抽象类看作是一个模板&#xff0c;模板中不能决定的东西定义成抽象方法&#xff0c;让使用模板的去重写抽象方法实现需求 简单来…

与计算机病毒相关的小故事,我和计算机病毒的故事2000字论文

好文网为大家准备了关于我和计算机病毒的故事2000字论文的文章,好文网里面收集了五十多篇关于好我和计算机病毒的故事2000字论文好文,希望可以帮助大家。更多关于我和计算机病毒的故事2000字论文内容请关注好文网。ctrlD请收藏好文网为大家准备了关于我和书的故事200字范文,好文…

python的递归算法学习(1)

递归函数在函数内部&#xff0c;可以调用其他函数。如果一个函数在内部调用自身本身&#xff0c;这个函数就是递归函数。举个例子&#xff0c;我们来计算阶乘 n! 1 * 2 * 3 * ... * n&#xff0c;用函数 fact(n)表示&#xff0c;可以看出&#xff1a;fact(n) n! 1 * 2 * 3 *…

什么是方法重写

方法重写&#xff1a; 概念&#xff1a; 子类中出现与父类一模一样的方法时&#xff08;返回值类型&#xff0c;方法名和参数列表都相同&#xff09;&#xff0c;会出现覆盖效果&#xff0c;也称为重写或者复写。声明不变&#xff0c;重新实现。 方法重写的应用场景&#xff1…

计算机数学基础 视频讲解,计算机数学基础课件

《计算机数学基础课件》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《计算机数学基础课件(37页珍藏版)》请在人人文库网上搜索。1、计算机科学的数学基础,第一章&#xff1a;语言与正规语言,1.1 符号、符号串及其运算,符号和符号串在形式语言中是非常重要的基本概念…

C#缓存absoluteExpiration、slidingExpiration两个参数的疑惑

看了很多资料终于搞明白cache中absoluteExpiration&#xff0c;slidingExpiration这两个参数的含义。absoluteExpiration&#xff1a;用于设置绝对过期时间&#xff0c;它表示只要时间一到就过期&#xff0c;所以类型为System.DateTime&#xff0c;当给这个参数设置了一个时间时…

测试显卡cpu中文软件,显卡信息检测工具(GPUinfo)

国内比较牛的显卡识别软件&#xff0c;是gpu-z等多不能比的&#xff0c;可以显示硬件信息BIOS版本驱动信息显存类型频率信息。相关软件软件大小版本说明下载地址Gpuinfo-国内比较牛的显卡识别软件&#xff0c;是gpu-z等多不能比的&#xff0c;可以显示硬件信息 BIOS版本 驱动信…

Java代码块的基本使用

概念&#xff1a; 在Java中&#xff0c;使用 { } 括起来的代码被称为代码块 局部代码块&#xff1a; 位置: 方法中定义 特点&#xff1a;执行完就会在内存中消失 作用: 限定变量的生命周期&#xff0c;及早释放&#xff0c;提高内存利用率 public static void main(String[] ar…

Python 简易图形界面库easygui 对话框大全

easygui 安装 C:\> pip install easygui Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting easygui Using cached https://pypi.tuna.tsinghua.edu.cn/packages/8e/a7/b276ff776533b423710a285c8168b52551cb2ab0855443131fdc7fd8c16f/easygui-…

计算机绘图模型的参数方程,关于曲线绘图与运动控制问题的研究.doc

文档介绍&#xff1a;关于曲线绘图与运动控制问题的研究姓名:张硕朱聪聪禹雪珂学号:201722060220172106102017210609专业:研究生组题目:关于曲线绘图与运动控制问题的研究摘要随着计算机的广泛应用,计算机辅助绘图在当今社会已成为计算机辅助设计的基础。本文的建模题目就是利用…

MathSystem

Math&#xff1a; 概述&#xff1a; Math 包含执行基本数字运算的方法 调用方式&#xff1a; Math类中无构造方法&#xff0c;但内部的方法都是静态的&#xff0c;可以通过 类名.进行调用 常用方法&#xff1a; 方法名 方法名说明public static int abs(int a)返回参数的绝对…

包的引入(base版本)

1 #author F2 3 import os4 import sys5 print(__file__) #相对路径6 print(os.path.abspath(__file__)) #绝对路径7 print(os.path.dirname(os.path.abspath(__file__)))8 print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))9 BASE_PATH os.path.dirname(o…

魔兽8.0玩家最多服务器,魔兽世界8.0一上线玩家就挤爆服务器!然而暴雪还藏2个大招在后面...

这两天&#xff0c;《魔兽世界》凭着新版本“争霸艾泽拉斯”出尽了风头&#xff0c;疯狂的玩家们甚至挤爆了游戏的服务器。而8.0版本的质量倒是对得起玩家的期待&#xff1a;除了劲爆的剧情之外&#xff0c;以海岛探险和战线争霸为首的一众玩法也都相当有创意,魔兽争霸高清重制…

ObjectObjects

Object 概念&#xff1a; Object 是类层次结构的根&#xff0c;每个类都可以将 Object 作为超类。所有类都直接或者间接的继承自该类&#xff0c;换句话说&#xff0c;该类所具备的方法&#xff0c;所有类都会有一份 toString&#xff1a; 作用&#xff1a;以良好的格式&#…

一个成功的研发团队应具备的9大属性

原文链接 1.自动化是关键研发过程中&#xff0c;很多工作步骤枯燥耗时&#xff0c;具有较强的重复性或规律性&#xff0c;研发人员往往考虑会将这部分内容用自动化代替&#xff0c;如此一来&#xff0c;团队就可以把更多时间投入在核心工作和更有创造性的任务上。例如&#xff…

cod16 服务器正在维护,使命召唤16玩不了怎么办 使命召唤16进不去解决方法

使命召唤16进不去怎么办&#xff1f;不少玩家朋友们在登入游戏界面的时候会出现各种弹窗或无法运行的情况&#xff0c;下面我们就来分享下使命召唤16玩不了解决方法汇总&#xff0c;希望对出现的游戏运行问题的玩家们有所参考。使命召唤16玩不了解决方法&#xff1a;DX发生错误…

服务器里怎么更改网站图片大小,php实现在服务器端调整图片大小的方法

本文实例讲述了php实现在服务器端调整图片大小的方法。分享给大家供大家参考。具体分析如下&#xff1a;在服务器端完成图片大小的调整&#xff0c;会比在浏览器的处理有很多的好处。本文介绍了PHP如何在服务器端调整图片大小。代码包括两部分&#xff1a;① imageResizer() is…

分布式架构系列目录

1、大数据系列|Flume的架构和环境安装 2、大数据系列|Sqoop概念和环境安装 3、大数据系列|Sqoop1的核心命令 4、大数据系列|Vmware虚拟机中安装centos7 5、大数据系列|Vmware下Linux的虚拟机增加磁盘空间 6、大数据系列|Hive架构和工作原理转载于:https://www.cnblogs.com/abc8…

css高清动图,CSS3+PNG实现GIF动画效果

昨天讲到了JavaScriptPNG模拟GIF动画&#xff0c;今天教大家用css3 PNG实现GIF动画效果。代码很简单主要用到了css3的animation属性&#xff0c;代码如下&#xff1a;-webkit-keyframes loading{0%{-webkit-transform: rotate(0deg);}50%{-webkit-transform: rotate(180deg);}…