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

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装饰器与迭代器的学习教程 - Python技术站

(0)
上一篇 2023年4月2日 下午4:17
下一篇 2023年4月2日 下午4:18

相关文章

  • Python中的交互库-os库

    一.介绍 os库是与操作系统相关的库,它提供了通用的基本的操作系统交互功能。os库是Python的标准库之一,它里面包含几百个处理函数,能够处理与操作系统相关的功能,包括路径操作、进程管理、环境参数设置等几类功能。其中路径操作是利用os.path子库,它用于处理文件以及目录的路径,并获得相关的信息;进程管理指启动系统中的其它程序的功能;环境参数指获得系统软硬…

    python 2023年5月10日
    00
  • Python推导式创建数列的方法

    一、列表推导式 列表推导式生成列表对象,语法如下: ”’ [表达式 for item in 可迭代对象] 或者 [表达式 for item in 可迭代对象 if 条件判断] ”’ 例子 l1 = [x for x in range(5)] print(l1) # [0, 1, 2, 3, 4] l2 = [x*2 for x in range(1,5)…

    Python开发 2023年4月2日
    00
  • Python3教程:多线程的使用教程

    一、简介 Python中使用线程有两种方式:函数或者用类来包装线程对象。 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程。语法如下: 参数说明: function – 线程函数。 args – 传递给线程函数的参数,他必须是个tuple类型。 kwargs – 可选参数。 实例: import _thread im…

    Python开发 2023年4月2日
    00
  • Python数据类型间的相互转化及字符编码

    字符间的相互转化: 数字与字符串之间的相互转化 1、数字(整数与浮点数) –> 字符串 :只需要在要转化的数字前加str进行转换就可以 num = 10.5 str_num = str(num) print(str_num) 2、字符串转化为数字 –> 使用 int 或 float 方法进行转化 1 整数字符串转化为数字 (当字符串中只有数字…

    Python开发 2023年4月2日
    00
  • Python中 re.compile 函数的使用

    以下介绍在python的re模块中怎样应用正则表达式 1. 使用re.compile re模块中包含一个重要函数是compile(pattern [, flags]) ,该函数根据包含的正则表达式的字符串创建模式对象。 可以实现更有效率的匹配。在直接使用字符串表示的正则表达式进行search,match和findall操作时,python会将字符串转换为正则…

    Python开发 2023年3月31日
    00
  • python进程池中的回调函数

    什么是回调函数 指定一个任务后、并且指定一个回调函数后,当指定的进程池执行的任务结束后,会将该任务的返回值作为回调函数的参数传递到回调函数中,并且回调函数得以执行 回调函数在主进程中被执行 import os from multiprocessing import Pool def func1(n): print(‘in func1’, os.getpid(…

    python 2023年4月17日
    00
  • Python中切片操作的详细用法

    在利用Python解决各种实际问题的过程中,经常会遇到从某个对象中抽取部分值的情况,切片操作正是专门用于完成这一操作的有力武器。理论上而言,只要条件表达式得当,可以通过单次或多次切片操作实现任意切取目标值。切片操作的基本语法比较简单,但如果不彻底搞清楚内在逻辑,也极容易产生错误,而且这种错误有时隐蔽得比较深,难以察觉。 本文通过详细例子总结归纳了切片操作的各…

    Python开发 2023年4月2日
    00
  • Python教程:几个常用的内置函数

    匿名函数(lambda表达式) 在Python中,函数可以算的上是“一等公民”了,我们先回顾下函数的优点: 减少代码重复量 模块化代码 但是我们有没有想过,如果我们需要一个函数,比较简短,而且只需要使用一次(无需重复调用),那还需要定义一个有名字的函数么? 答案是否定的,这里我们就可以使用匿名函数来实现这样的功能。 我们先看看求一个数的平方,我们定义个函数怎…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部