装饰器,迭代器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('\n').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('\n').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('\n').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() 方法计算长度。

   

posted @ 2019-11-13 21:30  薛定谔的猫66  阅读(131)  评论(0编辑  收藏  举报