4.2 homework
# 1.
# 写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组
# 例如:[(‘红心’,2), (‘草花’,2), …(‘黑桃’,‘A’)]
def poker(li): l1=[] l2=['A','J','Q','K'] for i in li: for j in range(2,11): l1.append((i,j)) for n in l2: l1.append((i,n)) return l1 print(poker(['红心','草花','黑桃','红心']))
# 2.
# 写函数,传入n个数,返回字典
# {‘max’:最大值,’min’:最小值}
# 例如: min_max(2, 5, 7, 8, 4)
# 返回: {‘max’:8,’min’:2}
def min_max(*args):return {'max':max(args),'min':min(args)} print(min_max(2,5,7,8,4))
# 3.
# 写函数,专门计算图形的面积
# 其中嵌套函数,计算圆的面积,正方形的面积和长方形的面积
# 调用函数area(‘圆形’, 圆半径) 返回圆的面积
# 调用函数area(‘正方形’, 边长) 返回正方形的面积
# 调用函数area(‘长方形’, 长,宽) 返回长方形的面积
from math import pi def area(*args): if args[0] == '正方形': def square(): s=args[1]**2 return s return square() elif args[0] == '长方形': def rectangle(): s=args[1]*args[2] return s return rectangle() elif args[0] == '圆形': def circle(): s = args[1]**2*pi return s return circle() return area print(area('长方形',2,3)) print(area('正方形',4)) print(area('圆形',2))
# 4.
# 写函数,传入一个参数n,返回n的阶乘
# 例如: cal(7)
# 计算7 * 6 * 5 * 4 * 3 * 2 * 1
def cal(n): count=1 for i in range(n,0,-1): count=count*i return count print(cal(3))
# 6 #加username
# 给每个函数写一个记录日志的功能,
# 功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。
# 所需模块:
import time def wrapper(func): def inner(*args,**kwargs): username = input('user:').strip() password=input('password:').strip() with open ('user',encoding='utf-8') as f2: for i in f2: l2 = i.strip().split() if username == l2[0] and password == l2[1]: print('welcome %s' % username) struct_time = time.localtime() time_now = time.strftime('%Y_%m_%d %H:%M:%S', struct_time) with open('logs',encoding='utf-8',mode='a')as f1: f1.write('在%s时,用户%s执行了%s函数\n' % (time_now,username,func.__name__)) ret = func(*args,**kwargs) return ret return inner @wrapper def func1(): time.sleep(0.1) print(555) @wrapper def func2(): time.sleep(0.1) print(666) @wrapper def func3(): time.sleep(0.1) print(777) func1() func2() func3()
# 7、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
user_status = False def login(func): def inner(): global user_status if user_status == False: username=input('user:').strip() password=input('password:').strip() with open('userlist',encoding='utf-8') as f1: for i in f1: li=i.strip().split() if username == li[0] and password == li[1]: print('welcome %s' % username) user_status = True func() else: func() return inner @login def func1(): print(666) @login def func2(): print(777) @login def func3(): print(888) func1() func2() func3()
dic = {'username':None, 'status': False, } def wrapper(func): def inner(*args,**kwargs): if dic['status']: ret = func(*args,**kwargs) return ret else: count=0 while count <3: username=input('username:').strip() password=input('password:').strip() with open('userlist',encoding='utf-8') as f1: for i in f1: l2=i.strip().split() if username==l2[0] and password==l2[1]: print('welcome %s' % username) dic['username']=username dic['status']=True ret = func(*args,**kwargs) return ret else: print('账号或者密码错误,还有%s机会' % (2-count)) count += 1 return inner @wrapper def article(): print('文章') @wrapper def log(): print('日志') article() log()
# 8,在编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码。这个作业之上进行升级操作:
# 设置两套密码,一套为京东账号密码,一套为淘宝账号密码保存在文件中。
# 设置四个函数,分别代表
# 京东首页,京东超市,淘宝首页,淘宝超市。
# 循环打印四个选项:东首页,京东超市,淘宝首页,淘宝超市。
# 供用户选择,用户输入选项后,执行该函数,四个函数都加上认证功能,只要登陆成功一次,在选择其他函数,后续都无需输入用户名和密码。
# 相关提示:用带参数的装饰器。装饰器内部加入判断,验证不同的账户密码。
dic={'username':None, 'status':False, } def login(flag): def wrapper(func): def inner(*args,**kwargs): if dic['status']: ret = func(*args,**kwargs) return ret else: count=0 while count<3: username=input('username:%s' % flag).strip() password=input('password:').strip() with open('tb',encoding='utf-8') as f1: tb_dic=eval(f1.readline()) if username == tb_dic[flag]['username'] and password == tb_dic[flag]['password']: dic['username']=username dic['status']= True ret = func(*args,**kwargs) return ret else: print('您输入的用户或者密码错误,请重新输入,还有%s次机会' % (2-count)) count += 1 return inner return wrapper @login('weixin') def taobao_home(): print('淘宝首页') @login('weixin') def taobao_shop(): print('淘宝超市') @login('royalpay') def jingdong_home(): print('京东首页') @login('royalpay') def jingdong_shop(): print('京东超市') choice_dict ={ 1:taobao_home, 2:taobao_shop, 3:jingdong_home, 4:jingdong_shop, } while True: print('1 淘宝首页\n2 淘宝超市\n3 京东首页\n4 京东超市') choice_num = input('请输入序号:').strip() if choice_num.isdigit(): choice_num = int(choice_num) if 0 <choice_num <= len(choice_dict): choice_dict[choice_num]() else: print('超出序号范围') else: print('您输入包含非法字符,请重新输入')