裝飾器,迭代器day12

今日學習總結:python

1、while 或 if 與布爾值的假app


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)



2、疊加裝飾器工具

 

做業:編寫裝飾器,爲多個函數加上認證的功能(用戶的帳號密碼來源於文件),要求登陸成功一次,後續的函數都無需再輸入用戶名和密碼

# 可變類型,無需經過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()

 有參數裝飾器spa

方法一:有參裝飾器
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()
 

 疊加裝飾器code


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

3、迭代器對象

1.迭代:重複迭代的過程,每一次都是基於上一次結果而來blog

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

3.可迭代對象:在語法形式上,內置有—iter-()方法的對象。好比:list str tuple dict set f

4.迭代器對象:在語法形式上,內置有-next-()方法的對象

5.如何獲取迭代器對象:

可迭代對象._iter_() 

6.如何取值

迭代器對象._next_() 

7.  try:

         pass

     except:

 8.迭代器的優缺點:

優勢:不依賴於索引取值,節省內存空間

缺點:取值麻煩,不能取執行的某個值,不能有len() 方法計算長度。

相關文章
相關標籤/搜索