• 装饰器,迭代器day12


    今日学习总结:

    一、while 或 if 与布尔值的假


    x=5 dict = {'name':None,'age':123} #name的值为空 print(dict['name']) while dict.get('name'): # 这时候while后面的 语句是假的 所以没有办法执行 y=x+1 print(y) 结果: None

    x = 5
    dict = {'name': None, 'age': 123}
    print(dict['name'])
    if dict.get('name'):
    y = x + 1
    print(y)
    结果:
    None
     

    while 与布尔值的真

    x=5
    dict = {'name':None,'age':123}
    dict['name']='xiaohong'
    print(dict['name'])
    while dict.get('name'):             # 这时候while后的语句是真
        y=x+1
        print(y)
        break                           #如果没有break则一直输出6     这里是while与break的连用


    x=5
    dict = {'name':None,'age':123}
    dict['name']='xiaohong'
    print(dict['name'])
    if dict.get('name'): # 这时候if后的语句是真
    y=x+1
    print(y)



    二、叠加装饰器

    作业:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码

    # 可变类型,无需通过global引用,可直接修改。不可变类型,需要在函数内部使用global对其进行修改
    user_info = {
        'user':None                                                 #表示user这个用户名没有
    def login
        username = input('请输入账号: ').strip()
        password = input('请输入密码: ').strip()
        with open(r'user.txt', 'r', encoding='utf-8') as f:
            for line in f:
                name, pwd = line.strip('
    ').split(':')             # [tank, 123]
        if username == name and password == pwd:
            print('登录成功!')
            user_info['user'] =username     #表示将输入的用户名username替换掉user_info字典里的None
        else:
            print('登录失败!')
    
    def login_auth(func):  # func ---> func1, func2, func3
        def inner(*args, **kwargs):
            if user_info.get('user'):
                res = func(*args, **kwargs)  # func() ---> func1(), func2(), func3()
                return res
            else:
                print('请先登录...')
                login()
        return inner
    # func1,2,3 都需要先登录才可以使用,若登录一次,后续功能无需再次登录,绕过登录认证
    @login_auth                    #这是语法糖
    def func1():
        print('from func1')
        pass
    @login_auth
    def func2():
        print('from func2')
        pass
    @login_auth
    def func3():
        print('from func3')
        pass
    while True:
        func1()
        input('延迟操作...')
        func2()
        func3()

    叠加装饰器例子1:

    在直接使用装饰器时候,被装饰对象要写在装饰器上面
     ps: 再直接使用装饰器时候,被装饰对象要写在装饰器上面

    需求: 为被装饰对象,添加统计时间 与 登录认证功能
    import time user_info = { 'user': None } def download_movie(): print('正在下载电影...') time.sleep(2) print('下载电影完成...') return 'GTWZ.mp4' def login(): username = input('请输入账号: ').strip() password = input('请输入密码: ').strip() with open(r'user.txt', 'r', encoding='utf-8') as f: for line in f: name, pwd = line.strip(' ').split(':') # [tank, 123] if username == name and password == pwd: print('登录成功!') user_info['user'] = username return True else: print('登录失败!') return False # 登录认证装饰器 def login_auth(func): def inner1(*args, **kwargs): if user_info.get('user'): #判断用户是否已经登录了,若登录了就 执行func() res = func(*args, **kwargs) return res else: flag = login() if flag: #表示去调用登录函数login() 判断如果登录成功,执行func() res = func(*args, **kwargs) return res else: login() return func(*args, **kwargs) return inner1 # 统计时间装饰器 def time_record(func): def inner2(*args, **kwargs): print('开始统计...') start_time = time.time() res = func(*args, **kwargs) end_time = time.time() print(f'消耗时间为: {end_time - start_time}') return res return inner2 t=time_record(download_movie) #给被装饰对象添加time_record功能 t() d=login_auth(download_movie) #给被装饰对象添加登录功能 d()

    ps:用语法糖使用装饰器时,语法糖一定要在被装饰对象之上

    需求: 为被装饰对象,添加统计时间 与 登录认证功能 import time user_info = { 'user': None } def login(): username = input('请输入账号: ').strip() password = input('请输入密码: ').strip() with open(r'user.txt', 'r', encoding='utf-8') as f: for line in f: name, pwd = line.strip(' ').split(':') # [tank, 123] if username == name and password == pwd: print('登录成功!') user_info['user'] = username return True else: print('登录失败!') return False # 登录认证装饰器 def login_auth(func): def inner1(*args, **kwargs): if user_info.get('user'): res = func(*args, **kwargs) return res else: flag = login() if flag: res = func(*args, **kwargs) return res else: login() return func(*args, **kwargs) return inner1 # 统计时间装饰器 def time_record(func): def inner2(*args, **kwargs): print('开始统计...') start_time = time.time() res = func(*args, **kwargs) end_time = time.time() print(f'消耗时间为: {end_time - start_time}') return res return inner2 @login_auth # inner1 = login_auth(inner2) #先添加登录功能 @time_record # inner2 = time_record(download_movie) #再添加统计时间功能 def download_movie(): print('正在下载电影...') time.sleep(2) print('下载电影完成...') return 'GTWZ.mp4' download_movie()

     有参数装饰器

    方法一:有参装饰器
    def user_auth(user_role):  # 'SVIP'
        def wrapper(func):
            def inner(*args, **kwargs):
                if user_role == 'SVIP':
                    # 添加超级用户的功能
                    res = func(*args, **kwargs)
                    return res
                elif user_role == '普通用户':
                    print('普通用户')
                    # 添加普通用户的功能
                    res = func(*args, **kwargs)
                    return res
    
            return inner
        return wrapper
    
    @user_auth('普通用户')            #在这里wrapper=user_auth('普通用户')
    def index(): 

    pass
    index()


    方法二:有参装饰器
    def user_auth(user_role): # 'SVIP'
    def wrapper(func):
    def inner(*args, **kwargs):
    if user_role == 'SVIP':
    # 添加超级用户的功能
    res = func(*args, **kwargs)
    return res
    elif user_role == '普通用户':
    print('普通用户')
    # 添加普通用户的功能
    res = func(*args, **kwargs)
    return res

    return inner
    return wrapper
    wrapper = user_auth('普通用户')
    @wrapper #<--- 返回结果(wrapper) <---- user_auth()
    def index():
    pass
    index()
     

     叠加装饰器


    def
    say_hi(func): def wrapper(*args, **kwargs): print("HI") ret = func(*args, **kwargs) print return wrapper def say_yo(func): def wrapper(*args, **kwargs): print("YO") return func(*args, **kwargs) @say_hi @say_yo def func(): print("Tank & Jason") func() return wrapper

    三、迭代器

    1.迭代:重复迭代的过程,每一次都是基于上一次结果而来

    2.迭代器:迭代取值的工具

    3.可迭代对象:在语法形式上,内置有—iter-()方法的对象。比如:list str tuple dict set f

    4.迭代器对象:在语法形式上,内置有-next-()方法的对象

    5.如何获取迭代器对象:

    可迭代对象._iter_() 

    6.如何取值

    迭代器对象._next_() 

    7.  try:

             pass

         except:

     8.迭代器的优缺点:

    优点:不依赖于索引取值,节省内存空间

    缺点:取值麻烦,不能取执行的某个值,不能有len() 方法计算长度。

       

  • 相关阅读:
    ASP.Net 2.0窗体身份验证机制详解(FormsAuthentication) (转载)
    获取页面得所有控件
    标题: 如何断开与另一台机器的连接(更换用户名和口令)
    C#数据类型及范围
    常用数学符号读法大全
    理解偏序关系
    理解全序关系
    理解拟序关系
    《离散数学》双语专业词汇表 名词术语中英文索引
    ORL人脸库
  • 原文地址:https://www.cnblogs.com/linda-liu/p/11853348.html
Copyright © 2020-2023  润新知