python10-装饰器

#装饰器 = 高阶函数+ 函数嵌套+ 函数闭包
#一、高阶函数:1.函数的调用值是函数;2.函数的返回值也是函数
import time
# def bar():
#     time.sleep(1)
#     print('from bar')# def timer(func):
#     start_time = time.time()
#     func()
#     stop_time = time.time()
#     print('函数运行时间是%s' %(stop_time-start_time))
#     return func# bar = timer(bar)
# bar()
#上述实现方式的问题在于,会多运行一次bar()#二、函数嵌套+函数闭包
# def timer(func):
#     def wrapper():
#         start_time = time.time()
#         func()
#         stop_time = time.time()
#         print('函数运行时间是%s' %(stop_time-start_time))
#     return wrapper# @timer              #在函数前面加'@timer', 相当于对函数进行装饰操作:bar = timer(bar)
# def bar():
#     time.sleep(1)
#     print('from bar')
# # bar = timer(bar)
# bar()#三、函数闭包+返回值+参数
# def timer(func):
#     def wrapper(*args,**kwargs):
#         start_time = time.time()
#         res = func(*args,**kwargs)
#         stop_time = time.time()
#         print('函数运行时间是%s' %(stop_time-start_time))
#         return res
#     return wrapper# @timer              #在函数前面加'@timer', 相当于对函数进行装饰操作:bar = timer(bar)
# def bar(name,age,gender):
#     time.sleep(1)
#     print('from bar,name is %s,age is %s,gender is %s' %(name,age,gender))
#     return 'return from bar'
# # bar = timer(bar)
# res = bar('alex',18,'男')
# print(res)#四、解压序列
# l = [1,2,3,4,621,3324,11,254,885,123,'aa','11221',2222]
# a,*_,b = l
# print(a,b)# c = 1
# d = 2
# c,d = d,c
# print(c,d)#给函数加认证
user_list =[{'name':'alex','passwd':'1234'},{'name':'keith','passwd':'12345'},{'name':'mick','passwd':'1222'},{'name':'june','passwd':'11111'},{'name':'haha','passwd':'2345'}
]
user_dic = {'username':None,'login_statu':False}
def auth(func):def wrapper(*args,**kwargs):if user_dic['username'] and user_dic['login_statu']: res = func(*args,**kwargs)return resfor i in range(3):name = input('请输入用户名:')password = input('请输入密码:')for item in user_list:if item['name'] == name and item['passwd'] == password:print('登录成功!')user_dic['username'] = nameuser_dic['login_statu'] = Trueres = func(*args,**kwargs)return resif i < 2:print('登录失败,请重试')else:print('3次登录机会已使用完!')return wrapper@auth
def order_l():print('成功查看订单')return 'dingdan'@auth
def index():print('进入京东')@auth
def produ(name,*args):print('%s 准备买%s' %(name,args))index()
order_l()
produ('alex','wazi','衣服')       #给装饰器加参数
user_list =[{'name':'alex','passwd':'1234'},{'name':'keith','passwd':'12345'},{'name':'mick','passwd':'1222'},{'name':'june','passwd':'11111'},{'name':'haha','passwd':'2345'}
]
user_dic = {'username':None,'login_statu':False}
def auth(func):def wrapper(*args,**kwargs):if user_dic['username'] and user_dic['login_statu']: res = func(*args,**kwargs)return resfor i in range(3):name = input('请输入用户名:')password = input('请输入密码:')for item in user_list:if item['name'] == name and item['passwd'] == password:print('登录成功!')user_dic['username'] = nameuser_dic['login_statu'] = Trueres = func(*args,**kwargs)return resif i < 2:print('登录失败,请重试')else:print('3次登录机会已使用完!')return wrapper@auth
def order_l():print('成功查看订单')return 'dingdan'@auth
def index():print('进入京东')@auth
def produ(name,*args):print('%s 准备买%s' %(name,args))index()
order_l()
produ('alex','wazi','衣服') #文件的增删改查
import os
def file_handler(backward_data,record=None,type='fetch'):if type == 'fetch':with open('http.conf','r',encoding='utf-8') as read_f:ret = []tag = Falsefor read_line in read_f:if read_line == backward_data:tag = Truecontinueelif tag and read_line.startswith('backward'):tag = Falseelif tag:ret.append(read_line)return retif type == 'change':with open('http.conf','r') as read_f, open('http_new.conf','w') as write_f:tag = Falsehas_write = Falsefor read_line in read_f:if read_line == backward_data:tag = Truewrite_f.write(read_line)continueelif not tag:write_f.write(read_line)elif tag and read_line.startswith('backward'):tag = Falsewrite_f.write(read_line)else:if not has_write:for i in record:write_f.write(i)has_write = Trueos.rename('http.conf','http.conf.bak')os.rename('http_new.conf','http.conf')os.remove('http.conf.bak')return
def fetch(data):backward_data = 'backward '+ data + '\n'res = file_handler(backward_data)return resdef add(data):new_data = eval(data)title = new_data[0]['backward']backward_data = 'backward ' + title + '\n'new_record = '%sserver %s %s weight %s max_connections %s\n' %('\t'*2,new_data[0]['record']['server'],new_data[0]['record']['server'],new_data[0]['record']['weight'],new_data[0]['record']['max_connections'])ret = fetch(title)if new_record in ret:return '您要增加的条目已存在'else:ret.insert(0,new_record)res = file_handler(backward_data,record=ret,type='change')returndef change(data):new_data = eval(data)title = new_data[0]['backward']backward_data = 'backward ' + title + '\n'old_record = '%sserver %s %s weight %s max_connections %s\n' %('\t'*2,new_data[0]['record']['server'],new_data[0]['record']['server'],new_data[0]['record']['weight'],new_data[0]['record']['max_connections'])new_record = '%sserver %s %s weight %s max_connections %s\n' %('\t'*2,new_data[1]['record']['server'],new_data[1]['record']['server'],new_data[1]['record']['weight'],new_data[1]['record']['max_connections'])ret = fetch(title)if not ret or old_record not in ret:return '你需要替换的内容不存在'else:for item in ret:if item == old_record:id = ret.index(item)ret[id] = new_recordbreakprint('需要修改为:%s' %ret)res = file_handler(backward_data,record=ret,type='change')returndef delete(data):new_data = eval(data)title = new_data[0]['backward']backward_data = 'backward ' + title + '\n'old_record = '%sserver %s %s weight %s max_connections %s\n' %('\t'*2,new_data[0]['record']['server'],new_data[0]['record']['server'],new_data[0]['record']['weight'],new_data[0]['record']['max_connections'])ret = fetch(title)if not ret or old_record not in ret:print('你需要删除的内容不存在')returnelse:for item in ret:if item == old_record:ret.remove(item)res = file_handler(backward_data,record=ret,type='change')returnif __name__ == '__main__':msg = '''1:增加2:删除3:修改4:查询5:退出
'''dic = {'1':add,'2':delete,'3':change,'4':fetch,'5':exit}while True:print(msg)act = input('请输入你的操作:').strip()if not act: continueelif act == '5':breakelif act not in str(range(1,6)):print('请输入目录中的数字:')else:data = input('请输入需要内容:').strip()res = dic[act](data)print(res)文件样例backward www.oldboy3.orgserver 22.22.22.22 22.22.22.22 weight 100 max_connections 30600server 11.5.5.9 11.5.5.9 weight 100 max_connections 6000server 5.4.1.9 5.4.1.9 weight 100 max_connections 36000server 1.1.1.1 1.1.1.1 weight 888 max_connections 600server 89.5.5.9 89.5.5.9 weight 100 max_connections 30006backward www.oldboy3.org1server 11.5.5.59 11.5.5.59 weight 250 max_connections 8000server 5.4.1.16 5.4.1.16 weight 250 max_connections 800server 88.5.5.56 88.5.5.56 weight 250 max_connections 80server 89.5.5.56 89.5.5.56 weight 250 max_connections 3008[{'backward':'www.oldboy3.org','record':{'server':'88.5.5.9','weight':'100','max_connections':30600}},{'backward':'www.oldboy3.org','record':{'server':'1.1.1.1','weight':'888','max_connections':600}}]
[{'backward':'www.oldboy3.org','record':{'server':'22.22.22.22','weight':'100','max_connections':30600}}]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/889437.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试工作全解析——流程、方法与避坑指南

