• 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 ))
     
    
    
    
  • 相关阅读:
    第二周例行报告
    洛谷 P3384 【模板】轻重链剖分
    洛谷 P3380 【模板】二逼平衡树(树套树)
    洛谷 P4568 [JLOI2011]飞行路线
    2018 ICPC Asia Nanjing Regional Preliminary L. Magical Girl Haze
    牛客 2020 牛客国庆集训派对 day8 G. Shuffle Cards
    洛谷 P3224 [HNOI2012]永无乡
    洛谷 P1486 [NOI2004]郁闷的出纳员
    洛谷 P3391 【模板】文艺平衡树
    洛谷 P3369 【模板】普通平衡树
  • 原文地址:https://www.cnblogs.com/quqinchao/p/9174537.html
Copyright © 2020-2023  润新知