草庐IT

Python装饰器与迭代器的学习教程

python学习者0 2023-03-28 原文

1.装饰器

1什么是装饰器

装饰器就是装饰别人的工具,具体是指为被装饰者添加新功能,为一个新函数添加新功能

2为何要用装饰器 (开放封闭原则)

为了不修改被装饰者的源代码以及调用方式的前提下,为被装饰着添加新功能

3如何实现装饰器

通过这个模板来实现具体看实际情景添加一些代码

def outter(func):
def wrapper(*args,**kwargs):
    res=func(*args,**kwargs)
    return res
return wrapper

2.装饰器语法糖

就是在被装饰函数头放一个@outter装饰者函数名字 等同于把outter返回值为wrapper内存地址 wrapper内存地址给index从新赋值

def outter(func):                      #最原始的index的内存地址
    def wrapper(*args,**kwargs):       #形参 *与**原封不动给func 
        res=func(*args,**kwargs)       #获取返回值为func的return 有就返回,没有就返回None
        return res                     #返回值为func的return 有就返回,没有就返回None
    return wrapper                     #返回wrapper的内存地址

@outter       等同于     index=outter(index)   wrapper内存地址赋值给index            **这就是语法糖**
def index (x,y):               
    print('我是index',x,y) 
    return 123           #返回值1 2 3

print(index(1,2))         #调用index实际是调用wrapper(形参)	

3.装饰器模板

def outter(func):          
    def wrapper(*args,**kwargs):       #形参 *与**原封不动给func 
        res=func(*args,**kwargs)       #获取返回值为func的return 有就返回,没有就返回None
        return res                     #返回值为func的return 有就返回,没有就返回None
    return wrapper                     #返回wrapper的内存地址

#@outter      # 等同于     index=outter(index)   wrapper内存地址赋值给index,index内存地址被重新赋值
def index (x,y):               
    print('我是index',x,y) 
    return 123           #返回值1 2 3
print(index)             #<function outter.<locals>.wrapper at 0x000001AD182EA790>         相当于调用wrapper
print(index(1,2))         #调用index实际是调用wrapper(形参)

这个装的更像

上面的help方法获取的还是wrapper

内存地址还是wrapper

这个全部都是index

from functools import wraps
def outter(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        res = func(*args, **kwargs)
        stop = time.time()
        print(stop - start)
        return res
    return wrapper


@outter  # index = outter(index)
def index(x, y, z):
    """index函数的文档注释"""
    print('welcome to index page', x, y)
    time.sleep(3)
    return 123


res = index(111, 222, 333)
print(res)                           #index里面的输出语句  welcome too.....
print(index)					   #输出index的内存地址  @wraps模仿的  把index 内存地址都换过来了
help(index)                          #输出index的注释文档信息  @wraps模仿的  把index注释都换过来了

4.迭代器

1 什么是迭代器

迭代器指的是迭代取值的工具

什么是迭代???

  • 迭代是一个重复的过程,但是每一次重复都是基于上一次结果而继续的
  • 比如 一个项目 第一个人做了一半 第二个人接着第一个人继续做,

2 为何要用迭代器

为了找到一种统一迭代取值方案(适用于str、list、tuple、dict、set,文件对象)

节省内存

3 如何用迭代器

可迭代的对象iterable:

  • 内置有__iter__方法的对象(str、list、tuple、dict、set,文件对象) 除了int float 都可以迭代
  • __iter__方法的就是可迭代对象
  • _next_方法的就是迭代器对象

迭代器对象一定是 可迭代的
可迭代对象不一定是迭代对象

迭代器对象iterator:

  • 内置有__iter__方法
  • 内置有__next__方法

4.总结for循环好用 for循环就是迭代器

例子

dic = {'k1': 1111, 'k2': 2222, 'k3': 3333,'k4':4444,'k5':5555}

iter_dic = iter(dic)      #dic通过tier转换一下,成迭代器对象
iter_dic.__next__()       #有next方法
print(iter_dic.__iter__().__iter__().__iter__() is iter_dic)        已经是迭代器对象,在调iter也没用还是之前的对象

while True:
    try:                      #捕捉异常
        print(next(iter_dic))   #next循环下一个
    except StopIteration:
        break

for x in dic:                      #总结 for循环好用 for循环就是迭代器循环
    print(x)

例:

dic = {'k1': 1111, 'k2': 2222, 'k3': 3333,'k4':4444,'k5':5555}
	
 iter_dic = iter(dic)       #迭代器取完就没了 从新获取
 for k in iter_dic: #如果是dic第一次可以取到dic自动调iter方法变成迭代器对象超级赛亚人    #调迭代器对象的iter还是本身   第一次可以取到
     print(k)
 print('='*50)
 # iter_dic = iter(dic)    #如果打开这个 就是从新赋值  迭代器可以取到东西
 for k in iter_dic:  #如果再次dic调取iter方法还会变成迭代器对象,超级赛亚人所以还可以取出来        #调迭代器对象的iter还是本身第二次取不到值
     print(k)
    --------------------------------------------------------------------------------------------------------------
    with open('a.txt',mode='rt',encoding='utf-8') as f:
    for line in f:          #f本身就是迭代器对象 调iter方法变身失败还是本身 ,然后循环赋值给line
        print(line)			#输出line
    print('='*50)        
    for line in f:         #再用f.iter还是迭代器对象本身,变身失败还是本身
        print(line)

5.自定义迭代器 生成器对象

# yield可以返回多次值
def func():
    print('hello1')
    print('hello1')
    print('hello1')
    yield 111
    print('hello2')
    print('hello2')
    print('hello2')
    yield 222
    print('hello3')
    print('hello3')
    print('hello3')
    print('hello3')
    yield 333
    print('hello4')
    print('hello4')
    print('hello4')
    print('hello4')
#函数内但凡出现yield语法,我们再调用函数就不会立即触发函数体代码运行,会返回一个生成器对象,生成器对象就是一种自定义的迭代器
res=func()      #返回一个生成器对象
print(next(res))  #返回yield值

有关Python装饰器与迭代器的学习教程的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 为什么 Ruby 的 each 迭代器先执行? - 2

    我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试

  3. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  6. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  7. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  8. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  9. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  10. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

随机推荐