編寫課上講解的有參裝飾器
def auth(db_type):def inner(*args, **kwargs):
name = input('name: ').strip()
pwd = input('pwd: ').strip()
if db_type == 'file':
print('檔案驗證登入')
if (name, pwd) == ('egon', '123'):
print('登入成功')
res = func(*args, **kwargs)
return res
else:
print('使用者名稱或密碼錯誤')
elif db_type == 'file':
print('檔案驗證登入')
if (name, pwd) == ('egon', '123'):
print('登入成功')
res = func(*args, **kwargs)
return res
else:
print('使用者名稱或密碼錯誤')
return inner
@auth('file')
def index():
print('123')
index()
還記得我們用函式物件的概念,製作乙個函式字典的操作嗎
來來來,我們有更高大上的做法,在檔案開頭宣告乙個空字典
然後在每個函式前加上裝飾器,完成自動新增到字典的操作
cmd_dict = {}def inner(*args, **kwargs):
index = len(cmd_dict) + 1
cmd_dict[str(index)] = (tips, func)
return inner
for func in my_func.values():
func()
def login():
print('this is login')
def register():
print('this is register')
while 1:
for k, v in cmd_dict.items():
print(f'-'.center(20, '-'))
cmd = input('請輸出編號:').strip()
if cmd not in cmd_dict:
print('重新輸入')
continue
func = cmd_dict.get(cmd)[1]
func()
編寫日誌裝飾器,實現功能如:一旦函式f1執行,則將訊息2017-07-21 11:12:11 f1 run寫入到日誌檔案中,日誌檔案路徑可以指定。注意:時間格式的獲取
import timedef my_log(file_path):
def inner(*args, **kwargs):
now = time.strftime('%y-%m-%d %h:%m:%s')
msg = f' run\n'
with open(file_path, 'at', encoding='utf-8') as f:
f.write(msg)
res = func(*args, **kwargs)
return res
return inner
@my_log('log.txt')
def f1():
print('i am f1')
f1()
4、基於迭代器的方式,用while迴圈迭代取值字串、列表、元組、字典、集合、檔案物件
my_obj = '2333'my_obj_i = my_obj.__iter__()
while true:
try:
print(my_obj_i.__next__())
except stopiteration:
break
my_obj = [1,2,3]my_obj_i = my_obj.__iter__()
while true:
try:
print(my_obj_i.__next__())
except stopiteration:
break
my_obj = (4,5,6)my_obj_i = my_obj.__iter__()
while true:
try:
print(my_obj_i.__next__())
except stopiteration:
break
my_obj =my_obj_i = my_obj.__iter__()
while true:
try:
print(my_obj_i.__next__())
except stopiteration:
break
my_obj =my_obj_i = my_obj.__iter__()
while true:
try:
print(my_obj_i.__next__())
except stopiteration:
break
with open('aaa.txt', mode='rt', encoding='utf-8')while true:
try:
print(f.__next__())
except stopiteration:
break
5自定義迭代器實現range功能
def my_range(start, end, step=1):while start < end:
yield start
start += step
g = my_range(1,5)
for i in g:
print(i)
生成器 迭代器
最近見天一直在看廖大的python教程,卻發現很多基礎看著很簡單,但卻不會應用,歸根結底還是因為理解不到位,故而又將教程學了一遍,並將自己的理解記錄一下,也方便後面查閱。由於沒有相關程式設計基礎,有些理解可能是錯的,敬請批評指正。想深入具體學習廖大部落格請移步廖雪峰的官方 有時候用迴圈生成列表太過繁...
迭代器,生成器
迭代器 生成器 生成器的第1種實現方式 列表生成式改為生成器 python中yield關鍵字 函式中如果有yield,那麼呼叫這個函式的返回值為生成器。當生成器g呼叫next方法,執行函式,知道遇到yield就停止 再執行next,從上一次停止的地方繼續執行 函式中遇return直接退出,不繼續執行...
迭代器 生成器
迭代器 iter 可迭代物件 下乙個元素的值 next 可迭代物件 類中實現 iter 方法 提供迭代器 實現迭代器 import time class mylistiter object 迭代器類 def init self,data self.data data self.index 0 def...