• python接口测试自动化教程
    接口定义:  接口普遍有两种意思,一种是API(Application Program Interface),应用编程接口,它是一组定义、程序及协议的集合,通过API接口实现计算机软件之间的相互通信。而另外一种则是Interface,它是面向对象语言如java,c#等中一个规范,它可以实现多继承的功能。接口测试中的接口指的是API。为什么要使用接口:  假如公司的产品前端开发还没开发完,接口开发好了。有天领导说,小王,你测下这个登录功能,要是你不懂接口的话就会对领导说这个功能测不了啊,页面没开发完。领导会把你!@¥@)¥!  接口测试是不需要看前端页面的,可以更早的介入到测试工作中,提高工作效率。  根据测试金字塔,越底层成本越低,一个底层的bug可能会引起上一层的多个bug,所以测试越底层,越能保证产品的质量,也越能节省测试的成本。而单元测试一般是由开发来完成的,所以对于测试来说,接口测试是非常必要的。对于自动化测试来说,UI的变动性最大,所以UI自动化测试的维护成本很高。而接口的改动很小,所以接口自动化测试是最实用,最节约成本的。2. 基本流程接口功能自动化测试流程如下:需求分析 -> 用例设计 -> 脚本开发 -> 测试执行 -> 结果分析2.1 示例接口手机号码归属地接口地址:http://apis.juhe.cn/mobile/get返回格式:json/xml请求方式:get请求示例:http://apis.juhe.cn/mobile/get?phone=手机号&key=您申请的KEY3. 需求分析需求分析是参考需求、设计等文档,在了解需求的基础上还需清楚内部的实现逻辑,并且可以在这一阶段提出需求、设计存在的不合理或遗漏之处。如:手机号归属地接口,输入不同号码段的手机号,查看手机号归属和手机号码属于哪个运营商4. 用例设计5. 脚本开发5.1 模块安装使用pip命令安装即可:pip install requests5.2 接口调用使用requests库,我们可以很方便的编写上述接口调用方法(如输入phone=手机号,示例代码如下):在实际编写自动化测试脚本时,我们需要进行一些封装。#!/usr/bin/python3import unittestimport requestsimport jsonclass Test_Moblie(unittest.TestCase):# 封装公共的数据def common(self, phone):url = "http://apis.juhe.cn/mobile/get"date = {'key': "4391b7dd8213662798c3ac3da9f54ca8",'phone': phone}self.response = requests.get(url, params=date)return self.responsedef test_1(self):self.common("1857110")print(self.response.text)def test_2(self):self.common("1868115")print(self.response.text)if __name__ == '__main__':unittest.main() 我们按照测试用例设计,依次编写每个功能的自动化测试脚本即可。5.3 结果校验在手工测试接口的时候,我们需要通过接口返回的结果判断本次测试是否通过,自动化测试也是如此。对于本次的接口,输入手机,我们需要判断返回的结果resultcode是不是等于200结果分页时需要校验返回的结果数是否正确等。完整结果校验代码如下:#!/usr/bin/python3import unittestimport requestsclass Test_Moblie(unittest.TestCase):# 封装公共的数据def common(self, phone):url = "http://apis.juhe.cn/mobile/get"date = {'key': "4391b7dd8213662798c3ac3da9f54ca8",'phone': phone}self.response = requests.get(url, params=date)return self.responsedef test_2(self):self.common("1868115")print(self.response.json())dict_2 = self.response.json()# 打印值省份值为:200resultcode = dict_2["resultcode"]# 为演式错误的示例,将对比值改为200,正确值为200,可自行修改self.assertEqual(resultcode, "200", msg='失败原因:%s != %s' % (resultcode, "200"))if __name__ == '__main__':unittest.main()运行结果:5.4 生成测试报告用例执行完之后,那就需要发报告给领导。那么我们使用HTMLTestRunner第3方模块插件生成html格式测试报告from unittest import TestSuitefrom unittest import TestLoaderimport requestsimport jsonimport HTMLTestRunnerimport unittestclass Test_Moblie(unittest.TestCase):# 封装公共的数据def common(self, phone):url = "http://apis.juhe.cn/mobile/get"date = {'key': "4391b7dd8213662798c3ac3da9f54ca8",'phone': phone}self.response = requests.get(url, params=date)return self.responsedef test_1(self):     """判断状态码"""self.common("1857110")print(self.response.json())# 返回数据为dictprint(type(self.response.json()))dict_1 = self.response.json()# 打印值省份值为:湖北province = dict_1["result"]["province"]self.assertEqual(province, "湖北", msg='失败原因:%s != %s' % (province, "湖北"))def test_2(self):     """判断省份"""self.common("1868115")print(self.response.json())dict_2 = self.response.json()# 打印值省份值为:湖北resultcode = dict_2["resultcode"]# 为演式错误的示例,将对比值改为201,正确值为200,可自行修改self.assertEqual(resultcode, "201", msg='失败原因:%s != %s' % (resultcode, "200"))if __name__ == '__main__':report = "E:/report_path/result.html"file = open(report,"wb")# 创建测试套件testsuit = unittest.TestSuite()testload = unittest.TestLoader()# 括号内传入的是类名,会自动找到以test开头全部的用例# 用例以例表形式存储case = testload.loadTestsFromTestCase(Test_Moblie)testsuit.addTests(case)run = HTMLTestRunner.HTMLTestRunner(stream=file,title="接口自动化测试报告",description="用例执行结果")run.run(testsuit)file.close()5.5发送邮件报告测试完成之后,我们可以使用zmail模块提供的方法发送html格式测试报告基本流程是读取测试报告 -> 添加邮件内容及附件 -> 连接邮件服务器 -> 发送邮件 -> 退出,示例代码如下:#!/usr/bin/python3import zmaildef send_mail():# 定义邮件mail = {"subject": "接口测试报告",# 任一填写'content_text': '手机号归属地_API自动化测试报告',# 任一填写# 多个附件使用列表"attachments": "E:/report/result.html"}# 自定义服务器# 如果不知道如何查看授权码,请查看这一篇博客:https://www.cnblogs.com/zzpython/p/13095749.htmlserver = zmail.server("发送人邮箱.com","QQ邮箱是用授权码",smtp_host="smtp.qq.com",smtp_port = 465)# 发送邮件server.send_mail("收件人QQ邮箱", mail)try:send_mail()except FileNotFoundError:print("未找到文件")else:print("发送成功")6. 结果分析打开完成后生成的测试报告,可以看出本次测试共执行了2条测试用例,1条成功,1条失败 最终发送测试报告邮件,截图如下:
  • [全栈开发者] 【Python编程创造营·第三阶段】Python应用篇·最终考核打卡帖
    不知不觉中,Python编程创造用第三阶段·Python应用篇所有课程内容都已经全部更新完毕。大家积极的学习态度,遇到问题及时在学习群内提出,让本阶段课程可以顺利完成再次感谢大家:◎积极完成每章的随堂测验打卡,做到了课后的知识强化与巩固;◎认真完成每周读书笔记打卡,将自己的学习心得总结下来;◎有活力地问答官打卡,分享自己在学习中的问题和经验。十分感谢大家能顺利完成本阶段的学习内容,我们也在大家学习的过程中,总结了大家反馈的内容,对新阶段的课程会更好的输出和整合预告:Python编程创造营三个阶段的课程都已更新完毕,我们会快速整理大家的积分及考核,给大家安排发放奖品,具体进度详见Python专属社群现在,大家迎来了第三阶段考核,让我们来看一下考核的具体内容▶考核打卡时间:2021.04.30-2021.05.09 23:59 (给大家五一充分玩的时间哦~)▶考核途径:点击下方链接,选择【第三阶段考核】https://education.huaweicloud.com/courses/course-v1:HuaweiX+CBUCNXX123+Self-paced/about▶考核要求:进入考核页面后,点击“【必读】考核要求”,详细阅读考核要求和评判标准后按要求进行考核,提交机会只有1次,请大家认真作答。▶打卡方式:如果您已经在云学院平台提交考核结果,后请您按照下列方式进行考核打卡只有在按照要求进行打卡才会得到本阶段考核证书!只有在按照要求进行打卡才会得到本阶段考核证书!只有在按照要求进行打卡才会得到本阶段考核证书!方式:打卡正确的回复格式:华为云账号+姓名(显示在考核证书上面名字)+提交完考核页面截图1张例如:华为云账号:grandmaster  姓名:华为云小助手05 考核截图如下重要提示:请严格按照回复示例进行回复,本次为阶段末考核项目,如果没有按照要求的格式进行回复,版主将不予提示,同时不计入考核结果,会影响考核证书及奖品的发放哦▶考核评分:本次考核满分100分,提交后直接显示成绩,成绩排行榜会在考核结束后10个工作日内公布,只有即参与考核又参与考核打卡的同学才会有分数和对应的奖励哦~分数会公布在博客里面,具体请大家留意小助手信息。▶考核奖励:◎参与最后考核并按要求回复本帖,就可得到电子版证书(证书上会根据大家的回复的真实姓名填写信息,请大家在留信息时注意)参与考核,人人有份,证书由05小助手微信点对点发放,没添加小助手企业微信的伙伴可以扫描下方二维码添加,证书将在第一阶段结束后15个工作日内发放,请大家耐心等待小助手的通知哦~(注意:凭各阶段电子证书最后可兑换实体证书哦~)◎参与考核即可获得20积分累计到总积分中,赢取最后积分大奖;◎考核分数≥60分并回复本帖,可得到考核积分额外的3积分!◎考核分数第1名将额外再获得10积分,第2名额外再获得7积分,第3名额外再获得5积分,当考核分数相同时,排名按照考核打卡帖时间进行排序(占楼无效!)◎特别提示:参加了所有阶段考核的同学们,最后可凭每阶段证书兑换整阶段实体证书一份,请大家关注后续规则!◎大家别忘了随堂测验,读书笔记和问答官排位赛回复打卡截止日期为05月09日23:59,抓紧时间打卡呀~积分排行榜奖品本次活动不仅免费跟大牛学习技术,更有积分大礼等着大家~每次有效提交的学习任务都会得到对应积分,累计积分最高者即可获得HUAWEI  GT 手表,还有华为无线耳机、旅行套装、数十万码豆等着大家! 活动注意事项1.由于本帖回复内容为阶段考核测试内容,并涉及到个人隐私,已设置回帖仅版主可见,请大家放心回复2.请大家务必在考核规定时间05月09日 23:59内完成考核回帖打卡,否侧将影响证书和奖品的发放3.积分和考核奖品信息我们会在考核阶段结束后15个工作日内整理完毕4.华为云账号为实名认证,每个实名认证账号/或同一收货地址收货人只能获得一份奖品,请大家注意5.阶段结束后如遇预定奖品库存不足时,华为云会更换同等价位奖品给大家!
  • [技术干货] python绘制箱型图
    本文实例为大家分享了python绘制箱型图的具体代码,供大家参考,具体内容如下123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869import numpy as npimport pandas as pdimport matplotlib.pyplot as plt  # Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn就能做出很具有吸引力的图。import seaborn  as snsfrom scipy import stats import warningswarnings.filterwarnings("ignore")%matplotlib inline  # 箱型图# orient="v" 箱子垂直显示,默认为'h'水平显示# showfliers=False,#异常值关闭显示# fliersize=15  设置离散值marker大小,默认为5# flierprops = {'marker':'o',#异常值形状#                          'markerfacecolor':'red',#形状填充色#                          'color':'black',#形状外廓颜色#                         }, # showcaps=False,#上下横线关闭# capprops={'linestyle':'--','color':'red'},#设置上下横线属性# whiskerprops={'linestyle':'--','color':'red'},#设置上下须属性# notch=True,#箱子设置缺口# color='white',#箱子不填充 # boxprops = {'color':'red',#箱子外框#           'facecolor':'pink'#箱子填充色#           },#设置箱子属性 # showmeans=True,#箱图显示均值,# meanprops = {'marker':'D','markerfacecolor':'red'},#设置均值属性# meanline=True,#显示均值线# meanprops = {'linestyle':'--','color':'red'},#设置均值线属性 fig = plt.figure(figsize=(6,4))  # 指定绘图对象的宽度和高度 sns.boxplot(train_data['V0'],             orient='v',            showfliers=True,            fliersize=4,             width=0.5,            flierprops={                'marker':'o',                'markerfacecolor':'red',                'color':'write'            },           showcaps=True,           capprops={               'linestyle':'--',               'color':'red'           },            whiskerprops={                'linestyle':'--',                'color':'red'            },            notch=True,#箱子设置缺口            color='white',#箱子不填充            boxprops = {'color':'red',#箱子外框           'facecolor':'pink'#箱子填充色           },#设置箱子属性            showmeans=True,#箱图显示均值,            # meanprops = {'marker':'D','markerfacecolor':'red'},#设置均值属性            meanline=True,#显示均值线            meanprops = {'linestyle':'--','color':'red'},#设置均值线属性           )
  • [技术干货] Python 文本滚动播放器的实现代码
    代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124from tkinter import *import time  import tkinter as tk  file = "待播放文本.txt"text=" "  bgcolor = '#000000'fgcolor = '#FFFFFF'  def getText():    global text    # 读    with open(file, "r",encoding='utf-8') as f:        # 按字节读        text = f.read()    #获取一行getText()root = Tk()# 窗口设定为无边框root.overrideredirect(True)# 窗口前置root.wm_attributes("-topmost", 1)# 窗口属性 透明度设置root.attributes("-alpha", 0.8)# 窗口标题# root.title("文本播放器")# 窗口大小root.geometry("200x35+100+100")# 更新显示文本show_str = StringVar(root)# 初始显示文本show_str.set("双击播放")# 源字符source_str = text# 播放标记playflag = True  # 播放位置pos = 0# 滚动def marquee(widget):    #字符宽度    textwidth = 18    # 源字符长度    strlen = len(source_str)    # 引用全局变量    global pos    # 如果字符长度-播放位置<textwidth    if strlen - pos < textwidth:        # 设定显示的字符串为源字符串的(播放位置,播放位置+文本宽度)+ 源字符串的(0,10-字符串长度+播放位置)        show_str.set(source_str[pos:pos+textwidth] + source_str[0:textwidth - strlen + pos])    else:        # 如果大于textwidth,则播放(播放位置,播放位置+文本宽度)的字符        show_str.set(source_str[pos:pos+textwidth])    #播放位置+1    pos += 1    #如果播放位置大于字符串长度    if pos > strlen:        #播放位置设为0        pos = 0    # 引用全局变量    global stopflag    # 如果当前为播放状态    if playflag:        # 睡眠0.3秒后执行滚动函数        widget.after(300, marquee, widget)         # 创建标签show_lb = Label(root, textvariable=show_str,width=300, fg=fgcolor, bg=bgcolor, text=text, font=("Consolas", 10))# 设定标签位置show_lb.place(x=0, y=0, width=200, height=35)  def doubleClicktoPlay(event):   global playflag   # 播放   playflag = True   marquee(show_lb)  def playStart():   global playflag   # 播放   playflag = True   marquee(show_lb)    def playStop():   global playflag   # 暂停播放   playflag = False  # 创建弹出式菜单menu = tk.Menu(root, tearoff=0)# 为菜单添加命令标签menu.add_command(label="播放", command=playStart) menu.add_command(label="暂停", command=playStop)menu.add_command(label="退出", command=exit)  def popUpMenu(event):        #在鼠标点击的位置弹出菜单        menu.post(event.x_root, event.y_root)  # 为消息事件(按键、点击)绑定函数root.bind_all("<ButtonRelease-3>", popUpMenu)   def moveStart(event):    global startX, startY    #获取鼠标的点击位置的x、y    startX = event.x    startY = event.y  def move(event):     #新坐标=鼠标点击坐标+窗口坐标-初始坐标    new_x = (event.x) + root.winfo_x() - startX    new_y = (event.y) + root.winfo_y() - startY    s = "200x35+" + str(new_x) + "+" + str(new_y)    # 重新设置窗口大小及其位置    root.geometry(s)     # 为消息事件(按键、点击)绑定函数root.bind_all("<Button-1>", moveStart)  root.bind_all("<B1-Motion>", move)root.bind_all("<Double-Button-1>", doubleClicktoPlay) root.mainloop()
  • [<HDC.Cloud...] 【获奖公示】【HDC.Cloud2021】#专家白泽坐堂答疑#当Python遇见人工智能,参与互动赢码豆和精美礼品~
    【奖项公布】最优互动奖1名:23#考过IE励志当攻城狮幸运奖5%2#linghz66615%7#yizhangl25%11#nukinsan35%15#顺延16#ad12344545%20#旧时光里的温柔55%24#外围的小尘埃65%29#nananana75%33#qiaohua85%37#说的很对95%42#holo.yh以上获奖信息公示至5月14日12:00,如有异议请与版主联系。【专家简介】白泽 华为人工智能应用高级讲师【直播简介】     如何在人工智能的浪潮中构建属于自己的AI应用,用便捷的编程方式打开人工智能的大门,接轨当下最流行技术圈层?快来观看直播吧!还可赢放送礼包哦~ 【直播时间】2021年4月26日19:00-20:30直播链接:https://bbs.huaweicloud.com/live/edu_live/202104261900.html 【互动方式】直播前您可以在本帖留下您感兴趣的问题,专家会在直播时为您解答。直播后您可以继续在本帖留言,与专家互动交流,我们会在全部活动结束后对参与互动的用户进行抽奖。 【活动时间】4月26日—5月9日  【奖励说明】1.最优互动奖1名:评奖规则:由专家在所有参与本帖互动的开发者选出1名最优互动进行奖励奖品:智能床头灯1个 2.幸运奖评奖规则在活动结束后(截止5月9日),在本帖所有盖楼的用户中抽取获奖楼层,获奖楼层=总楼层*中奖百分比,中奖百分比为5%、15%、25%、35%、45%、55%、65%、75%、85%、95%。例如:活动结束后总楼层为500,500*5%=25,即第25楼获奖,其他获奖楼层同理可得。如出现小数点,则四舍五入,例如:活动结束后总楼层为530,530*5%=26.5,即第27楼获奖。无效楼层不参与中奖,做顺延处理,例如:抽取获奖楼层为第5楼,但5楼为无效楼层,即顺延至第6楼获奖,若依然为无效楼层,则继续顺延,以此类推,请勿连续刷楼超过5层或回复无关内容,否则视为无效。奖品:每人奖励6000码豆。 【注意事项】1、为保证您顺利领取活动奖品,请您提前填写奖品收货信息,如您没有填写,视为放弃奖励【点击此处填写信息】。2、活动获奖信息填写时间截止2021年5月9日,如未填写视为弃奖。本次先发活动奖品将于2021年5月31日前统一发出,请您耐心等待。3、本次活动幸运奖将采用巨公摇号平台(https://www.jugong.wang/random-portal/)进行抽取,话题质量相关奖项将由华为云社区工作人员进行评选,如您对评奖方式有异议,请勿参加本次活动。4、如活动奖品出现没有库存的情况,华为云工作人员将会替换等价值的奖品,获奖者不同意此规则视为放弃奖品。5、其他事宜请参考【华为云社区常规活动规则】。 
  • [技术干货] python类的继承链实例分析
    1、子类可以继承父类,同样,父类也可以继承自己的父类,一层一层地继承。123456789class A:def have(self):print('I hava an apple')  class B(A):pass  class C(B):pass2、如果想判断一个类别是否是另一个类别的子类别,可以使用内置函数issubclass()。123456>>> issubclass(C, A)True>>> issubclass(B, A)True>>> issubclass(C, B)True知识点扩展:继承的定义12345678910111213141516171819class Person(object):   # 定义一个父类      def talk(self):    # 父类中的方法        print("person is talking....")      class Chinese(Person):    # 定义一个子类, 继承Person类      def walk(self):      # 在子类中定义其自身的方法        print('is walking...')  c = Chinese()c.talk()      # 调用继承的Person类的方法c.walk()     # 调用本身的方法  # 输出  person is talking....is walking...构造函数的继承 12345678910111213141516171819202122232425class Person(object):      def __init__(self, name, age):        self.name = name        self.age = age        self.weight = 'weight'      def talk(self):        print("person is talking....")    class Chinese(Person):      def __init__(self, name, age, language):  # 先继承,在重构        Person.__init__(self, name, age)  #继承父类的构造方法,也可以写成:super(Chinese,self).__init__(name,age)        self.language = language    # 定义类的本身属性      def walk(self):        print('is walking...')    class American(Person):    pass  c = Chinese('bigberg', 22, 'Chinese')
  • [软件平台] 如何实现python调用mdc中UART接口的GPS数据和CAN接口的整车数据?
    【功能模块】python开发UATR和CAN【操作步骤&问题现象】1、python调用UART接口中的GPS数据时,不知道port该怎样写。并且GPS已经留出了UART的硬件接口,现在需要python程序开发支持2、用candump寻找CAN时,找不到信息,并写用python2调用CAN信息时,找不到接口,也安装不上python-can包【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] python实战 之猜数字
    一、导入库12import randomimport time 二、注册用户我们用变量与input实现12name = str(input('请输入用户名:'))print('欢迎您,'+name) 三、注册年龄这里我们得用except制作乱输文本就游戏结束的程序乱输文本就结束12345try:    age = int(input('请输入年龄:'))except ValueError:    print('非法输入')    age = 30000顺便把年龄设为30000[滑稽]再根据年龄大小分配金币 四、分配金币123456789101112if age <10:    gold = 500    print('您的初始金币为500')if age <20 and age >10:    gold = 1000    print('您的初始金币为1000')if age >20 and age <30:    gold = 1500    print('您的初始金币为1500')if age >30 and age <1000:    gold = 200    print('年龄过大,您的初始金币为200')用if语句保证金币小于10000,如果等于10000,游戏结束 五、if判断 1123if gold !=10000:    Game_start = str(input('是否开始游戏?(True或False)'))    while gold !=10000:接下来就是最重要的游戏部分了,认真!我们还得用if语句判断Game_start变量为True,并创建一个随机数列表 六、if与随机数1234if Game_start =='True':    list_123 = [random.randint(1,6),random.randint(1,6),random.randint(1,6),]    while list_123 ==10:        list_123 = [random.randint(1,6),random.randint(1,6),random.randint(1,6),]然后设定回答变量和正确答案与错误答案 七、回答、正确与错误1234567answer = str(input('请猜数(big或small):'))if list_123[0] + list_123[1] + list_123[2] >10:    result = 'big'    error_result = 'small'if list_123[0] + list_123[1] + list_123[2] <10:    result = 'small'    error_result = 'big'还得用if语句判断正确、错误与非法输入的答案 八、if判断 212345678910111213if answer ==result:    print('您赢了!')    gold = gold + 100    print('随机数为'+str(list_123))    print('您现在有'+str(gold)+'金币')elif answer ==error_result:    print('您输了...')    print('随机数为'+str(list_123))    gold = gold - 100    print('您现在有'+str(gold)+'金币')else:    print('非法输入')    gold = 10000再制作购买道具的模块太长了我懒得写一句一句解析 九、购买道具123456789101112131415161718192021222324252627282930if gold ==2000 or gold ==3000 or gold ==4000 or gold ==5000 or gold ==6000 or gold ==7000 or gold ==8000 or gold ==9000:    answer = str(input('您现在可以购买道具,是否购买?(True或False):'))    if answer =='True':        print('请说出要购买der道具')        print('*'*41)        print('*金币翻倍器[现有的]   金币翻倍器[得到的]*')        print('*     2000G                  1500G      *')        print('*'*41)        answer = str(input('请说出要购买der道具(金币翻倍器[现有的]说1,金币翻倍器[得到的]说2):'))        if gold >2000 and answer =='1':            gold = gold - 2000            answer = int(input('请说出要翻der倍数:'))            gold = str(gold * answer)            print('您现在有'+gold+'金币')            gold = int(gold)        elif gold >1500 and answer =='2':            gold = gold - 1500            answer = int(input('请说出要翻der倍数:'))            gold_mang = 100 * answer            gold = gold + gold_mang            print('您现在有'+str(gold)+'金币')            gold = int(gold)            else:                print('没有这个道具,游戏结束')                gold = 10000            elif answer =='False':                print('继续游戏')            else:                print('非法输入')                gold = 10000我写到一半发现没有把上面的桥接上,所以现在来桥接 十、桥接12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879import randomimport timename = str(input('请输入用户名:'))print('欢迎您,'+name)try:    age = int(input('请输入年龄:'))except ValueError:    print('非法输入')    age = 30000    gold = 10000if age <10:    gold = 500    print('您的初始金币为500')if age <20 and age >10:    gold = 1000    print('您的初始金币为1000')if age >20 and age <30:    gold = 1500    print('您的初始金币为1500')if age >30 and age <1000:    gold = 200    print('年龄过大,您的初始金币为200')if gold !=10000:    Game_start = str(input('是否开始游戏?(True或False)'))    while gold !=10000:        if Game_start =='True':            list_123 = [random.randint(1,6),random.randint(1,6),random.randint(1,6),]            while list_123 ==10:                list_123 = [random.randint(1,6),random.randint(1,6),random.randint(1,6),]            answer = str(input('请猜数(big或small):'))            if list_123[0] + list_123[1] + list_123[2] >10:                result = 'big'                error_result = 'small'            if list_123[0] + list_123[1] + list_123[2] <10:                result = 'small'                error_result = 'big'            if answer ==result:                print('您赢了!')                gold = gold + 100                print('随机数为'+str(list_123))                print('您现在有'+str(gold)+'金币')            elif answer ==error_result:                print('您输了...')                print('随机数为'+str(list_123))                gold = gold - 100                print('您现在有'+str(gold)+'金币')            else:                print('非法输入')                gold = 10000            if gold ==2000 or gold ==3000 or gold ==4000 or gold ==5000 or gold ==6000 or gold ==7000 or gold ==8000 or gold ==9000:                answer = str(input('您现在可以购买道具,是否购买?(True或False):'))                if answer =='True':                    print('请说出要购买der道具')                    print('*'*41)                    print('*金币翻倍器[现有的]   金币翻倍器[得到的]*')                    print('*     2000G                  1500G      *')                    print('*'*41)                    answer = str(input('请说出要购买der道具(金币翻倍器[现有的]说1,金币翻倍器[得到的]说2):'))                    if gold >2000 and answer =='1':                        gold = gold - 2000                        answer = int(input('请说出要翻der倍数:'))                        gold = str(gold * answer)                        print('您现在有'+gold+'金币')                        gold = int(gold)                    elif gold >1500 and answer =='2':                        gold = gold - 1500                        answer = int(input('请说出要翻der倍数:'))                        gold_mang = 100 * answer                        gold = gold + gold_mang                        print('您现在有'+str(gold)+'金币')                        gold = int(gold)                    else:                        print('没有这个道具,游戏结束')                        gold = 10000                elif answer =='False':                    print('继续游戏')                else:                    print('非法输入')                    gold = 10000其实到这里我们就基本完成了,但如果只写到这里会有很多bug,不想看了也可以就玩这个版本还剩了一些代码,我也懒得写了,直接完整代码 十一、完整代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990import randomimport timename = str(input('请输入用户名:'))print('欢迎您,'+name)try:    age = int(input('请输入年龄:'))except ValueError:    print('非法输入')    age = 30000    gold = 10000if age <10:    gold = 500    print('您的初始金币为500')if age <20 and age >10:    gold = 1000    print('您的初始金币为1000')if age >20 and age <30:    gold = 1500    print('您的初始金币为1500')if age >30 and age <1000:    gold = 200    print('年龄过大,您的初始金币为200')if gold !=10000:    Game_start = str(input('是否开始游戏?(True或False)'))    while gold !=10000:        if Game_start =='True':            list_123 = [random.randint(1,6),random.randint(1,6),random.randint(1,6),]            while list_123 ==10:                list_123 = [random.randint(1,6),random.randint(1,6),random.randint(1,6),]            answer = str(input('请猜数(big或small):'))            if list_123[0] + list_123[1] + list_123[2] >10:                result = 'big'                error_result = 'small'            if list_123[0] + list_123[1] + list_123[2] <10:                result = 'small'                error_result = 'big'            if answer ==result:                print('您赢了!')                gold = gold + 100                print('随机数为'+str(list_123))                print('您现在有'+str(gold)+'金币')            elif answer ==error_result:                print('您输了...')                print('随机数为'+str(list_123))                gold = gold - 100                print('您现在有'+str(gold)+'金币')            else:                print('非法输入')                gold = 10000            if gold ==2000 or gold ==3000 or gold ==4000 or gold ==5000 or gold ==6000 or gold ==7000 or gold ==8000 or gold ==9000:                answer = str(input('您现在可以购买道具,是否购买?(True或False):'))                if answer =='True':                    print('请说出要购买der道具')                    print('*'*41)                    print('*金币翻倍器[现有的]   金币翻倍器[得到的]*')                    print('*     2000G                  1500G      *')                    print('*'*41)                    answer = str(input('请说出要购买der道具(金币翻倍器[现有的]说1,金币翻倍器[得到的]说2):'))                    if gold >2000 and answer =='1':                        gold = gold - 2000                        answer = int(input('请说出要翻der倍数:'))                        gold = str(gold * answer)                        print('您现在有'+gold+'金币')                        gold = int(gold)                    elif gold >1500 and answer =='2':                        gold = gold - 1500                        answer = int(input('请说出要翻der倍数:'))                        gold_mang = 100 * answer                        gold = gold + gold_mang                        print('您现在有'+str(gold)+'金币')                        gold = int(gold)                    else:                        print('没有这个道具,游戏结束')                        gold = 10000                elif answer =='False':                    print('继续游戏')                else:                    print('非法输入')                    gold = 10000            if gold ==0:                print('金币没了,游戏结束')                gold = 10000        elif Game_start =='False':            print('欢迎游玩,下次再见!')            gold = 10000        else:            print('非法输入')            gold = 10000print('游戏结束,再见!')time.sleep(10)
  • [技术干货] python入门之算法学习
    实现二分查找的python代码如下:12345678910111213def binary_search(list, item):    low = 0 #最低位索引位置为0    high = len(list)- 1 #最高位索引位置为总长度-1    while low <= high:         mid = (low + high)//2 #检查中间的元素,书上是一条斜杠,我试过加两条斜杠才行        guess = list[mid]#python自动圆整        if guess == item:  #找到了元素            return mid        if guess > item:  #猜的数字大了,就修改high            high = mid - 1        else:            #猜的数字小了,就修改low            low = mid + 1    return None   #没有指定的元素测试代码:123456789101112>>> if __name__ == "__main__":#我试过加上好用     my_list=[1,3,5,7,9]     print (binary_search(my_list,3))#把binary_search也加上括号       1#表示3的索引位置为1>>> if __name__ == "__main__":     my_list=[1,3,5,7,9]     print (binary_search(my_list,0))       None#表示0不在列表中实现选择排序的python代码如下:123456789101112131415def findSmallest(arr):    smallest = arr[0]     smallest_index =0    for i in range(1,len(arr)):        if arr[i] < smallest:            smallest = arr[i]            smallest_index= i    return smallest_index def selectionSort(arr):    newArr = []    for i in range(len(arr)):        smallest = findSmallest(arr)        newArr.append(arr.pop(smallest))      return newArr测试代码:12345678910111213141516#样式1,把selcetionSort()作为新的值给arr,打印arr>>> number=[5,3,6,2,10]>>> arr=selectionSort(number)>>> arr[2, 3, 5, 6, 10]#样式2,加上if __name__ == '__main__':(我也不知道啥作用)>>> if __name__ == '__main__':    number=[5,3,6,2,10]    print(selectionSort(number))      [2, 3, 5, 6, 10]#样式3,直接输出,最简洁>>> number=[5,3,6,2,10]>>> print(selectionSort(number))[2, 3, 5, 6, 10]
  • [技术干货] python获取淘宝服务器时间的代码示例
    然但是,这个只能获取到秒,没法到毫秒。我暂时不知道该咋解决代码123456789101112131415161718import requestsimport time while True:    class timeTaobao(object):        r1 = requests.get(url='http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp',                      headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4098.3 Safari/537.36'})        x = eval(r1.text)        timeNum = int(x['data']['t'])         def funcname():            timeStamp = float(timeTaobao.timeNum/1000)            timeArray = time.localtime(timeStamp)            otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)            return otherStyleTime     t = timeTaobao.funcname()    print(t)结果2021-04-20 15:30:042021-04-20 15:30:042021-04-20 15:30:042021-04-20 15:30:042021-04-20 15:30:042021-04-20 15:30:052021-04-20 15:30:052021-04-20 15:30:052021-04-20 15:30:052021-04-20 15:30:052021-04-20 15:30:05补充:【Python】获取服务器时间import http.clientimport timeimport osdef get_webservertime(host):    conn=http.client.HTTPConnection(host)    conn.request("GET", "/")    r=conn.getresponse()    #r.getheaders() #获取所有的http头    ts=  r.getheader('date') #获取http头date部分    print(ts)          #将GMT时间转换成北京时间    ltime= time.strptime(ts[5:25], "%d %b %Y %H:%M:%S")    print(ltime)    ttime=time.localtime(time.mktime(ltime)+8*60*60)    print(ttime)    dat="%u-%02u-%02u"%(ttime.tm_year,ttime.tm_mon,ttime.tm_mday)    tm="%02u:%02u:%02u"%(ttime.tm_hour,ttime.tm_min,ttime.tm_sec)    print (dat,tm)    os.system(dat)    os.system(tm)      get_webservertime('www.jd.com')12345678910111213141516171819import urllib.requestimport time def get_webservertime(url):   #返回一个对象    response=urllib.request.urlopen(url)    #打印出远程服务器返回的header信息    #print (response.info())    header=response.info()       ts=header._headers[1][1]          #将GMT时间转换成北京时间    ltime= time.strptime(ts[5:25], "%d %b %Y %H:%M:%S")    ttime=time.localtime(time.mktime(ltime)+8*60*60)    dat="%u-%02u-%02u"%(ttime.tm_year,ttime.tm_mon,ttime.tm_mday)    tm="%02u:%02u:%02u"%(ttime.tm_hour,ttime.tm_min,ttime.tm_sec)    print (dat,tm)   get_webservertime('https://www.jd.com/')12345678910111213141516171819202122232425import http.clientimport timedef get_webservertime(host):    while True:        try:            conn=http.client.HTTPConnection(host)            conn.request("GET", "/")            r=conn.getresponse()            ts=  r.getheader('date') #获取http头date部分            break        except Exception as e:            print(e)            continue    #将GMT时间转换成北京时间    ltime= time.strptime(ts[5:25], "%d %b %Y %H:%M:%S")    ttime=time.localtime(time.mktime(ltime)+8*60*60)    dat="%u-%02u-%02u"%(ttime.tm_year,ttime.tm_mon,ttime.tm_mday)    tm="%02u:%02u:%02u"%(ttime.tm_hour,ttime.tm_min,ttime.tm_sec)    timeStr=dat+' '+tm    return timeStr            url='www.jd.com'while True:    print(get_webservertime(url))  123456789101112131415161718192021def get_webservertime():    url='https://ai.jd.com/jdip/useripinfo.php?callback=jsonpCallbackUserIpInfo'    while True:        try:            response=urllib.request.urlopen(url)            header=response.info()            break        except Exception as e:            print(e)            time.sleep(1)            continue               #打印出远程服务器返回的header信息    ts=header._headers[1][1]    #将GMT时间转换成北京时间    ltime= time.strptime(ts[5:25], "%d %b %Y %H:%M:%S")    ttime=time.localtime(time.mktime(ltime)+8*60*60)    dat="%u-%02u-%02u"%(ttime.tm_year,ttime.tm_mon,ttime.tm_mday)    tm="%02u:%02u:%02u"%(ttime.tm_hour,ttime.tm_min,ttime.tm_sec)    timeStr=dat+' '+tm    return timeStr
  • [技术干货] python分数实例用法
    1、说明分数实现了一个合理的对象。清楚地保留了一个分子和一个分母,从而避免了浮点数学的一些不准确性和局限性。一旦创建分数,它可以像往常一样用于数学表达式。2、实例123456>>> x + yFraction(1,1)>>> x - y  # Results are exact: numerator,denominatorFraction(-1,3)>>> x * yFraction(2,9)内容扩展Fraction类在Lib/fractions.py文件中,所以可以这样导入: 1from fractions import Fraction有很多种实例化Fraction类的方法。首先,你可以传入分子和分母: 12>>> Fraction(1, 2)Fraction(1, 2)或者利用另一个分数进行实例化: 123>>> f = Fraction(1, 2)>>> Fraction(f)Fraction(1, 2)使用一个浮点数进行实例化: 12>>> Fraction(2.5)Fraction(5, 2)或者使用一个 decimal: 123>>> from decimal import Decimal>>> Fraction(Decimal('1.1'))Fraction(11, 10)最后一种方法,可能是最有趣的一种方法,你可以使用一个字符串实例化Fraction类: 12>>> Fraction('9/16')Fraction(9, 16)
  • [技术干货] 使用Python对SQLite数据库操作
    QLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在IOS和Android的APP中都可以集成。Python内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。在使用SQLite前,我们先要搞清楚几个概念:表是数据库中存放关系数据的集合,一个数据库里面通常都包含多个表,比如学生的表,班级的表,学校的表,等等。表和表之间通过外键关联。要操作关系数据库,首先要连接到数据库,一个数据库连接称为Connection。连接到数据库后,需要打开游标,称之为Cursor,通过Cursor执行SQL语句,然后,获得执行结果。一、连接数据库import sqlite3 #数据库名 db_name = "test.db" #表名 table_name = "catalog" conn = sqlite3.connect(db_name)二、打开游标rs = conn.cursor()三、建表sql = 'create table ' + table_name + ' (id varchar(20) primary key, pid integer, name varchar(10))' try: rs.execute(sql) print("建表成功") except: print("建表失败")四、增,删,改,查操作# 增:增加三条记录 sql = "Insert into " + table_name + " values ('001', 1, '张三')" try: rs.execute(sql) #提交事务 conn.commit() print("插入成功") except: print("插入失败") sql = "Insert into " + table_name + " values ('002', 2, '李四')" try: rs.execute(sql) #提交事务 conn.commit() print("插入成功") except: print("插入失败") sql = "Insert into " + table_name + " values ('003', 3, '王五')" try: rs.execute(sql) #提交事务 conn.commit() print("插入成功") except: print("插入失败") # 删:删除pid等于3的记录 sql = "Delete from " + table_name + " where pid = 3" try: rs.execute(sql) conn.commit() print("删除成功") except: print("删除失败") # 改:将pid等于2的记录的pid改为1 sql = "Update " + table_name + " set pid = 1 where pid = 2" try: rs.execute(sql) conn.commit() print("修改成功") except: print("修改失败") # 查 # 查询数据库中所有表名 sql = "Select name From sqlite_master where type = 'table'" res = rs.execute(sql) print(res.fetchall()) # 查询表中所有记录 sql = "Select * from " + table_name try: res = rs.execute(sql) print(res.fetchall()) except: print([])五、关闭游标rs.close()六、关闭数据库连接conn.close()
  • [技术干货] python 连接sqlite及简单操作
    直接给大家贴代码了,具体代码如下所示:import sqlite3 #查询 def load(table): #连接数据库 con = sqlite3.connect("E:/Datebase/SQLiteStudio/Park.db") #获得游标 cur = con.cursor() #查询整个表 cur.execute('select *from '+table) lists = ['name','password'] if table == 'login': #将数据库列名存入字典 colnames = {desc[0] for desc in cur.description} 将字典和数据库的数据一起存入列表,获得了记录字典 rowdicts = [dict(zip(lists, row)) for row in cur.fetchall()] else: rowdicts = [] for row in cur: rowdicts.append(row) con.commit() cur.close() return rowdicts #插入数据 def insert_data(ID,name,money): con = sqlite3.connect("E:/Datebase/SQLiteStudio/Park.db") cur = con.cursor() #使用SQL语句插入 cur.execute('insert into Charge values (?,?,?)', (ID,name, money)) #插入后进行整表查询,看是否成功插入 cur.execute('select *from Charge') print(cur.fetchall()) con.commit() cur.close()
  • [技术干货] 看看如何用Python绘制小米新版天价logo声明:(仅限于技术交流)
    声明:(仅限于技术交流)最终呈现效果哈哈,咋们在讲述之前,首先看看最终呈现的效果吧,整体来说还是很不错的。 小米 “新” logo背后的数学前段时间,小米公司发布了一条微博,引发了热议,原来小米换了新logo了。很多人,都觉得雷总被骗了。说实话,我当时猛的一看,也是很蒙蔽,可能咋们不懂美学,不懂新logo背后蕴藏的文化底蕴吧!但是,原设计者原研哉说到:最新设计的小米logo,融入了东方哲学的思考,从而提出了一个具有「超椭圆」数学之美的小米新 LOGO,同时还增加了黑色和科技银来作为小米品牌色彩的新搭档。原研哉还说到:在验证的过程中,用到了一个数学公式。从上面的公式可以看到,这里有一个n,因此可以知道:上述公式能够绘制出n种类型的超椭圆。而设计者最终推荐使用n=3这一形状。Python绘制新logo流程① 绘图原理在正式绘图之前,我们先来讲述一下Python绘制新logo的“绘图原理”。掌握了原理后,剩下的问题就交给代码吧。① 利用 “超椭圆” 公式,绘制一个带填充色的椭圆;② 遍历 “旧logo” 上的像素值,保留白色 “米字” 处的像素值;③ 将带“米字” 的像素值,写入第一步的超椭圆中;② 重要知识点的普及关于整个代码,有几个函数需要给大家提一下,为了大家更够很快学习。但是不会讲解的很详细,大家可以根据说明,自行下去查阅相关资料。① plt.fill():用于给图形填充颜色;② plt.axis():用于打开/取消坐标轴展示;③ plt.subplots_adjust()和plt.margins():用于去掉图形外侧多余的留白;④ image.getpixel():用于读取图片的像素值;⑤ image.putpixel():用于在指定坐标位置处,写入像素值;③ 上代码首先我们先导入相关库:123import matplotlib.pyplot as pltimport numpy as npfrom PIL import Image接着,利用上面 提到的公式,绘制一个不留白的n=3的超椭圆。12345678910111213x = np.linspace(-1, 1, 1000)y = + pow(1-abs(pow(x, 3)), 1/3) # 注意公式的写法z = - pow(1-abs(pow(x, 3)), 1/3) # 注意公式的写法plt.figure(figsize=(12, 12)) # 画布大小 plt.plot(x, y, color=(255/255, 103/255, 0))plt.plot(x, z, color=(255/255, 103/255, 0))plt.fill(x, y, color=(255/255, 103/255, 0)) # 填充颜色plt.fill(x, z, color=(255/255, 103/255, 0)) # 填充颜色plt.axis('off') # 不显示坐标轴plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)plt.margins(0, 0)plt.savefig('fill.png', transparent=True, dpi=100) # 设置保存图片的透明值然后,遍历旧logo的像素值,保留 “米字” 那一块儿。将该像素值,写入上面的 “fill.png” 中。有一点需要注意的是:白色的rgb值是255, 255, 255。123456789101112image_1 = Image.open('old.png')image_2 = Image.open('fill.png') w, h = image_1.size for i in range(w):    for j in range(h):        data = image_1.getpixel((i, j))        if data == (255,)*4:            image_2.putpixel((i, j), (255,)*4) image_2.save('new.png') 获取资源以上图片和代码,均已打包,大家可以自由获取哦!链接:https://pan.baidu.com/s/1K1Kjmwnsj8NFtZRqWbZW6g提取码:deoy
  • [技术干货] 教你几步骤搞定python装饰器
    四、装饰器实现一个计算函数执行时间的函数作为装饰器,用来计算被装饰函数的执行时间并打印123456789101112131415161718192021222324252627import time  def timer(func):  # 实现一个计算函数执行时间的函数作为装饰器,用来计算被装饰函数的执行时间并打出    def wrapper():        start_time = time.time()        func()        stop_time = time.time()        print("运行时间: %s" % (stop_time - start_time))    return wrapper  # def test():  # 不使用装饰器的同等实现#     time.sleep(3)#     print("test sleep 3s")## test = timer(test)  # 返回的是 wrapper 的地址# test()  # 执行的是 wrapper    @timerdef test():  # 装饰器的实现    time.sleep(3)    print("test sleep 3s")  test()  # 执行的是 wrapper# 结果:#     test sleep 3s#     运行时间: 3.000915050506592 4.1 被装饰方法带返回值12345678910111213141516171819202122232425import time    def timer(func):    def wrapper():        start_time = time.time()        res = func()  # 执行被装饰方法        stop_time = time.time()        print("运行时间: %s" % (stop_time - start_time))        return res  # 接受正在调用的方法的返回值,并返回    return wrapper    @timerdef test():    time.sleep(3)    print("test sleep 3s")    return "test return ok"    print(test())  # 执行的是 wrapper# 结果:#     test sleep 3s#     运行时间: 3.0002923011779785#     test return ok 4.2 被装饰方法带参数123456789101112131415161718192021222324252627282930import time    def timer(func):    """        *args:将被修饰方法传入的非关键字参数打包为元组 args        **kwargs: 将被修饰方法传入的关键字参数打包为字典 kwargs    """    def wrapper(*args, **kwargs):        start_time = time.time()        res = func(*args, **kwargs)  # *args 拆解元组,按顺序传给被修饰函数; **kwargs:拆解字典        stop_time = time.time()        print("运行时间: %s" % (stop_time - start_time))        return res    return wrapper    @timer  # 给test 方法添加计算执行时间的装饰器def test(name, age):    time.sleep(3)    print("name = {}, age = {}".format(name, age))    return "test return ok"    # 调用被装饰器装饰的方法print(test("xu", 100))  # 执行的是 wrapper# 结果:#     name = xu, age = 100#     运行时间: 3.000420331954956#     test return ok 4.3 验证功能装饰器假如 index() 、home()、shopping_car() 三个方法都需要登录后才能访问(无法访问时里面不输入对应内容),正常情况下只需登录一次,后面访问其他方法就无需再次登录。可以通过@auth_fun装饰器进行验证用户是否登录,如果没有就让用户输入账号密码,用户账号密码正确的记录当前登录的用户,其他方法无需再次登录。12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455# 用户列表user_list = [    {'name': 'xu1', 'passwd': '123'},    {'name': 'xu2', 'passwd': '123'},    {'name': 'xu3', 'passwd': '123'},    {'name': 'xu4', 'passwd': '123'},]# 当前登录的用户current_dic = {"username": None, "login": False}    # 验证用户是否登录的装饰器#   如果用户没有登录,让用户输入账号密码,校验通过记录用户状态def auth_fun(func):    def wrapper(*args, **kwargs):        if current_dic["username"] and current_dic['login']:            res = func(*args, **kwargs)            return res        username = input("请输入用户名:")        pw = input("请输入密码:")        for u in user_list:            if u["name"] == username and u["passwd"] == pw:                current_dic["username"] = username                current_dic["login"] = True                res = func(*args, **kwargs)                return res        else:            print("用户没有注册!")    return wrapper    @auth_fundef index():    print("this is index")    @auth_fundef home():    print("this is home page")    @auth_fundef shopping_car():    print("this is shopping car")    index()  # 输入用户密码home()  # index 已经登录,无需在输入shopping_car()  # index 已经登录,无需在输入# 结果:#     请输入用户名:xu1#     请输入密码:123#     this is index#     this is home page#     this is shopping car 4.4 验证功能装饰器——带参数 装饰器带参数,最简单的操作就是可以对被装饰的函数进行区别处理。12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273# 用户列表user_list = [    {'name': 'xu1', 'passwd': '123'},    {'name': 'xu2', 'passwd': '123'},    {'name': 'xu3', 'passwd': '123'},    {'name': 'xu4', 'passwd': '123'},]# 当前登录的用户current_dic = {"username": None, "login": False}  """    注意:带参数的装饰器会比没有带参数的装饰器多嵌套一层函数(多了auth)        调用方式是 @auth(auth_type="type1"), 返回 auth_fun,        也就是说 @auth(auth_type="type1")相当于 @auth_fun        但是 auth_fun 函数所在的嵌套作用域多了一个 auth_type 的变量"""def auth(auth_type="type1"):    def auth_fun(func):        def wrapper(*args, **kwargs):            if auth_type == "type1":                if current_dic["username"] and current_dic['login']:                    res = func(*args, **kwargs)                    return res                username = input("请输入用户名:")                pw = input("请输入密码:")                for u in user_list:                    if u["name"] == username and u["passwd"] == pw:                        current_dic["username"] = username                        current_dic["login"] = True                        res = func(*args, **kwargs)                        return res                else:                    print("用户没有注册!")            elif auth_type == "type2":                print("不用授权直接登录: type = {}".format(auth_type))                res = func(*args, **kwargs)                return res            else:                print("其他type没有实现")        return wrapper    return auth_fun    """    auth_fun = @auth(auth_type="type1")     auth_fun 所在的嵌套与将有一个 auth_type 变量    然后通过 @auth()方法返回的对象注解 index,相当于 @auth_fun 注解index 方法,最后得到 wrapper 对象"""@auth(auth_type="type1")def index():    print("this is index")    @auth(auth_type="type2")def home():    print("this is home page")    @auth(auth_type="type3")def shopping_car():    print("this is shopping car")    home()  # 注意:auth_type="type2",这个方法无需登录可以直接执行index()  # 注意:auth_type="type1",需要登录shopping_car()  # 注意:auth_type="type3",没有做处理# 结果:#     不用授权直接登录: type = type2#     this is home page#     请输入用户名:xu1#     请输入密码:123#     this is index#     其他type没有实现
总条数:2474 到第 页
上滑加载中