@2020.3.24
(Q1)
作業:
1、撰寫課上講解的有參裝飾器
def auth(db_type = 'file'): def inner(func): def wrapper(*args, **kwargs): inp_name = input("your name:").strip() inp_pwd = input("your password:").strip() if db_type == 'file': with open(r'db.txt', 'rt', encoding='utf-8') as f: for line in f: user, pwd, *_ = line.strip().split(':') if inp_name == user and inp_pwd == pwd: print('檔案認證登錄成功') return func(inp_name) else: print('用戶名密碼錯誤') elif db_type == 'mysql': func() elif db_type == 'ldap': func() else: print('該認證登錄方式不存在') return wrapper return inner @auth(db_type='file') def index(name): print('welcome 【%s】' % name) @auth(db_type='mysql') def mysql_login(): print('mysql認證') @auth(db_type='ldap') def ldap_login(): print('ldap認證') index() mysql_login() ldap_login()
2:還記得我們用函式物件的概念,制作一個函式字典的操作嗎,來來來,我們有更高大上的做法——
在檔案開頭宣告一個空字典,然后在每個函式前加上裝飾器,完成自動添加到字典的操作
d = {} key = 0 def add_dict(func): def wrapper(*args, **kwargs): global key d['{}'.format(key)] = func key += 1 return wrapper @add_dict def index(): pass @add_dict def home(): pass index() home() print(d)
3、 撰寫日志裝飾器,實作功能如:一旦函式f1執行,則將訊息2017-07-21 11:12:11 f1 run寫入到日志檔案中,日志檔案路徑可以指定
注意:時間格式的獲取
import time
time.strftime('%Y-%m-%d %X')
import time import os def logger(logfile): def deco(func): if not os.path.exists(logfile): with open(logfile,'w'):pass def wrapper(*args,**kwargs): res=func(*args,**kwargs) with open(logfile,'a',encoding='utf-8') as f: f.write('%s %s run\n' %(time.strftime('%Y-%m-%d %X'),func.__name__)) return res return wrapper return deco @logger(logfile='milimili.log') def index(): print('index') index()
4、基于迭代器的方式,用while回圈迭代取值字串、串列、元組、字典、集合、檔案物件
def wrapper(inp_type): print('輸出內容為: {}'.format(type(inp_type))) while True: try: print(next(inp_type)) except StopIteration: break wrapper('123'.__iter__()) wrapper([1,2,3].__iter__()) wrapper((1,2,3).__iter__()) wrapper({'k1':1,'k2':2}.__iter__()) wrapper({1,2,3}.__iter__()) with open('a.txt', 'rt', encoding='utf-8') as f: wrapper(f.__iter__())
5、自定義迭代器實作range功能
def my_range(start, stop, step=1): while start < stop: start += step yield start for i in my_range(0,5): print(i-1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/165600.html
標籤:Python
上一篇:《自拍教程50》Python adb隨機按鍵模擬2小時
下一篇:機器視覺(4)--生成驗證碼
