python三层装饰器-python开发学习day16 (三层装饰器;迭代器)

2020-06-22                      目录:

一、嵌套三层的装饰器

二、迭代器

2.1 迭代器是什么

2.2 __iter__方法及其调用

2.3 可迭代的对象

2.4 迭代器对象

2.5 for循环的原理

2,6 总结迭代器

一、嵌套三层的装饰器

通过闭包的方式为函数体传参,可以包一层,也可以包两层

@后面跟的必须是一个函数的内存地址,@函数名(参数)的形式也是可以的,前提是 “@函数名(参数)”的返回值必须是一个函数的内存地址

示例:

defoutter2(mode): # mode在outter和wrapper后面传参都不行,只能再包一层函数传参defoutter(func):def wrapper(*args, **kwargs):

inp_name=input("please input your name:").strip()

inp_pwd=input("please input your password:").strip()if mode == "file":print('认证来源=====>file')

with open('user.db', mode='rt', encoding='utf-8') as f:for line inf:

name_db,pwd_db=line.strip(' ').split(':')if inp_name == name_db and inp_pwd ==pwd_db:print('login successful')

res= func(*args, **kwargs)returnreselse:print("账号或密码错误")elif mode == "ldap":print('认证来源=====>ldap')elif mode == "mysql":print('认证来源=====>mysql')else:print("未知的认证来源")returnwrapperreturnoutter

@outter2(mode="mysql") #index = outter(index) ==> index = wrapper

defindex(x, y):print('index===>', x, y)

index(1, 2) #wrapper(1,2)

二、迭代器

2.1 迭代器是什么

迭代是一个重复的过程,但并不是单纯的重复,它的每一次重复都是基于上一次的结果而来的

迭代器是一种迭代取值的工具,这种取值方式是通用的,不依赖于索引和key(如:集合和句柄,没有索引和key也可以迭代取值)

2.2 __iter__方法及其调用

python为str、list、tuple、dict、set、f文件对象 都内置了__iter__方法__iter__调用得到的返回值就是对应的迭代器l1= [1,2,3]

res= l1.__iter__() 就等同于 res =iter(l1)print(res) #>>>

a = res.__next__() #a=next(res) a=1

b = res.__next__() #b=next(res) b=2

c = res.__next__() #c=next(res) c=3

d = res.__next__() #StopIteration 报错,l1只有三个值

2.3 可迭代的对象

可迭代的对象:有__iter__内置方法的对象都是可迭代的对象,str、list、tuple、dict、set、文件对象

2.4 迭代器对象

可迭代对象.__iter__()得到的返回值就是迭代器对象

特点:

① 有__next__方法

② 有__iter__方法,调用得到的就是迭代器自身

f = open(r'user.db', mode='rt', encoding='utf-8')

line=f.__next__() # 读第一行

print(line)

line=f.__next__() # 读第二行

print(line)

f.close()

2.5 for循环的原理

for循环的本质就是迭代器的循环

d= {"k1": 111, "k2": 222, "k3": 3333}for k ind:print(k)

工作步骤:① 调用in后面对象的__iter__方法,得到对应的迭代器

② k=next(迭代器),然后执行一次循环

③ 循环往复,直到把迭代器的值取完,抛出异常,for循环会将自动捕捉异常,然后结束循环

2.6 总结迭代器

优点:① 不依赖索引,是通用的取值方式

② 节省内存,读取文件时,每次只读一行

缺点:① 不能取指定位置的值(没有索引和key)

② 不能预估值的个数,无法统计长度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
请问您想了解有关 Python 迭代器装饰器的面试题吗?我可以为您提供一些常见的问题和答案。以下是一些可能的问题: 1. 什么是迭代器(Iterator)?如何创建一个迭代器? 答:迭代器是一个对象,它可以在遍历过程中维护其内部状态。可以使用迭代器协议来创建一个迭代器,即实现 `__iter__()` 和 `__next__()` 方法。 2. 请解释迭代器协议中 `__iter__()` 和 `__next__()` 方法的作用。 答:`__iter__()` 方法返回迭代器对象自身,用于支持迭代,而 `__next__()` 方法返回序列中的下一个值,如果没有更多元素,则引发 `StopIteration` 异常。 3. 什么是可迭代对象(Iterable)?如何创建一个可迭代对象? 答:可迭代对象是一个实现了迭代器协议的对象。可以通过实现 `__iter__()` 方法并返回一个迭代器对象来创建可迭代对象。 4. 请解释装饰器(Decorator)的作用和原理。 答:装饰器是一种特殊的函数,它可以在不修改原函数代码的情况下,对函数进行功能增强或修改。装饰器本质上是一个闭包,它接受一个函数作为参数,并返回一个替代原函数的新函数。 5. 如何定义一个装饰器函数?请给出一个例子。 答:可以使用 `@decorator` 语法糖来定义装饰器。例如,下面的例子是一个简单的装饰器,用于在函数执行前后打印日志信息: ```python def logger(func): def wrapper(*args, **kwargs): print("Calling function:", func.__name__) result = func(*args, **kwargs) print("Function", func.__name__, "finished execution") return result return wrapper @logger def greet(name)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值