# 1、整理装饰器的形成过程,背诵装饰器的固定格式
'''
def wrapper(f):
def inner(*args,**kwargs):
"""被装饰前的操作"""
ret = f(*args,**kwargs)
"""被装饰后的操作"""
return ret
return inner
'''
# 2、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,
# 后续的函数都无需再输入用户名和密码
'''
flag = False
def wrapper(f):
def inner(*args,**kwargs):
"""被装饰前的操作"""
global flag
if flag:
f(*args, **kwargs)
else:
with open("用户账户信息", encoding="utf-8") as f1:
li_msg = f1.read().split()
count = 0
while count < 3:
username = input("请输入账号:").strip()
password = input("请输入密码:").strip()
if username == li_msg[0] and password == li_msg[1]:
print("登录成功!")
f(*args, **kwargs)
flag = True
break
else:
print("登录失败请重试,您还有{}次机会!".format(2 - count))
count += 1
"""被装饰后的操作"""
return inner
@wrapper #aritcle = wrapper(article)
def article():
print("欢迎浏览文章页面!")
@wrapper
def diary():
print("欢迎浏览日记页面!")
@wrapper
def comment():
print("欢迎浏览评论页面!")
article()
diary()
comment()
'''
# 3、编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果(升级题)
'''
from urllib.request import urlopen
def index(url):
def get():
return urlopen(url).read()
return get
qi_dian = index("https://www.qidian.com/")
content = qi_dian()
print(content)
'''
# 3.1.为题目3编写装饰器,实现缓存网页内容的功能:(升级题)
# 具体:实现下载的页面存放于文件中,如果网页有对应的缓存文件,就优先从文件中读取网页内容,否则,就去下载,然后存到文件中
"""
from urllib.request import urlopen
def index(f): #f = func1
def save(*args):
content = f(*args)
with open("网页内容存储",mode=("w+b")) as f1:
f1.write(content)
return save
@index # get = index(get)
def get(url):
return urlopen(url).read()
get("https://www.qidian.com/")
"""
# 4.写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组
# 例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃’,‘A’)]
'''
def playing_card():
list_card = []
colours = ["红桃", "黑桃", "梅花", "方块"]
numbers = ["A", 2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K"]
for colour in colours:
for number in numbers:
list_card.append((colour,number))
return list_card
print(playing_card())
'''
# 5.写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}
# 例如:min_max(2,5,7,8,4)
# 返回:{‘max’:8,’min’:2}
'''
def min_max(*args):
li = list(args)
li.sort()
dic = {"min":li[0],"max":li[-1]}
return dic
print(min_max(2, 5, 7, 19, 8, 4, 1))
'''
# 6.写函数,专门计算图形的面积
# 其中嵌套函数,计算圆的面积,正方形的面积和长方形的面积
# 调用函数area(‘圆形’,圆半径) 返回圆的面积
# 调用函数area(‘正方形’,边长) 返回正方形的面积
# 调用函数area(‘长方形’,长,宽) 返回长方形的面积
# def area():
# def 计算长方形面积():
# pass
#
# def 计算正方形面积():
# pass
#
# def 计算圆形面积():
# pass
'''
def area(*args):
def rectangle(*args):
return args[1] * args[-1]
def square(*args):
return args[1]**2
def circle(*args):
import math
return math.pi*(args[1]**2)
if args[0] == "长方形":
return rectangle(*args)
elif args[0] == "正方形":
return square(*args)
elif args[0] == "圆形":
return circle(*args)
else:
return "输入有误,请检查!"
print(area("长方形",3,5))
print(area("正方形",5))
print(area("圆形",2))
print(area("三角形",3,4))
'''
# 7.写函数,传入一个参数n,返回n的阶乘
# 例如:cal(7)
# 计算7*6*5*4*3*2*1
'''
def cal(n): #n=4
factorial = n #fa = 4
for i in range(n, 1, -1): # i = 4 #i = 3 # i = 2
factorial = factorial * (i - 1) # fa = 4 * (4 - 1) # fa = 4 * (4 - 1) * (3 - 1) #fa = 4 * (4 - 1) * (3 - 1) * (2 -1)
return factorial
print(cal(4))
'''
# 8、用面向函数的思想完成购物车作业(升级题)
# 函数一:实现三次登陆功能
# 函数二:实现新用户注册功能
# 函数三:购物功能
# 进阶任务:将购物功能拆分成多个函数
'''
def register():
"""注册函数"""
global flag
flag = True
l1_username = []
f1 = open("第八题用户账户信息",encoding="utf-8")
for line in f1:
v1,v2 = line.split()
l1_username.append(v1)
f1.close()
print("欢迎注册!")
while flag:
username = input("请输入账号名称:").strip()
if username in l1_username:
print("{}已被使用,请重新输入!".format(username))
else:
while flag:
password = input("请输入密码:").strip()
password1 = input("请确认密码:").strip()
if password1 == password:
print("恭喜您,注册成功!欢迎进入!")
f2 = open("第八题用户账户信息", encoding="utf-8", mode="a")
f2.write("\n{} {}".format(username,password))
f2.close()
flag = False
else:
print("两次密码不一致,请检测并重新输入!")
def login():
"""登陆函数"""
f1 = open("第八题用户账户信息",encoding="utf-8")
li_msg = []
for line in f1:
dic = {}
v1,v2 = line.split()
dic[v1] = v2
li_msg.append(dic)
f1.close()
print("欢迎登录!")
i = 0
while i < 3:
dic_msg = {}
username = input("请输入账号名称:").strip()
password = input("请输入密码:").strip()
dic_msg[username] = password
if dic_msg in li_msg:
print("登录成功!")
break
else:
if i == 2:
select = input("您已用完三次输入机会,是否选择再输入三次:Y\\N")
if select == "Y":
i = 0
continue
else:
msg = "用户名或密码错误,您还有{}次重输机会!".format(2 - i)
print(msg)
i += 1
else:
print("择日再来吧!")
def commodity_list():
"""商品清单打印"""
f1 = open("商品清单",encoding="utf-8")
f1.readline()
global commodity_dic
global commodity_lis
commodity_dic = {} #{'手机': '2000', '电脑': '5000', '鼠标垫': '100', '游艇': '20000'}
commodity_lis = [] #['手机', '电脑', '鼠标垫', '游艇']
for line in f1:
v1,v2 = line.split()
commodity_dic[v1] = v2
commodity_lis.append(v1)
print("\033[1;35m---------商品信息---------\033[0m")
for i in range(len(commodity_lis)):
print("\033[1;35m{}\t\t{}\t\t{}元".format(i+1, commodity_lis[i],commodity_dic[commodity_lis[i]]))
print("\033[1;35m-----------END-----------\033[0m")
def total():
global total_assets
total_assets = input("\033[1;34m欢迎光临,请输入您的资产总额(如:10000)(单位:元,无需输入!):\033[0m").strip() # 用户总资产
while True:
if total_assets.replace(".", "").isdigit() and float(total_assets) > 0:
print("\033[1;34m欢迎光临!\033[0m")
total_assets = float(total_assets)
break
else:
total_assets = input("\033[1;34m您输入的资产总额有误,请重新输入:\033[0m")
return total_assets
def select():
"""商品选择"""
global dic1
global total_assets
total_assets = total()
dic1 = {}
while True:
commodity_list() #{'手机': '2000', '电脑': '5000', '鼠标垫': '100', '游艇': '20000'}
number = input("\033[1;34m请选择商品序号:(退出:Q/q)\033[0m".strip()) #用户输入商品序号
if number.isdigit() and int(number) in range(1,len(commodity_lis) + 1): #用户输入的序号判断是否满足只有数字组成,并且数字是否在范围内
count = int(input("\033[1;34m请选择商品数量:\033[0m".strip())) #用户选则序号后,再选则购买数量
for k, v in commodity_dic.items():
if commodity_lis[int(number) - 1] == k: #判断用户输入的序号是字典的哪个商品
if count * int(v) <= total_assets: #判断用户选择的商品数量乘以单价是否小于等于用户的总资产
print("\033[1;34m您已选择商品:{},数量:{}\033[0m".format(k, count)) #打印用户购买的商品及数量
total_assets = total_assets - count * int(v) #更新用户资产总值
print("\033[1;34m购买成功!您当前账户余额,还剩余{}元。\033[0m".format(total_assets)) #告诉用户当前资产总值
dic1.setdefault(k,{}) #将用户购买的商品名称存放到dic1中
if not dic1[k]:
dic1[k]["数量"] = count
dic1[k]["价格"] = count * int(v)
else:
count += dic1[k]["数量"]
dic1[k]["数量"] = count
dic1[k]["价格"] = count * int(v)
continue #直接跳出本次循环,开始下一次商品选择
else:
print("\033[1;34m您选择的商品总价{}元,您当前账户余额{}元,请您充值!\033[0m".format(count * int(v), total_assets))#当用户的资产总额不能满足时,告诉用户
top_up = input("\033[1;34m请输入您的充值总额(如:10000)(单位:元,无需输入!):\033[0m").strip()
while True:
if top_up.replace(".", "").isdigit() and float(top_up) > 0:
print("\033[1;34m充值成功!\033[0m")
top_up= float(top_up)
total_assets += top_up
print("\033[1;34m您的账户当前资产总额{}元!\033[0m".format(total_assets))
break
else:
top_up = input("\033[1;34m您输入的资产总额有误,请重新输入:\033[0m")
continue #跳出本次循环,开始新的商品选择
elif number.upper() == "Q": #当用户选择q或者Q时,
break #退出循环
else: #当用户输入的序号不在范围内时,告知用于重新输入
print("\033[1;34m您输入的商品序号不存在,请重新输入!\033[0m")
return dic1
def bill():
"""账单"""
dic1 = select()
print("\033[1;35m-------------------------账单--------------------------\033[0m")
total_value = 0 #商品总价先赋值为0
for q in dic1:
print("\033[1;34m商品:\t{}\t\t采购数量:\t{}\t\t价格:\t{}元\033[0m".format(q, dic1[q]["数量"], dic1[q]["价格"])) #打印账单中的商品、数量、商品总价
total_value += dic1[q]["价格"] #更新商品总价
print(" ")
print("\033[1;34m总 价:{}元\033[0m".format(total_value)) #打印商品总价
print("\033[1;34m账户余额:{}元\033[0m".format(total_assets))#打印用户余额
print("\033[1;35m--------------------------END--------------------------\033[0m")
print("\033[1;34m欢迎下次光临!\033[0m")
def buy():
register()
login()
bill()
buy()
'''