python学习笔记之有参装饰器,迭代器,生成器

时间:2021-6-9 作者:qvyue

note =”’

0.无参装饰器补充(如何伪装的一模一样?)python帮你写好了,直接用就行!

实例代码:from functools import wraps

def outter(func):

@wraps(func)

def wrapper(*args, **kwargs):

res = func(*args, **kwargs) # res=index(1,2)

return res

1.有参装饰器

1.1 什么是有参装饰器?

能够给wrapper传入除了func之外的参数

1.2 为什么要有有参装饰器?

因为在无参装饰器中,由于语法糖的缘故,外层函数只能接受一个参数func,而有时候wrapper有多个参数的需求

1.3 如何实现有参装饰器?1.3.1 完全类似于无参装饰器的第二层,再在外面套一层

语法糖变为:@最外层(第三层)函数(传入的参数1,传入的参数2,……)

执行时:先执行‘’最外层(第三层)函数(传入的参数1,传入的参数2,……)‘’,得到返回值,返回值为第二层函数的内存地址,语法糖变为:@第二层函数,之后就跟无参一样了1.4 装饰器最多三层就够了,因为第三层可以支持传入任意多的参数1.5 有参装饰器模板# 有参装饰器模板def 有参装饰器(x,y,z):

def outter(func):

def wrapper(*args, **kwargs):

res = func(*args, **kwargs)

return res

return wrapper

return outter

@有参装饰器(1,y=2,z=3)

def 被装饰对象():

pass

2.迭代器

2.1 什么是迭代器?

用来迭代取值的工具

2.2 有什么用

2.2.0 给无索引数据类型提供了一种遍历的方法

2.2.1 for循环的底层实现机制

2.2.2 后面可以自定义迭代器(生成器)

2.3 如何实现?

2.3.1

    什么是可迭代对象?含有__iter__方法的对象,包括字符串,列表,字典,集合,元组,文件    g = 可迭代对象.__iter__() –》g即为迭代器

2.3.2

    性质一:每对迭代器调用一次__next__(),即读取出迭代器里面的一个值

    性质二:迭代器就像一只老母鸡,下蛋的个数是有限的,当读完全部值,再调用__next__(),就会报错

    利用性质一,二及while循环,异常检测,即可自己实现for循环的效果(也即for循环的底层实现)

2.4 其他

可迭代对象.__iter__() 可以写为 iter(可迭代对象)

可迭代对象.__next__() 可以写为 next(可迭代对象)

3.生成器

3.1 什么是生成器?即自定义的迭代器

3.2 怎么实现生成器?

利用yield关键字,在函数中遇到return会结束函数,而遇到yield会将函数暂时挂起并返回yield的值

实例:def func():

yield 1

yield 2

yield 3

这样定义的就是一个生成器(可以理解为有yield的函数就是生成器)

直接func()是不会返回任何东西的,得用调用迭代器的方法才可以g = func()(这时候g就是一个生成器对象(也就是一个迭代器对象))print(g.__next__())即可执行yield前面的所有语句并返回yield的值,下一次再print(g.__next__())即执行上一次结束的yield到下一个yield的所有语句并返回下一个yield的值

4.今日项目

4.1日志装饰器(有参装饰器)requests =  编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定

注意:时间格式的获取import time

time.strftime(‘%Y-%m-%d %X’)

import time

def outter(file_path):

def deco(func):

def wrapper(*args,**kwargs):

with open(file_path,’a’) as f:

                a = ‘n’+time.strftime(‘%Y-%m-%d %X’)+f’ {func}’+’ run’

f.write(a)

res = func(*args,**kwargs)

return res

return wrapper

return deco

@outter(‘b.txt’)

def f1():

    print(‘f1执行’)

f1()

4.2 生成器实现range功能requests = 自定义迭代器实现range功能def my_range(start,stop,step):

while start

yield start

start += step

g = my_range(0,10000,1000)

while True:

try:

        print(g.__next__())

    except StopIteration:

break

‘’‘

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。