引言 软件测试是保障产品质量的核心环节,但许多团队仍深陷认知误区和低效流程。本文以工程化视角拆解测试全流程,结合实用工具与经典案例,助你构建系统化测试思维。一、软件测试全流程标准化(5W2H模型) 1. 测试计划方案(Why & How)战略定位:明确测试在项目生命周期…

红色五角星1

from turtle import * fillcolor("red") begin_fill() while True: forward(200) right(144) if abs(pos())<1: break end_fill()

解锁 Hertz 路由:构建高效 API 的魔法钥匙

路由注册 Hertz 提供了 GET、POST、PUT、DELETE、ANY 等方法用于注册路由。方法 介绍Hertz.GET 用于注册 HTTP Method 为 GET 的方法Hertz.POST 用于注册 HTTP Method 为 POST 的方法Hertz.DELETE 用于注册 HTTP Method 为 DELETE 的方法Hertz.PUT 用于注册 HTTP Method 为 PUT…

No.1 VS code

1、认识 VS code 2、快速创建一个.html 文件 1)新建文件:test.html 2)英文状态下输入一个“!”,回车; 3)在body中输入“我的第一个网页”; 4)运行:从文件夹中找到创建的这个文件,双击打开(以后讲其他运行方式) 3、VSCode 快捷键 1)! + 回车:快速创建一个html…

