博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python之有参装饰器和迭代器用法
阅读量:4660 次
发布时间:2019-06-09

本文共 3818 字,大约阅读时间需要 12 分钟。

 

1.有参装饰器:是无参装饰器的加强版

                    在无参装饰器上面再包个函数(相当于多增加一个值)    

                    无参装饰器函例图:

 

                    

def check(func):       # index()运行的先运行@check=check(index)把index内存地址赋值给func 得到check_user内存地址返回值并赋值新的index变量名    def check_user(*args, **kwargs):        while True:            user_info = input("请输入用户名:").strip()            pwd_info = input('请输入密码:').strip()            if user_info == name and pwd_info == pwd:                print("loging successfull")            else:                print('用户名和密码错误')                continue            res = func(*args, **kwargs)            return res    return check_user@checkdef index():      # 运行@check(index) func内存地址=index赋值 返回check_user内存地址 在重新赋值一个新的index=check_info实际上内存地址已经更换了                   # 最后直接调用index()指向的是check_info()的内存地址    print('welcome to index')    time.sleep(2)    return 123

 

import timecurrent_user={'user':None}def deco(func):    def wrapper(*args,**kwargs):        if current_user['user']:            #已经登陆过            res = func(*args, **kwargs)            return res        user=input('username>>: ').strip()        pwd=input('password>>: ').strip()        if user == 'egon' and pwd == '123':            print('login successful')            # 记录用户登陆状态            current_user['user']=user            res=func(*args,**kwargs)            return res        else:            print('user or password error')    return wrapper@decodef index():    print('welcome to index page')    time.sleep(1)@decodef home(name):    print('welecome %s to home page' %name)    time.sleep(0.5)index()home('egon')'''

 

  有参可以增加认证来源的判断,根据传入的参数进行多种分类比如如下多种登录认证

 

            

import timecurrent_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('username>>: ').strip()            pwd=input('password>>: ').strip()            if engine == 'file':                # 基于文件的认证                if user == 'egon' and pwd == '123':                    print('login successful')                    # 记录用户登陆状态                    current_user['user']=user                    res=func(*args,**kwargs)                    return res                else:                    print('user or password error')            elif engine == 'mysql':                print('基于mysql的认证')            elif engine == 'ldap':                print('基于ldap的认证')            else:                print('无法识别认证来源')        return wrapper    return deco@auth(engine='mysql') # @deco #index=deco(index) #index=wrapperdef index():    print('welcome to index page')    time.sleep(1)@auth(engine='mysql')def home(name):    print('welecome %s to home page' %name)    time.sleep(0.5)index()

 

 

 

2.什么是迭代器

    1.迭代器即迭代取值的工具

    2.迭代就是一个重复的过程,每一次都要重复是基于上次的结果而来

    单纯的重复并不是迭代

    迭代:

    l=['a','b','c']

    def iterator(item):

        i=0

        while i <len(itme):

                print(l[i])

                i+=1            

2.为什么要有迭代器

    基于索引的迭代器取值方式只适用于列表、元组、字符串

    对于没有索引的字典、集合、文件、则不适合

    所以必须找到一种通用的并且不依赖索引的迭代器取值方式=》迭代器 

    迭代器适用于可迭代的类型

3.如何用迭代器

   s='hello'

def iterator(item):

        i=0

        while i <len(item):

                print (item[i])

                i+=1

iterator(s)

 

    可迭代对象:在python中但凡内置有—iter—方法的对象都是可迭代对象

                            (字符串,列表,元组,字典,集合,文件都是可迭代的对象)

                                迭代器对象=可迭代的对象——iter——()

      迭代器对象:即内置有——iter——方法,有内置有—next——方法的对象

                            迭代器对象本身=迭代器对象——iter——()

                            拿到的是下一个值=迭代器对象——next——()

                        ##执行可迭代对象的——iter——方法得到的就是内置的迭代器对象

                         ###文件对象本身就是迭代器对象

                    强调:

                        迭代器对象一定是可迭代的对象,反之则不让

                        一旦迭代器取取值干净,在继续取就会抛出stopiteration

                        迭代器对象:指的是既内置有——iter——方法,又内置有——next——方法的对象

                                           执行迭代器对象的——next——得到的是迭代器下一个值

                                           执行迭代器对象的——iter——得到的仍然是迭代器本身

                        实例:

                            

for循环:迭代器循环

    info={‘name’:'egon','agon':18}

 #in后面跟的一定要是可迭代的对象

    for k in info:    #info_iter=info._iter_()   for循环底层原理就是用迭代器方式定义 (检测运行完毕后自动结束)

            print(k)       

 

 

while循环需要定义一个检测机制,运行完毕后才不会报错           

总结迭代器对象的优缺点:

    指的是既内置有——iter方法:

        优点:提供一种通用的、可以不依赖索引的迭代取值方式

          2.迭代器对象更加节省内存     (比如读取大文件时候,读一行就取一行)

            

        缺点:

            1.迭代器的取值不按照索引的方式更灵活,因为他只能往后不能往前退

            2.无法预测迭代器值的个数

            比如:

 

转载于:https://www.cnblogs.com/Marcki/p/10111965.html

你可能感兴趣的文章
python之路_rest-framework之版本、解析器、序列化
查看>>
美工没时间给图,简单的图让我们自己写,哭啊! 所以具体研究了一下shape的使用,保存下...
查看>>
js 事件监听,执行某操作
查看>>
最小生成树问题------------Prim算法(TjuOj_1924_Jungle Roads)
查看>>
细说REST API安全之防止重放攻击
查看>>
Spring Shell入门介绍
查看>>
query多选下拉框插件 jquery-multiselect(修改)
查看>>
js图片放大
查看>>
0617 python 基础04
查看>>
0622 python 基础05
查看>>
Diophantus of Alexandria
查看>>
UVA 11292-Dragon of Loowater (贪心)
查看>>
GZS与小公园(DFS)
查看>>
背包问题
查看>>
外观模式的介绍以及与适配器模式和装饰者模式的区别
查看>>
maven教材
查看>>
js使用s:property标签接收json格式数据
查看>>
luogu11月月赛T3咕咕咕(组合数学)
查看>>
oracle linux 6.5 安装 oracle 12cR2数据库(2)-DBCA建库
查看>>
Codeforces Round #501 (Div. 3)(ABCDE)
查看>>