• day13 有参装饰器/可迭代对象与迭代器对象/迭代器对象的总结


    装饰器语法糖的应用
    def auth(func):
        def wrapper(*args,**kwargs):
            username=input('请输入用户名').strip()
            pwd=input('请输入密码').strip()
            if username=='egon'and pwd=='123':
                print('登录成功')
                res=func(*args,**kwargs)
                return res
            else:
                print('用户名和密码错误')
        return wrapper
    
    @auth
    def index():
        time.sleep(3)
        print('延迟三秒')
        return 123
    
    index()
    

      

    #什么也不做的装饰器
    import time
    def deco(func):   
        def wrapper(*args,**kwargs):
            res=func(*args,**kwargs)
            return res
        return wrapper
    @deco
    def index():
        print('welcome to index page')
        time.sleep(3)
    
    @deco
    def home(name):
        print('welcomet %s to home page')
        time.sleep(2)
    
    index()
    home('egon')
    
    
    认证功能的装饰器
    import time
    current_usre={'user':None}
    def deco(func):   #什么也不做的装饰器
        def wrapper(*args,**kwargs):
            username=input('请输入用户名<<:').strip()
            pwd=input('请输入密码<<:').strip()
            if username=='egon' and pwd=='123':
                print('登录成功')
                current_usre['user']=username
                res = func(*args, **kwargs)
                return res
            else:
                print('登录失败')
        return wrapper
    @deco
    def index():
        print('welcome to index page')
        time.sleep(3)
    
    @deco
    def home(name):
        print('welcome %s to home page'%name)
        time.sleep(2)
    
    index()
    home('egon')
    

    有参装饰器  

    1.什么是迭代:迭代是一个重复的过程,并且每一次重复都是基于上一次结果来的

    迭代器 迭代的工具

    迭代:

    l=['a','b','c']
            def iterator(item):
                i=0
                while i < len(item):
                    print(l[i])
                    i+=1
    
     可迭代的对象:在python中但凡内置有__iter__方法的对象都是可迭代的对象
     字符串、列表、元组、字典、集合、文件都是可迭代的对象 (除了数字之外都是)
     str='hello'
     l=[1,2,3]
     tup1=(1,2,3)
     dic={'x':1}
     s1={'a','b','c'}
     f=open('a.txt','w',encoding='utf-8')
    

     

    找到一种不依赖索引的迭代取值的方式,这就用到了迭代器

    迭代器:迭代取值工具,可迭代的对象执行__iter__的方法得到的返回值就是迭代器对象
    dic={'x':1,'y':2,'z':3}
    iter_dic=dic.__iter__()  #iter_dic是迭代器
    print(iter_dic.__next__())             #x
    print(iter_dic.__next__())         #y
    print(iter_dic.__next__())             #z
    

     有了迭代器之后得到一种不依赖索引,统一的取值方式,

    while 迭代取值

    info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'}
    # info=[1,2,3,4,5]
    info_iter=info.__iter__()
    while True:
            print(info_iter.__next__())       #这种方式会报错
    
    info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'}
    # info=[1,2,3,4,5]
    info_iter=info.__iter__()
    while True:
        try:
            print(info_iter.__next__())
        except StopIteration:
            break
    
    文件的迭代取值
    l=open('a.txt','r',encoding='utf-8')
    iter_1=l.__iter__()
    while True:
        try:
            print(iter_1.__next__())
        except StopIteration:
            break
    

    迭代器的优点

    提供了一种可不依赖于索引取值的方式

    1.获取可迭代对象的方式:无须获取.python内置str,list,tuple,dict,set,file都是可迭代对象

    2.特点:

      内置有__iter__方法都是可迭代的对象,执行该方法会拿到一个迭代器对象

    迭代器对象

    1、获取迭代器对象的方式

      执行可迭代对象__iter__方法,拿到的返回值就是迭代器对象

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

    2、特点

      内置有__next__的方法。执行该方法会拿到迭代器对象中的一个值

      内置有__iter__的方法,执行该方法会拿到迭代器本身

    '''

    x='hello'
    iter_x=x.__iter__()
    print(iter_x.__iter__().__iter__().__iter__()is iter_x)
    

    for循环叫迭代器循环

    迭代器更加节省内存

     迭代器的缺点:

    取值麻烦,只能一个一个取,只能往后取

    并且是一次性的,无法用len获取长度for循环原理分析:

    1、for 循环称之为迭代器循环,in后跟的必须是可迭代的对象
    2、for循环会执行in后对象的__iter__方法,拿到迭代器对象
    3、然后调用迭代器对象的__next__方法,拿到一个返回值赋值给line,执行一次循环体
    4、周而复始,直到取值完毕,for循环会检测到异常自动结束循环

    作业:
    一:编写注册功能
    	要求用户输入账号
    	然后对账号进行合法性校验,必须是字母,并且用户名不能重复,否则重新输入
    	
    	要求用户输入密码
    	然后对密码进行合法性校验,长度至少6位,连续输入两次,两次输入不一致则重新输入
    	
    	将合法的账号密码写入文件
    
    二 编写用户认证装饰器,要求输入一次密码成功后记录用户状态,下次无需重复输入账号密码,如果连续输错三次账号密码则退出
    
    三 实现转账功能
    	编写有参函数,传入源账户名和目标账户名,实现原账户减去money,目标账户加上money
    	def transfer(src_user,dst_user,money):
    		pass
    
    
    选做作业:参考答案http://www.cnblogs.com/linhaifeng/articles/7532497.html#_label6
    	一:编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果
    
    	二:为题目五编写装饰器,实现缓存网页内容的功能:
    	具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,否则,就去下载,然后存到文件中
    
    	扩展功能:用户可以选择缓存介质/缓存引擎,针对不同的url,缓存到不同的文件中
    
    	三:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作
    
    	四:编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定
    	注意:时间格式的获取
    	import time
    	time.strftime('%Y-%m-%d %X')
    
    明日默写:
    	基于file、mysql、ldap的有参装饰器
    
    预习内容:http://www.cnblogs.com/linhaifeng/articles/7580830.html
    	生成器
    	三元表达式
    	列表生成式、字典生成式、生成器表达式
    	递归
    
    
    今晚考试:编写购物车程序
    	用户名和密码存放于文件中,格式为:egon|egon123
    	启动程序后,先登录,登录成功则让用户输入工资,然后打印商品列表,失败则重新登录,超过三次则退出程序
    	允许用户根据商品编号购买商品
    	用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
    	可随时退出,退出时,打印已购买商品和余额
    

      

  • 相关阅读:
    在线教育项目-day07【添加分类前端】
    在线教育项目-day07【课程分类显示接口】
    在线教育项目-day05【实现EasyExcel对Excel操作】
    在线教育项目-day05【上传头像实现】
    在线教育项目-day05【nginx】
    在线教育项目-day05【Swagger问题】
    在线教育项目-day05【上传头像功能】
    在线教育项目-day04【路由问题】
    在线教育项目-day04【后台讲师修改功能】
    在线教育项目-day04【后台讲师添加模块】
  • 原文地址:https://www.cnblogs.com/wangmiaolu/p/9155111.html
Copyright © 2020-2023  润新知