太阳花

import turtle from turtle import * color(red , yellow) begin_fill() while True: forward(200) right(170) if abs( pos() ) < 1: break end_fill() done() turtle.fd(100)

前端主流构建工具

本文首发博客网站,由于图片和格式解析问题,可前往阅读原文随着前端开发复杂度的提升,构建工具在开发流程中扮演着越来越重要的角色。这些工具可以帮助开发者实现代码的打包、优化、转译、模块化处理等功能,从而提升开发效率和用户体验。本文将以当前主流的前端构建工具为核…

DeepSeek “源神”启动!「GitHub 热点速览」

​上周,DeepSeek 官方宣布将陆续发布 5 个开源项目。本周一开源社区就迎来了首发之作——FlashMLA!该项目开源后,不到一天 Star 数已突破 6k,并且还在以惊人的速度持续飙升。GitHub 地址:github.com/deepseek-ai/FlashMLAFlashMLA 是一个针对 Hopper GPU 优化的高效 MLA(…

读DAMA数据管理知识体系指南04数据治理(上)

读DAMA数据管理知识体系指南04数据治理(上)1. 数据治理 1.1. Data Governance, DG1.1.1. 定义是在管理数据资产过程中行使权力和管控,包括计划、监控和实施1.1.2. 数据治理职能是指导所有其他数据管理领域的活1.1.3. 目的是确保根据数据管理制度和最佳实践正确地管理数据1.1…

Virtual Box设置桥接模式

一、硬件 1.查看宿主机ip cmd命令:ipconfig 无线局域网适配器 WLAN:连接特定的 DNS 后缀 . . . . . . . :IPv6 地址 . . . . . . . . . . . . : 保密本地链接 IPv6 地址. . . . . . . . : fe80::f087:44c8:88bc:b041%11IPv4 地址 . . . . . . . . . . . . : 192.168.43.149子网…

【NuGet攻略】C#开发者必备技能:构建发布开发工具包

来源 https://mp.weixin.qq.com/s/YqKTdyLXuODBLxnhar52Xg 2025年02月22日 17:44 广东前言 在 C# 开发领域里,构建代码库,分享与使用可复用代码的机制是十分必要的,它可以提高开发效率。通常,我们把可复用代码打包后的文件称为包(Package)。 在 .NET 中,通过使用 NuGet…

【2025穿越时空 怀旧经典】VMware Workstation Pro助你重返WindowsXP,让怀旧不再是空谈!

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注使用VMware Workstation Pro 虚拟机安装XP系统 让你瞬间回到黄金年代准备WindowsXP ISO镜像文件 大家…