python 有参装饰器与迭代器

1、有参装饰器

模板:

def auth(x):
def deco(func):
def timmer(*args,**kwargs ):
res = func(*args,**kwargs )
return timmer
return deco

例子:
import time
current_user={'user':None}
def auth(engine='file'):
def deco(func):
def wrapper(*args,**kwargs):
if current_user ['user']: #已经登录过
res = func(*args,**kwargs )
return res

user = input('输入用户名<<')
pad = input('输入密码<<')
if engine =='file':
if user == 'qqc'and pad == '123':
print('login success')
current_user ['user']= user #记录用户登录的状态
res = func(*args,**kwargs)
return res
else :
print('用户名或密码错误')
elif engine == 'myspl':
print('基于mysql的认证')
elif engine == 'ldap':
print('基于ldap的认证')
else :
print('无法识别')
return wrapper
return deco
@auth(engine='file')
def index():
print('welcom to index')
time.sleep(3)
return 123
@auth(engine='file')
def home(name):
print('come on %s'%(name))
time.sleep(2)

index()
home('qqc')

 

2、迭代器

(1)什么是迭代器?

迭代器即迭代取值的工具;迭代是一个重复的过程,每一次重复都是基于上一次的结果而来的

例子:

def x(list):
count= 0
while count<len(list):
print(list[count])
count+= 1
b = [1,2,2,3]
x(b)

(2)、为什么要有迭代器
基于索引的迭代取值方式值适用于列表、元组、字符串类型
而没有索引的字典,集合,文件,则不在适用;所以必须找到一种通用的并且不依赖于索引的迭代器
取值方式》》迭代器
迭代器适用于可迭代的类型

(3)如何用迭代器
1、可迭代对象:在python中但凡内置有_iter_方法的对象都是可迭代的对象
(字符串。列表,元组。字典,集合,文件都是可迭代对象)
2、迭代器对象:指的是即内置有_iter_方法,有内置有_next_方法的对象
执行可迭代对象的_iter_方法得到的就是内置迭代器对象
(文件对象本身就是迭代器对象)
强调:迭代器对象一定是可迭代对象,反之不然
info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'}
a =info.__iter__() #可迭代对象
print(a)
a1=a.__iter__() #迭代器对象
print(a1)

a2 = a1.__next__() #迭代器对象加_next_方法取值
print(a2)
a3 = a1.__next__()
print(a3)
#一旦迭代器取值取干净,再继续取就会抛出StopIteration
 

(4)for循环:迭代器循环

# info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'}
#in后跟的一定要是可迭代的对象
# for k in info: # info_iter=info.__iter__()
# print(k)

# f=open('a.txt','r')
# for k in f:
# print(k)

(5)迭代器对象:指的是即内置有_iter_方法,有内置有_next_方法的对象
执行迭代器对象的next得到的是迭代器的下一个值
执行迭代器对象的iter方法得到的仍然是迭代器本身


(6)迭代器优点:
提供了一种通用的,可以不依赖于索引的迭代取值方式
迭代器对象更加节省内存
f= open('qqx.txt','r',encoding='utf-8')
print(f.__next__() )
print(f.__next__() ) #依次读取每一行文件

s = 'holle'
s1=iter(s) #可迭代对象
s2 = next(s1) #迭代器对象,取值
print(s2)

缺点:
迭代器的取值不如按照索引的方式更灵活,它只能让往后取,不能往前退
无法预测迭代器值的个数
names=['egon','alex_SB','wxx_SB']
iter_names= iter(names)
print(next(iter_names ))
print(next(iter_names ))
 
 

猜你喜欢

转载自www.cnblogs.com/quqinchao/p/9174537.html